x64 vs x86-Performance-Überlegungen .Net
Ich versuche zu verstehen, was die performance-Unterschiede gibt es bei der Ausführung eine native C# /.Net 4.0 app in der x64 vs x86. Ich verstehe die Speicher-überlegungen (x64 Adressierung alle Speicher -, x86-befristet auf 2/4gb), sowie die Tatsache, dass ein x64-app mehr Speicher (alle Zeiger 8 bytes, statt 4 bytes). Soweit ich das beurteilen kann, keines dieser soll Einfluss auf die clock für die Uhr Anweisungen, wie der x64-pipeline ist breit genug, um die breitere Anweisungen.
Ist es zu einem Leistungseinbruch in der Kontextwechsel, aufgrund der größeren Stacks für jeden thread? Was performance-überlegungen fehlen mir in der Bewertung der beiden?
- Hast du gemessen oder ist das ein Gedanken-experiment? Wenn Sie getestet, was waren die Ergebnisse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Joe White hat Ihnen einige gute Gründe, warum Ihre app möglicherweise langsamer. Größere Zeiger (und somit durch die Erweiterung größer Referenzen .NET) wird mehr Platz im Arbeitsspeicher, was bedeutet, weniger von code und Daten passen in den cache.
Gibt es jedoch viele vorteilhafte Gründe, die Sie möglicherweise verwenden möchten x64:
Die AMD64-Aufrufkonvention verwendet wird, standardmäßig in 64 bit und kann durchaus ein wenig schneller als der standard cdecl oder stdcall, mit vielen Argumente werden in Registern übergeben und mit dem XMM-Register für Gleitkomma.
CLR emittieren, Skalare SSE-Anweisungen für den Umgang mit floating-point-Operationen in 64-bit. Im x86-er fällt zurück auf die Verwendung der standard-x87-FP-stack, der ist ein bisschen langsamer, besonders für Dinge wie die Umwandlung zwischen ints und floats.
Mehr registriert bedeutet, dass es viel weniger chance, dass der JIT wird, um verschütten zu Ihnen durch registrieren Druck. Spilling-Register können ziemlich teuer für schnelle inneren Schleifen, vor allem, wenn eine Funktion wird inline und führt zu zusätzlichen register Druck da.
Alle Operationen auf 64-bit-Ganzzahlen können enorm profitieren, indem Sie in der Lage zu passen in ein einziges register, anstatt aufgeteilt in zwei separate Hälften.
Dies kann offensichtlich sein, aber der zusätzliche Speicher Ihres Prozesses zugreifen können, kann sehr nützlich sein, wenn Ihre Anwendung ist speicherintensiv, auch wenn es nicht schlagen, das theoretische limit. Fragmentierung kann dazu führen, dass Sie hit "out of memory" - Bedingungen lange vor erreichen dieser Marke.
RIP-relative addressing in x64 kann in einigen Fällen reduzieren Sie die Größe der eine ausführbare Bild. Obwohl das nicht wirklich direkt auf .NET apps, es kann eine Auswirkung auf den Austausch von DLLs können nicht anders verlegt werden müssen. Ich wäre daran interessiert zu wissen, wenn jemand keine spezifischen Informationen über diese in Bezug auf .NET und managed-Anwendungen.
Abgesehen von diesen, ist die x64-version von der .NET-runtime scheint sich, zumindest in den aktuellen Versionen, mehr Optimierungen, als das x86-äquivalent. Dinge wie inlining und Speicher Ausrichtung kommt viel öfter. In der Tat, es war ein bug, eine Weile zurück, der verhinderte, dass inlining einer Methode, die nahm oder zurückgegebene Wert den Typ an; ich erinnere mich, es fest in x64 und nicht x86-version.
Wirklich, der einzige Weg, du wirst in der Lage sein zu sagen, was ist besser für Ihre app zu tun, profiling und testen, die auf beiden Architekturen und Vergleich realer Ergebnisse. Jedoch, ich persönlich benutze einfach eine Beliebige CPU-soweit möglich und alles zu vermeiden, was naturgemäß von der Architektur abhängig. Dies macht es einfach zu erstellen und bereitstellen, und ist hoffentlich mehr zukunftssicher, wenn die Mehrheit der Nutzer zunächst Wechsel zu x64 ausschließlich.
Eng mit "x64 app mehr Speicher" ist die Tatsache, dass mit einem 64-bit-app, Ihre Lokalität der Referenz ist kleiner (weil alle Ihre Zeiger Größen sind verdoppelt), so erhalten Sie weniger Kilometer von der CPU on-board (ultra-schnell) cache. Sie haben das abrufen von Daten vom system-RAM mehr oft, das ist viel langsamer als der L2 und auch L1 on-chip cache.