Multithreading-Benchmark: Haskell schlägt Java und Python
Seite 2: Testumgebung
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).
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 |