Nach ein paar Tests habe ich ein paar interessante Ergebnisse. Meine Tests drehten sich um den try catch
Block. Wie das OP gezeigt hat, ist die Ausführungszeit dieselbe, wenn Sie diesen Block entfernen. Ich habe das ein wenig weiter eingegrenzt und bin zu dem Schluss gekommen, dass es wegen der counter
Variable in if
Aussage im try
Block ist.
Läßt die redundanten entfernen throw
:
try
{
if (counter== 0) { }
}
catch
{
}
Sie werden die gleichen Ergebnisse mit diesem Code erhalten, wie Sie mit dem ursprünglichen Code tun.
Lets Änderungszähler ein tatsächlicher int Wert sein:
try
{
if (1 == 0) { }
}
catch
{
}
Mit diesem Code, die 64-Bit-Version in der Ausführungszeit von 4 Sekunden bis etwa 1,7 Sekunden reduziert hat. Immer noch das Doppelte der 32-Bit-Version. Aber ich fand das interessant.Leider habe ich nach meiner schnellen Google-Suche keinen Grund gefunden, aber ich werde ein bisschen mehr graben und diese Antwort aktualisieren, wenn ich herausfinden werde, warum das passiert.
Was die verbleibende zweite, dass wir die 64-Bit-Version rasieren möchte, kann ich sehen, dass dies Sie die sum
von i
in Ihrer for
Schleife erhöht wird. Lässt sich dies ändern, so dass sum
nicht seine Grenzen überschreiten:
for (int i = 0; i < int.MaxValue; i++)
{
sum ++;
}
Diese Änderung (zusammen mit der Änderung des try
Block) wird die Ausführungszeit des 64-Bit-Anwendung zu 0,7 Sekunden reduzieren. Meine Argumentation für die 1 Sekunde Unterschied in der Zeit ist aufgrund der künstlichen Art, dass die 64-Bit-Version muss eine int
behandeln, die natürlich 32 Bits ist. In der 32-Bit-Version sind dem Int32 32 Bits zugeordnet (sum
). Wenn sum
über seine Grenzen geht, ist es leicht, diese Tatsache zu bestimmen.
In der 64-Bit-Version sind dem Int32 64 Bits zugeordnet (sum
). Wenn die Summe ihre Grenzen überschreitet, muss ein Mechanismus vorhanden sein, um dies zu erkennen, was zur Verlangsamung führen könnte. Vielleicht dauert sogar der Vorgang des Hinzufügens von sum
& i
länger aufgrund der Zunahme der zugewiesenen redundanten Bits.
Ich theoretisiere hier; Nimm das nicht als Evangelium. Ich dachte nur, ich würde meine Ergebnisse veröffentlichen. Ich bin mir sicher, dass jemand anderes das Problem, das ich gefunden habe, beleuchten kann.
-
aktualisieren
@HansPassant ‚s Antwort darauf hingewiesen, dass die sum += i;
Linie beseitigt werden kann, da es nicht notwendig erachtet wird, was durchaus Sinn macht, sum
ist nicht außerhalb der for
Schleife verwendet wird, . Nachdem er den Wert von sum außerhalb der for-Schleife eingeführt hatte, bemerkten wir, dass die x86-Version genauso langsam war wie die x64-Version. Also habe ich beschlossen, ein bisschen zu testen. Lässt die auf die folgende for-Schleife und den Druck ändern:
int x = 0;
for (int i = 0; i < int.MaxValue; i++)
{
sum += i;
x = sum;
}
counter++;
Console.WriteLine(sw.Elapsed + " " + x);
können Sie sehen, dass ich ein neues int x
eingeführt haben, die den Wert von sum
in der for
Schleife zugewiesen wird. Dieser Wert von x wird nicht auf die Konsole geschrieben. sum
verlässt die for
Schleife nicht. Dies, glaube ich oder nicht, reduziert die Ausführungszeit für x64 auf 0,7 Sekunden. Die x86-Version springt jedoch auf 1,4 Sekunden.
Ihr Computer ist super Genie! für mich dauert es etwa 10 Sekunden jede Wiederholung :(und keinen Unterschied hier. sowohl 32bit und 64bit gibt ziemlich gleiche Ergebnisse. –
@ M.kazem. Ich glaube nicht, dass das möglich ist. Mein Computer ist ein Surface Pro 3 i7 mit U Es ist definitiv kein Kraftpaket. Bist du sicher, dass du es im Release-Modus startest und ohne Debugging startest? BTW habe bisher 4 verschiedene Computer ausprobiert. –
Oh nein nein ich habe es, weil du die Option 'Code optimieren aktiviert hast 'in Lösung Eigenschaften. Jetzt bekomme ich' 1.3s' für 32bit und '3.9s' für 64 bit. –