Programme sind das Mittel zum Einsatz von Rechnern und die Vielfalt an ihnen ist kaum zu überbieten. Je besser Software beschaffen ist desto effizienter fällt die Rechnernutzung aus. Welche Merkmale aber sind es, die die Qualität ausmachen?
Eine Hilfestellung kann der Ressourcenbedarf liefern. Dieser ist nicht nur durch den Umfang der Software charakterisiert, aber ihre Größe ist ein Faktor und an die Betrachtung der Größe eines Programmes ist stets die Frage geknüpft, was man mit der Software machen kann. Kann etwas weggelassen werden um das selbe Ergebnis zu erzielen?
Ein Vergleich des Umfangs verschiedener Softwarepakete kann hilfreich zur Qualitätsbeurteilung sein und soll hier unternommen werden.
Größenvergleich von Software-Paketen
Hier sind die Größen ausgewählter Software-Pakete zusammengestellt. Zur Feststellung der Größe wurde jeweils mit VirtualBox eine virtuelle Maschine erstellt. Die dargestellte Größe ergibt sich mit dem Vergleich der VM-Größe vor und nach Installation der betreffenden Software.
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
Alpine Linux |
- |
145,9 |
145,9 |
3.12.0 x86 64 |
|
Weiterer Benutzer und nano |
2,2 |
148,1 |
- |
||
Ubuntu Server |
- |
4.500 |
4.500 |
20.04 |
|
Ubuntu Core |
- |
260 |
260 |
nur mit Konto bei Ubuntu |
|
RedHat CoreOS |
- |
807 |
807 |
- |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
Ubuntu Desktop |
- |
9.300 |
9.300 |
20.04 |
|
Windows |
- |
12.000 |
12.000 |
10 |
|
Gnome Desktop |
2.650 |
2.800 |
- |
||
Haiku |
- |
697,5 |
697,5 |
R1/beta2 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
VirtualBox |
209,8 |
9.510 |
6.1.8-Ubuntu-amd64 |
||
Docker |
325 |
470,9 |
- |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
NodeJS mit npm |
45,3 |
191,2 |
v12.17.0-linux-x64 |
||
Java Basismodul kompiliert |
45 |
190,9 |
Java 9 |
||
Java 8 JRE |
85,6 |
231,5 |
openjdk8-jre |
||
Hallo Welt java |
49,9 |
195,8 |
jlink modules |
||
php |
76,6 |
230,7 |
7.4.7 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
ffmpeg |
66,4 |
212,3 |
- |
||
ffmpeg Image |
127 |
597,9 |
jrottenberg/ffmpeg |
||
ffmpeg Image |
106,7 |
577,6 |
opencoconut/ffmpeg |
||
web ui für ffmpeg |
2,2 |
274,8 |
winstone und .war-Datei |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
MySQL |
165,8 |
311,7 |
mysql und mysql-client |
||
Derby SQL Server |
5 |
235,9 |
10.15.2 |
||
SQLite |
4,3 |
150,2 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
lighttpd |
8,2 |
154,1 |
1.4.55 |
||
nginx |
4,2 |
150,1 |
1.19.0 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
Tomcat |
10 |
241,5 |
9.0.29, nur lib und bin |
||
Tomcat |
4,8 |
236,3 |
9.0.29, 21 ohne JSP |
||
Jetty |
16,8 |
248,3 |
9.4.30 |
||
Undertow |
3,1 |
234,6 |
core, servlet, wsock |
||
Winstone |
0,3 |
231,8 |
0.9.10 |
||
Winstone Standalone |
60,3 |
206,2 |
0.9.10 |
||
WebBox |
31,7 |
263,2 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
Java HTTP Server |
- |
0,2 |
0,2 |
Modul jdk.httpserver |
|
Mini-Server |
0,02 |
0,22 |
|||
Grizzly |
- |
1,5 |
1,5 |
core, http und http-server |
|
Mini-Server Standalone |
45 |
190,9 |
Nr | Inhalt | Basis | Größe (MB) | Summe (MB) | Anmerkungen |
---|---|---|---|---|---|
Thymeleaf |
- |
0,84 |
- |
3.0.12, nur .jar |
|
Freemarker |
- |
1,7 |
- |
2.3.31, nur .jar |
|
Mustache für Java |
- |
0,12 |
- |
compiler-0.9.10, nur .jar |
|
mustache.min.js |
- |
0,01 |
- |
Anmerkungen
Für das Paket Hallo Welt Java (15) wurde eine Java-Klasse, die nur "Hallo Welt" ausgibt, mit javac
kompiliert und anschließend mit dem in Java 9 eingeführten Programm jlink
zu einem eigenständigen, ohne JRE lauffähigen Linux-Paket gemacht. Hierbei wird die mit Java 9 eingeführte Modularisierung der Java-Plattform genutzt.
Ähnlich wurde bei Winstone (30) und Mini-Server (34) verfahren. Allerdings wurde hier nicht eine einzelne Klasse sondern der Quellcode der gesamten Anwendung kompiliert und mit jlink
in ein eigenständiges, ohne JRE lauffähiges Linux-Paket überführt.
Feststellungen
Bei der Betrachtung des Größenvergleichs ergeben sich eine Reihe von Feststellungen.
- Betriebssysteme
-
Der Unterschied zwischen Alpine Linux und anderen Betriebssystemen ist beträchtlich. Bei der Entscheidung für ein Betriebssystem sollte darauf geachtet werden, ob der Zweck den Einsatz eines anderen Systems erfordert.
- Haiku
-
Ein Betriebssystem mit grafischer Bedienoberfläche, Anwendungsprogrammen und Browser, basierend auf einem modernen Microkernel, das selbst in einer VM pfeilschnell startet, schneller läuft als so manches nativ laufende System und noch nicht einmal 700 MB auf die Waage bringt? Haiku muss man einfach lieben. Pendants von Haiku sind Ubuntu Desktop (9,3 GB), Windows 10 (12 GB) und Alpine/Gnome (2,8 GB). Randnotiz: Der Microkernel von Haiku ist ein Fork von NewOS, dessen Entwickler Travis Geiselbrecht mittlerweile für Google in Seattle an der nächsten Generation von Microkerneln feilt.
- Docker
-
Docker alleine ist bereits mehr als doppelt so groß wie Alpine Linux. Hier könnte noch Raum zum Weglassen gewisser Teile sein.
- Container
-
Der Vergleich eines Linux-Pakets wie etwa des
ffmpeg
-Pakets für Alpine (apk add ffmpeg
) mit denffmpeg
-Containern für Docker zeigt, dass die Docker-Images viel größer ausfallen und bis hin zum Doppelten des Linux-Pakets geraten. - Winstone
-
Es ist bemerkenswert, dass mit Winstone ein nur 300 KB kleiner Servlet Container existiert. Obwohl der Code seit 2007 nicht mehr gepflegt wird läuft er unverändert auch mit aktuellen Web-Apps. Der Quellcode lässt sich fehlerfrei mit einem JDK 14 neu kompilieren und mit
jlink
in eine allein lauffähige App übersetzen. So ist eine Java-Web-App mitsamt Webserver, Servlet Container und Unterstützung von Java Server Pages möglich, die bei einer Größe von 60,3 MB eigenständig ohne JRE auf Linux läuft. - Java und NodeJS
-
Mit der Modularisierung seit Java 9 ist das Basismodul der JRE nur noch etwa so groß wie die auf JavaScript aufsetzenden NodeJS und npm. Allerdings ist NodeJS im Kern lediglich eine in JavaScript geschriebene HTTP-Maschine und erhält erst durch das Paketsystem npm zusätzliche Fähigkeiten. Mit Hinzunahme der Teile, die Java bereits an Bord hat, ist der Ressourcenbedarf von NodeJS größer als der von Java.
- Mini-Server
-
Das Modul
jdk.httpserver
von Java ist für sich genommen ca. 190 KB, der darauf basierende Mini-Server gerade einmal 21 KB klein. Zusammen mit dem in Java 9 eingeführten Modulsystem ist das der Schlankheitsgrad, der Microservices seinen Namen verleiht und die Vorteile von Java wie Robustheit, Objektorientierung, Skalierbarkeit, strenge Typisierung oder Portabilität für moderne Dienste-Architekturen erschließt. Sehr wichtig für die Skalierbarkeit ist, dassjdk.httpserver
auf Java NIO basiert. Vergleichbare auf NIO basierende und 'embeddable' HTTP-Server sind Undertow und Grizzly, die mit 1,5 MB bzw. 3,2 MB das 7- bzw. 15-fache 'auf die Waage' bringen.
Fazit
Bei der Entscheidung für eine Ablaufumgebung sollte deren Ressourcenbedarf nicht unbeachtet bleiben und gefragt werden, was alles weggelassen werden kann, um eine Aufgabe mit Software auszuführen. Nicht selten unnötig ist, Programme mit Funktionen auszustatten, die für eine Aufgabe nicht erforderlich sind oder Programmen Aufgaben zuzuweisen, für die es keinen Grund gibt, sie gemeinsam mit anderen Aufgaben in einem Programm anzulegen. Gegenentwürfe solcher Entwicklungen sind Modularisierung und Microservices.
Hersteller sollten stets transparent und nachvollziehbar machen, was eine Software benötigt und in Fällen, wo sich große Unterschiede zu vergleichbaren Paketen ergeben, zusätzlichen Ressourcenbedarf näher erklären.