Benchmark: Matmul & Monte-Carlo-Integration

Wo Java und C# in punkto Geschwindigkeit und Speicherverbrauch im Vergleich zu den nativen Sprachen stehen, war das Thema in den vergangenen zehn Jahren. Heute, wo beide Sprachen einen ausgereiften und stabilen Eindruck vermitteln, dürfen sie mit anderen Sprachen verglichen werden. Es macht keinen Sinn, eine Programmier-Sprache die ein oder zwei Jahre alt ist, mit jener zu vergleichen die bereits 20, 30, ... Jahre im Einsatz verbracht haben. Die Technologie (Sprache, Compiler, ...) muss über die Jahre reifen.

Anmerkungen

Als erstes möchte ich mich bei Günther Foidl aus dem myCSharp-Forum für seinen Beitrag danken. Er stellte denn Benchmark als Fortran zur verfügung und implementierte die C#-Variante. Diese nutzte ich für den .NET und Mono Benchmark.

Der Benchmark besteht aus einer Matrizenmultiplikation 1000x1000 und einer Monte-Carlo-Integration. Die Performance ließe sich über Thread's (parallel computing) noch erheblich steigern, was nicht das angestrebte Ziel war. Eine Auslagerung, mit OpenCL 1.0, in Richtung der Grafikkarte würde höchstwahrscheinlich alles übertreffen.

Die C++-Varianten sind jeweils mit den höchsten Optimierungsoptionen compiliert. Bei C# sind die Range-Check-Eliminations der .NET-Plattform mit berücksichtigt worden, was einen entscheidenden Vorteil gegenüber der Mono-Plattform bedeuten müsste. Wie sich diese Tests auf der Mono-Plattform unterdrücken lassen weiß ich nicht und habe die .NET-Varainte 1zu1 übernommen. Der Java und C++-Code enthält keinerlei Optimierungsmaßnahmen. Lediglich die Verwendung von malloc und free kahmen bei C++ zum Einsatz, da nur die Typen int und double Verwendung fanden.

Anfangs wollte ich den ICC von Intel noch mit einbeziehen, scheiterte letztendlich an der Installation. Dieser unterstützt SELinux nicht und eine Deaktivierung wollte ich auf meinen Rechner nicht durchführen. Vielleicht äußert sich hier jemand und zeigt den Unterschied von GCC und ICC auf. Dieser ist für nicht kommerzielle Projekte und für die Linux-Plattform kostenlos.

Zum Einsatz kommte:

  • Java SE 1.6
  • GCC 4.4.1
  • VC (Visual Studio 2008 + Updates)
  • JIT compiler version 2.4.2.3
  • LF

Die Implemenationen

Den Soruce-Code habe ich als Tar-Gz-Archive angehängt. (siehe weiter unten)

Das Ergebniss

Der Benchmark verlief weitesgehend wie erwartet. Vom GCC war ich angenehm überrascht. Er ließ den VC (Visual Studio Prof. 2008) in allen Test deutlich hinter sich. Microsoft arbeitet mit Intel eng zusammen, was einen enormen Vorteil bedeutet. Dieser verliert bei der Monte-Carlo-Integration sogar gegen Java. Nur der GCC kann sich hier behaupten Smile

Wie erwartet ist der Altmeister weiter unbesiegt. Mathematische Berechnungen jeglicher Art ist die Stärke von Fortran und belegt seit Jahrzehnten die Nummer 1 in diesem Bereich. Vor dieser Sprache + Konzept kann man sich nur verneigen.

Danksagung

Zum Schluss möchte ich dem Günther Foidl nochmals für seine Code-Stücke danken. Ohne ihn wäre das hier nicht zustande gekommen. Auf mySharp.de finden sich noch weitere Informationen zu diesem Thema.