2009-04-04 8 views
4

Warum zur Verwendung trivial mathematische Probleme bestehen Menschen tun, wie Zahlen in der Fibonacci-Folge für Sprache Benchmarks zu finden? Werden diese nicht für relativistische Geschwindigkeiten optimiert? Ist das nicht die Hauptlast der Engpässe in der Regel in I/O, System-API-Aufrufe, Operationen an Strings und Strukturen, Verarbeitung großer Datenmengen, abstrakte objektorientierte Sachen, etc?Trivial mathematische Probleme wie Sprache Benchmarks

+0

Hängt davon ab, was Sie Benchmarking sind –

+0

"abstrakte objektorientierte Sachen" sollte keinen Einfluss auf die Leistung haben, oder Sie tun etwas falsch. – Svante

Antwort

5

Es ist ein Rückfall in die alten Zeiten, als die Compiler-Technologie für das, was wir jetzt als Grundrechenart bezeichnen würden, sich immer noch schnell entwickelte.

Jetzt, Compiler-Entwicklung ist mehr auf die Ausnutzung neuer Anweisungen für Nischen-Operationen, 64-Bit-Mathematik, und so weiter konzentriert.

Micro-Benchmarks wie die von Ihnen erwähnten waren hilfreich, wenn Sie die Effizienz des Hotspot-Compilers beim Start von Java und die Effizienz von .NET im Vergleich zu C/C++ evaluieren.

Ihr Vorschlag, dass E/A- und Systemaufrufe wahrscheinlich Engpässe sind, ist korrekt, zumindest für einige Probleme. Aber ich habe bemerkt, dass Sie String-Operationen vorgeschlagen haben. Der irrelevante Mikro-Benchmark einer Person ist die kritische Leistungsmetrik einer anderen Person.

EDIT: ps, ich erinnere mich auch an die Verwendung von Linpack und andere Mikro-Benchmarks, um Versionen der JVM zu vergleichen und Anbieter der JVM zu vergleichen. Von v4 bis v5 gab es einen großen Sprung in perf, ich denke, der JIT-Compiler wurde effektiver. Auch IBMs JVM war zu dieser Zeit auf Windows-x86 weit voraus.

2

Ich würde denken, dass ein einfacher, gut etablierter Algorithmus die Möglichkeit ausschließen würde, dass der Benchmark (ob aus Ignoranz oder Bosheit) voreingenommen ist, um eine Sprache zu bevorzugen. Es ist sehr schwierig, ein komplexes Programm in zwei verschiedenen Sprachen genau gleich zu schreiben. Das Testen von etwas wie der Effizienz einer Multithread-Anwendung in C# vs java würde zum Beispiel Entwickler mit Multithread-Entwicklung in beiden Sprachen erfordern, und es gäbe immer noch Fragen, ob die Benchmark-App den allgemeinen Fall richtig darstellt oder ob sie falsch darstellt ein Spezialfall, den nur eine Sprache gut beherrscht.

3

Wenn Sie die Sprache/Compiler benchmarken möchten, sind diese "mathematischen Probleme" gute Indikatoren für die "bare Geschwindigkeit" des generierten Codes. Entweder sie verwenden die iterative Lösung, die eine enge Schleife ist und angibt, wie gut der Compiler die Anweisungen an den Prozessor schicken kann, oder sie verwenden die rekursive Lösung, die angibt, wie sie rekursive Aufrufe kurzer Funktionen behandelt (Inlining, Tail-Recursion) etc.) (obwohl dafür auch die Ackermann-Funktion verwendet wird).

Normalerweise enthält die Benchmark-Suite für die Sprache Tests, die auch andere Teile benchmarken - z. Gzip-Komprimierung, Textsuche, Objekterstellung, virtueller Funktionsaufruf, Exception Throw/Catch-Benchmarks.

Die anderen Dinge, die Sie haben bemerkt, syscalls und IO sind in der Regel nicht enthalten, da

  • syscalls in der Tat ist nicht so langsam - Anwendungen verbringen nicht signifikant porion die Zeit im Kernel, mit Ausnahme für die Prüfung auf sich gezielt oder wenn etwas mit dem Programm

  • syscall und IO Leistung nicht von der Sprache abhängig, sondern von dem O & Hardware

  • ernsthaft falsch
1

Damals, als das Sieb von Eratosthanes ein beliebter Benchmark für C-Compiler war, dachte ich, es wäre lustig, wenn einer der Compiler-Autoren den Sieb-Code erkennen und durch eine vorberechnete Suche ersetzen würde.

+0

Es ist ziemlich üblich für C-Compiler, raffinierte Optimierungstricks zu machen, wenn sie naive Fibonacci-Generatoren entdecken. Aber ich denke, das braucht weniger Speicher als ein Prime-Tisch :) – ephemient