2012-06-27 5 views
8

Die Sprache Shootout-Benchmarks bei http://benchmarksgame.alioth.debian.org/ zeigen an, dass FPC-Programme etwa 1/50th des Speichers verwenden, die vergleichbare Programme mit g ++ verwenden. Befürworten diese Benchmarks unbeabsichtigt fpc oder stimmt es wirklich, dass FPC dieses viel besser als g ++ ist? Ich habe diese Benchmarks immer als eine Sammlung von anständigen Mikro-Benchmarks betrachtet, daher bin ich über diese Ergebnisse überrascht, da ein Faktor von 50 Mal ziemlich bedeutend ist.Verwendet Freepascal wirklich * far * weniger Speicher als gcc

Referenzen:

http://benchmarksgame.alioth.debian.org/u32/pascal.php http://benchmarksgame.alioth.debian.org/u64q/pascal.html

Edit: Dies ist immer noch interessanter, da this Seite behauptet, dass nur 8 KB für einige der Programme verwendet PASCAL, die

erstaunlich niedrig scheint
+0

Eine der häufigsten Bedeutungen von Voreingenommenheit ist Vorurteil - machen Sie eine Anklage oder stellen Sie eine Frage? Statt "voreingenommen" ist es immer möglich, dass etwas falsch mit der Art und Weise, wie der FPC-Programmspeicher verwendet wird, gemessen wird. Haben Sie [wie diese Messungen durchgeführt werden] (http://shootout.alioth.debian.org/help.php#memory) angeschaut? – igouy

+3

@igoguy Ich denke, dies als etwas anderes zu interpretieren, als zu versuchen, die wild disparaten Speicherzahlen zu verstehen, ist eine Strecke. Es ist eine völlig vernünftige Art, diese Frage zu stellen. –

+0

@Dave Newton - Es ist leicht zu fragen, warum so ein großer Unterschied im Speicherverbrauch gezeigt wird, ohne Voreingenommenheit. Zum Beispiel, lassen Sie jede Erwähnung von Bias einfach weg und fragen Sie - "Ist es wirklich wahr, dass FPC ist so viel besser als g ++?" – igouy

Antwort

11

Beachten Sie, dass die Startzeit ist IIRC ein weiterer Benchmark, wo FPC Spitzen

ich die Antwort denken muss in erster Linie in der Tatsache zu suchen, daß Free Pascal statisch Programme standardmäßig verknüpft, die Vermeidung libc und andere Hilfsbibliotheken

Dies hat mehrere Konsequenzen:

  • Für die einfachen Programme, die gebenchmarkt werden, sind FPC Programme statisch nur das eigene RTL mit (keine statischen Kopie von libc) und keinen dynamischen Verbindungs-Overhead (sowohl in der Zeit als auch im Speicher). Einschließlich der Zuordnung geteilter Glibc-Segmente (ist das so?), Die fälschlicherweise für die Verwendung des Anwendungsspeichers gehalten werden.
  • libc möglicherweise nicht benötigte, aber beteiligten Initialisierungen, die FPC nicht für diese einfachen Programme tun. (wie zoneinfo initialisieren)
  • da FPC einen völlig unabhängigen Speichermanager verwendet, könnte der Anfangsblock des Heap-Unterzuweisers eine andere Größe haben. Möglicherweise sind FPCs systematisch kleiner.
  • Für Gewinde, die Größe des Stapels der neuen Threads könnte verschiedene Unterschiede (Größe und vielleicht die Tatsache, wenn es (teilweise) nur eine Reservierung oder zugesicherten Speicher, oder was auch immer die * nichts-äquivalent das ist) verursacht

Alles in allem denke ich, dieses beobachtete Verhalten ist weniger über FPC, und mehr über den Mangel an Variation zwischen den anderen Benchmarked-Entwicklungssystemen. FPC hebt sich nur dadurch hervor, dass fast alles andere auf der gcc/glibc-Technologie basiert (entweder weil es sich um ein direktes gcc-Derivat handelt oder weil ihre VM/Interpreter auf gcc aufgebaut sind) und somit alle libc's behandeln. FPC, die anders sind, hebt nur die schlechte Skalierung (lib) gegenüber einfachen Programmen hervor. (*)

Die Schießerei wahrscheinlich könnte in dem Sinne sein vorbelastet, dass entweder geteilt Adresse Raum eher gezählt als tatsächlich privates Bytes verwendet wird, oder weil es nicht genug, um zwischen privatem Bytes von den suballocator und privatem Bytes zugewiesen differenziert tatsächlich von dem Prozess verwendet. Es würde wahrscheinlich einen libc/libmalloc core devel erfordern, um dies zu klären, und da die Schießerei Open Source ist, ist die Frage offen, ob Sie eine bessere Messung anbieten können.

Entweder das oder es ist etwas grundsätzlich falsch mit (g) libc. (Ich bin kein Experte dafür). Eine mögliche Lösung, um relevantere Informationen zu erhalten, wäre der Benchmark unter FreeBSD oder ein Linux mit uclibc. Kurz gesagt, alles andere als glibc.

Wie Igoy's Post-Zustände, erhält FPC beim Verknüpfen mit libc die (schlechten) Eigenschaften der anderen Entwicklungssysteme.Dies ist ein weiterer Indikator dafür, dass die Frage sein sollte „warum glibc Sie mit Binärdateien ausführen schlecht in der Schießerei Speicher-Benchmark“ statt „warum FPC gut in der Schießerei Benchmark“

Beachten Sie, dass FPC vermieden libc ursprünglich wegen Kompatibilitätsprobleme und nicht Leistung oder Dateigröße.

Also zu allen, die davon ausgehen, ist dies ein Glücksfall zur Messung der Speichernutzung von FPC, jemals in Betracht gezogen, es ist ein Problem mit glibc Speicher verwenden oder die Messung davon? Oder besser gesagt, dass die hohe glibc-Nummer ist falsch, und nicht die niedrige FPC Zahl ....

.... Ein FPC-Entwickler ....

(*) und bevor Sie können sagen, es ist nur entwickelt, um für "ansehnliche" Anwendungen effizient zu sein, denken Sie daran, dass die Unix Philosophie über die Verkettung kleiner Tools zusammen ist und viele Unix-Prozesse kurzlebig gelebt werden.

+0

>> bei der Verknüpfung mit libc << (Zwecks Bequemlichkeit werde ich nur auf die vom Gnome-Systemmonitor angezeigte Speicherbelegung für den Prozess verweisen.) Für das single-thread mandelbrot Free Pascal # 3 Programm [28KiB], für das gleiche Programm kompiliert mit "uses cthreads;" [300KiB] – igouy

3

Ja, es ist wirklich wahr, dass das Unix-Dienstprogramm top berichtet, dass diese Pascal-Programme verwenden so viel Speicher, und diese C++ - Programme verwenden so viel Speicher.

Zum Beispiel auf x64, während die Free Pascal n-body program ausgeführt wird und während der C++ n-body program ausgeführt wird, oben meldet diese Messungen -

VIRT  RES  SHR 
608   4   0 FPC 
7208  420  332 C++ 

die Speicherverwendung oben Berichte für den Free Pascal Programme istthe memory use that the benchmarks game reports für die Free Pascal-Programme.


Schauen Sie sich nun, dass x64 quad-core comparison

Wir zwei verschiedene Fälle sehen:

  1. Sowohl die Pascal und C++ Programme verwenden, um mehrere MBs und die Speichernutzung ist sehr ähnlich, unterscheiden sich um weniger als ~ 2x. Wenn zusätzlicher Speicher zugeordnet ist, um die Aufgabe zu lösen, gibt es keinen großen Unterschied zwischen den Programmen.

  2. Die C++ - Programme verwendet einige hundert KB und das Pascal-Programm verwendet eine einige KB. Wenn zusätzlicher Speicher nicht zum Lösen der Aufgabe zugewiesen wird, verwenden die Pascal-Programme ein paar hundert KB weniger.


Die Frage stellt zwei Alternativen, aber es gibt in der Regel eine dritte Alternative - Habe ich falsch verstanden, was los ist?

Die Tatsache, dass ein C++ mandel Programm 4000x mehr Speicher als ein Pascal mandel Programm war zu viel verwenden könnte für die OP zu glauben, es schien unmöglich, auf den OP - aber es gibt eine einfache genug Erklärung, Zeit/Platz Kompromiss.

Die C++ program is multi threaded, geschrieben, um Multi-Core zu verwenden; aber die Pascal program is single threaded, geschrieben, um Single-Core zu verwenden.

Die Speicherverwendung eines Pascal multi threaded mandelbrot program ist dem des C++ Multithread-Programms sehr ähnlich.


+0

Ich bin mir nicht sicher, ob ich Ihren Standpunkt verstehe. Ist das ein Versuch zu zeigen, dass es für diesen bestimmten Benchmark nicht 50, sondern nur eine oder zwei Größenordnungen ist? –

+0

Der Punkt ist, dass die Speicherbenutzung ** Top ** -Berechnungen *** die Speicherbenutzung ist, die das Benchmark-Spiel meldet. – igouy

+0

-1 Nicht wirklich eine Antwort auf das vorliegende Problem. – Marcin

Verwandte Themen