Multithreading-Benchmark: Haskell schlägt Java und Python

Seite 2: Testumgebung

Inhaltsverzeichnis

Um sich einen aktuellen Überblick über die Umsetzung von Multithreading-basierten Anwendungen zu verschaffen, führten wir Countdown-Tests auf unterschiedlichen Computerarchitekturen durch (siehe Tabellen). Die Compiler stammen aus offiziellen Quellen: Die Python-Interpreter 11 und 12, die beide über den GIL verfügen, installierten wir über die Paketmanager der Distributionen Gentoo und Manjaro, wobei wir zur Ausführung der einzelnen Python-Module, diese lediglich um eine Main-Methode ergänzen.

Zudem installierten wir auf beiden PCs die Java Runtime-Umgebung (JRE) von Liberica, wobei unter Gentoo die Version 20.0.2 und bei Manjaro die Version 17.0.9 zum Einsatz kam. Aufgrund der plattformunabhängigen Eigenschaft von Java wurden die auf Java laufenden Programme lediglich auf dem Intel-Computer kompiliert. Für die Java-Tests erstellten wir ein Kommandozeilentool mit Picocli, um damit alle drei Testrunden auszuführen. Danach erfolgte die Kompilierung mit dem Maven-Plugins Really-executable-jar, sodass sich das Java-Benchmark-Tool ähnlich wie ein Bash-Skript auf der Konsole ausführen ließ (Abbildung 3).

Das Benchmark-Tool für die Java-Tests zeigt eine Übersicht seiner Funktionen in der Hilfe, zum Beispiel coutdown-test (Abb. 3).

(Bild: Anzela Minosi)

Der Countdown-Test auf der Intel-CPU i7 wird mit acht Threads durchgeführt (Abb. 4)

(Bild: Anzela Minosi)

Zur Kompilierung des Haskell-Benchmark-Tools kam auf beiden PCs Stack zum Einsatz, wobei dem GHC-Compiler (Version 9.6.3) weitere Argumente übergeben wurden, um Multithreading zu aktivieren. Hierfür verwendeten wir die Option -threaded, um das Haskell-Benchmark-Tool mit der Threaded-Laufzeitbibibliothek zu verknüpfen. Zusätzlich optimierte das Argument -O2 das Haskell-Benchmark-Tool weiter, indem es das Tool verkleinerte. Dadurch dass sich die Python-Programme, das Java-Benchmarktool sowie das Haskell-Benchmarktool auf der Konsole aufrufen ließen, konnten wir alle Benchmarks mit nur einem Tool, Hyperfine, durchführen (Abbildung 4). In unserer Umgebung führten wir insgesamt 18 Tests verteilt auf beiden Rechnern aus.

Spezifikation Testcomputer #1: PC mit ATX-Miditower
CPU Intel Core i7 870 @ 2.93GHz (8 Kerne / 16 Threads)
Mainboard Asus P7P55D Pro
Chipsatz Intel P55 Express
RAM 16 GByte
Festplatte 500 GByte Seagate ST3500418AS
Grafik GeForce GT 1030
Audio ASUS XONAR SOUND CARD
Netzwerkkarte Realtek 8112L Gigabit LAN
Router TP-Link TL-MR6500v (10/100 Mbps LAN Ports)
Betriebssystem Gentoo
Kernel 6.4.8-gentoo-x86_64
Desktop-Umgebung Xfce4 4.18
Display Server X Server 1.21
Grafikkartentreiber NVIDIA 535.86.05
Dateisystem Ext4
Monitorauflösung 1920x1080
Python-Interpreter 3.12.1
JRE‍ Liberica 20.0.2
GHC-Compiler‍ 9.6.3
Spezifikation Testcomputer #2: Einplatinenrechner
CPU ARM Cortex-A72 @ 1.5GHz (4 Kerne / 4 Threads)
Raspberry Pi Raspberry Pi 4 Model B
RAM 8 GByte
Festplatte Kingston Canvas Select Mikro-SD-Karte 128 GByte
Grafik VideoCore VI @ 500 MHz (GPU 128 MByte)
Audio Waveshare WM8960
Netzwerkkarte Gigabit LAN
Router TP-Link TL-MR6500v (10/100 Mbps LAN Ports)
Betriebssystem Manjaro
Kernel 6.1.69-1-MANJARO-RPI4 (AARCH64)
Desktop-Umgebung Mate
Display Server X Server 1.21
Grafikkartentreiber MESA 25.2
Dateisystem Ext4
Monitorauflösung 1920x1080
Python-Interpreter 3.11.6
JRE‍ Liberica 17.0.9
GHC-Compiler‍ 9.6.3