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.

Tabelle 1. Ressourcenbedarf von Software: Betriebssysteme ohne grafische Bedienoberfläche
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

1

Alpine Linux

-

145,9

145,9

3.12.0 x86 64

2

Weiterer Benutzer und nano

1

2,2

148,1

-

3

Ubuntu Server

-

4.500

4.500

20.04

4

Ubuntu Core

-

260

260

nur mit Konto bei Ubuntu

5

RedHat CoreOS

-

807

807

-

Tabelle 2. Ressourcenbedarf von Software: Betriebssysteme mit grafischer Bedienoberfläche
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

6

Ubuntu Desktop

-

9.300

9.300

20.04

7

Windows

-

12.000

12.000

10

8

Gnome Desktop

1

2.650

2.800

-

9

Haiku

-

697,5

697,5

R1/beta2

Tabelle 3. Ressourcenbedarf von Software: VMs/Container
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

10

VirtualBox

6

209,8

9.510

6.1.8-Ubuntu-amd64

11

Docker

1

325

470,9

-

Tabelle 4. Ressourcenbedarf von Software: Java, JavaScript, PHP
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

12

NodeJS mit npm

1

45,3

191,2

v12.17.0-linux-x64

13

Java Basismodul kompiliert

1

45

190,9

Java 9

14

Java 8 JRE

1

85,6

231,5

openjdk8-jre

15

Hallo Welt java

1

49,9

195,8

jlink modules

16

php

1, 24

76,6

230,7

7.4.7

Tabelle 5. Ressourcenbedarf von Software: Video-Bearbeitung
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

17

ffmpeg

1

66,4

212,3

-

18

ffmpeg Image

1, 11

127

597,9

jrottenberg/ffmpeg

19

ffmpeg Image

1, 11

106,7

577,6

opencoconut/ffmpeg

20

web ui für ffmpeg

1, 17, 31

2,2

274,8

winstone und .war-Datei

Tabelle 6. Ressourcenbedarf von Software: Datenbanken
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

21

MySQL

1

165,8

311,7

mysql und mysql-client

22

Derby SQL Server

1, 14

5

235,9

10.15.2

23

SQLite

1

4,3

150,2

Tabelle 7. Ressourcenbedarf von Software: HTTP Server
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

24

lighttpd

1

8,2

154,1

1.4.55

25

nginx

1

4,2

150,1

1.19.0

Tabelle 8. Ressourcenbedarf von Software: Servlet Container
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

26

Tomcat

1, 14

10

241,5

9.0.29, nur lib und bin

27

Tomcat

1, 14

4,8

236,3

9.0.29, 21 ohne JSP

28

Jetty

1, 14

16,8

248,3

9.4.30

29

Undertow

1, 14

3,1

234,6

core, servlet, wsock

30

Winstone

1, 14

0,3

231,8

0.9.10

31

Winstone Standalone

1

60,3

206,2

0.9.10

32

WebBox

1, 14

31,7

263,2

Tabelle 9. Ressourcenbedarf von Software: Embedded HTTP Server
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

33

Java HTTP Server

-

0,2

0,2

Modul jdk.httpserver

34

Mini-Server

33

0,02

0,22

35

Grizzly

-

1,5

1,5

core, http und http-server

36

Mini-Server Standalone

1

45

190,9

Tabelle 10. Ressourcenbedarf von Software: Template-Engines
Nr Inhalt Basis Größe (MB) Summe (MB) Anmerkungen

37

Thymeleaf

-

0,84

-

3.0.12, nur .jar

38

Freemarker

-

1,7

-

2.3.31, nur .jar

39

Mustache für Java

-

0,12

-

compiler-0.9.10, nur .jar

40

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.

Bei den Paketen Tomcat (26) und Jetty (28) wurden Beispiele und Dokumentation weggelassen. Bei Tomcat in der Variante (27) wurden zusätzlich Java Server Pages weggelassen.

Für die Pakete Java HTTP Server (33), Mini-Server (34) und Grizzly (35) ist nur der Java-Anteil ihrer Implementierung dargestellt. Hier ist der Vergleich von Java 'embedded' HTTP-Servern für sich genommen interessant, nicht zuletzt auch wegen ihrer Bedeutung für Microservices.

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 den ffmpeg-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, dass jdk.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.