Warum wird ein C ++ - Code auf einem Computer wesentlich länger ausgeführt als auf einem anderen?

580
Stershic

Der Code ist genau derselbe - ich habe ihn von einem Computer auf einen anderen kopiert. Der Code wird mit g ++ - 4 (4.9.1) kompiliert, das von fink unter OSX auf beiden Computern abgerufen wird, und wird nicht parallel ausgeführt.

Compiler-Optionen sind "-O2", und die Computer machen im Grunde nichts anderes (geringe CPU- und Speicherauslastung). Code ist ein 2400-Zeilen-Forschungscode- Link .

Maschine 1:

  • Ende 2013 MacBook Pro Retina,
  • 2,8 GHz i7-4558U,
  • 16 GB 1600 MHz DDR3,
  • 500 GB Flash-Speicher

Maschine 2:

  • Ende 2013 MacPro Workstation,
  • 3,5 GHz Intel Xeon E5-1650 mit 6 Kernen
  • 32 GB 1867 MHz DDR3
  • 251 GB Flash-Speicher
  • 3 TB externes SATA-Laufwerk

Laufzeit:
Maschine 1: mit einer Leistung von 200 Sekunden, ohne 18 Sekunden.
Maschine 2: (/ Verzeichnis - sollte Flash-Laufwerk sein): mit 2230 Sek. Ohne 2075 Sek.
Maschine 2: (~ Verzeichnis - sollte externes Laufwerk sein): mit 2262 Sek. Ohne 2080 Sek.

Irgendwelche Ideen, wie Sie die Laufzeit auf dem MacPro verbessern können?

0
@Ramhound wurde gesagt, es wäre hier relevanter als StackOverflow. Stershic vor 9 Jahren 0
Diese Frage erscheint äußerst breit. Um die Unterschiede zu verstehen, müssen Sie Folgendes tun. Bestimmen Sie, welcher Teil des Codes am längsten dauert. Sie können diesen Code dann auf beiden Computern schnell ändern. Wenn Sie dabei stecken bleiben, können Sie die Frage auf der richtigen Website stellen. Ramhound vor 9 Jahren 2
@Ramhound Es wurde vorgeschlagen, dass ich Instrumente zum Profilieren meines Codes verwende, und das war mir möglich, aber es ist mir nicht klar, ob / wie das zeigt, welcher Teil des Codes am längsten dauert. Ich frage nicht, weil ich ein Experte bin - ich frage, weil ich nicht und ich möchte lernen. Stershic vor 9 Jahren 0
** Ich kann die Unterschiede zwischen dem i7 und dem E5 nicht einmal erforschen, da ich keine spezifischen Modellnummern habe. ** Ich vermute, dass Ihr Code Single-Threading ist. Da die Burst-Geschwindigkeit des i7 etwa 3,0 GHz beträgt, ist es unwahrscheinlich, dass die Frequenz der CPU, mit der die Erhöhung um 115% eine Ausgabe erzeugt, unwahrscheinlich ist. Ramhound vor 9 Jahren 1
Sie haben das geschafft. Sie geben diese Informationen jedoch nicht an. Sie wissen, wie lange der Code dauert. Welche Funktion verursacht genau die Verzögerung? ** Natürlich ist diese Frage eine Stackoverflow-Frage. ** Ich versuche im Grunde, Ihnen zu sagen, dass Sie die falsche Frage stellen. Ich sollte folgendes hinzufügen. Es wurde Ihnen nicht gesagt, dass dies eine Superuser-Frage war. Der nahe liegende Grund deutete an, dass es sich hier um ein Thema handeln könnte. Ramhound vor 9 Jahren 0
Führen Sie den Code auf der Maschine 2 mit Instrumentierung aus und finden Sie heraus, was so lange dauert. Es sollte völlig offensichtlich sein. David Schwartz vor 9 Jahren 0
@ZippityBrosnan - die Verwendung von Profilierungswerkzeugen scheint sicherlich eine geeignete SO-Frage zu sein user2813274 vor 9 Jahren 0
Vielen Dank für Ihre Hilfe @ Ramhound & David. Es braucht etwas Graben, aber Instrumente sagen nur den prozentualen Anteil der Methoden aus, und es gab einen krassen Unterschied zwischen den beiden. Nun, da es nur eine Methode gibt, bin ich sicher, dass ich es von hier aus herausfinden kann. Vielen Dank! Stershic vor 9 Jahren 0
@ user2813274 - Ich würde zustimmen. Der Grund, warum die ursprüngliche Frage geschlossen wurde, war, dass sie sehr weit gefasst war und die Leute grundsätzlich aufforderte, 2-k-Zeilen Code zu überprüfen. Die Frage wurde nicht aktualisiert, alles war in Kommentaren und Details waren knapp. ** Ich bin nicht schockiert, es war geschlossen, um ehrlich zu sein ** Ramhound vor 9 Jahren 0
@Ramhound Ich habe absolut nicht erwartet, dass jemand den Code überprüft. Ich wollte Vorschläge, wie der Code auf der Erde einen Unterschied in der Größenordnung von Zeit benötigt. "Es sollte nicht" + Ein guter Einsatz von Profilierungswerkzeugen ist die richtige Antwort. Nimm es leicht für einen Anfänger Stershic vor 9 Jahren 0
@ZippityBrosnan - Ich erwarte, dass die Leute Fragen zu Themen stellen. ** Ich sehe nicht, wie die Frage, wie Code zu profilieren ist, eine Superuser-Frage ist. ** Ramhound vor 9 Jahren 0
@Ramhound Ich wusste nicht, dass Sie einen Profilcode _could_ haben könnten. Ist das ein Thema? Falls nicht, geben Sie mir bitte die vorab genehmigte Themenliste für SU. Stershic vor 9 Jahren 0

2 Antworten auf die Frage

1
user2813274

Dies ist eine spekulative Vermutung, aber Ihr Code funktioniert mit der Datenträger- und Datenträger-E / A, und ich gehe davon aus, dass dies Ihr Engpass ist - Sie haben erwähnt, dass er auf dem Computer mit 500 GB Flashspeicher schneller läuft als auf dem mit 250 GB-Flash-Speicher: Dies ist logisch sinnvoll, da Flash-Speicher im Wesentlichen ein Raid-0 von kleineren (32/64 GB) Flash-Speicherchips ist und mehr Chips / Festplatten in einem Raid-0-Array die Leistung erheblich steigern. Ich kenne die bestimmte Marke / das Modell / die Firmware / den Controller des Speichers nicht. Ich vermute jedoch, dass Sie bei einem Datenträger-E / A-Test eine ähnliche Diskrepanz in Bezug auf die Leistung der beiden Maschinen feststellen würden. Ein solcher Leistungstest kann am besten mit XBench durchgeführt werden .

@ Ramhound: Warum würdest du meinen Verweis auf XBench zurücksetzen? Wie aus dieser Antwort hervorgeht, wird der Leistungsunterschied wahrscheinlich durch die HDD-Geschwindigkeit verursacht. Es wird empfohlen, diese Geschwindigkeit zu messen, und ich habe einen Link zu einem Tool hinzugefügt, um dies zu testen. Warum das löschen? agtoever vor 9 Jahren 0
@agtoever - Es ist kompliziert. Mein Fehler Ramhound vor 9 Jahren 0
0
a CVn

Der richtige Weg, sich der Frage zu nähern, "warum dauert dieser Code so lange", ob "long" absolut oder relativ ist, ist die Verwendung eines Werkzeugs, das als Profiler bezeichnet wird.

Grundsätzlich führen Sie das Programm über den Profiler oder mit angehängtem Profiler aus, und der Profiler zeichnet auf, wie viel Zeit das Programm in verschiedenen Funktionen verbringt. Diese Informationen werden Ihnen dann in einer Form präsentiert, mit der Sie die Teile des Programms ermitteln können, die während dieser Ausführung am längsten ausgeführt wurden. Häufig ist es auch möglich, zusätzliche Informationen aus diesem Bericht zu erhalten, z. B. welche Teile des Programms am häufigsten aufgerufen werden, und solche Dinge, die auch auf Bereiche hinweisen können, die einer gewissen Prüfung bedürfen.

Basierend auf diesen Daten ist es in der Regel leicht zu erkennen, welche Teile optimiert werden müssen, damit das Programm schneller abläuft, ohne das Ratespiel, das als "vorzeitige Optimierung" bezeichnet wird, oder sich auf die Einzelheiten bestimmter Hardware zu verlassen.