Frage

Vor kurzem las ich eine Diskussion darüber, ob verwalteten Sprachen sind langsamer (oder schneller) als Muttersprache (insbesondere C # vs C ++). Eine Person, die zur Diskussion beigetragen, sagte, dass die JIT-Compiler von verwalteten Sprachen wären in der Lage sein, Referenzen zu machen Optimierungen in Bezug auf die einfach nicht möglich in Sprachen, die Zeiger verwenden.

Was ich möchte, ist wissen, welche Art von Optimierungen, die auf Referenzen möglich sind und nicht auf Zeiger?

Beachten Sie, dass die Diskussion war über die Ausführungsgeschwindigkeit, nicht die Speichernutzung.

War es hilfreich?

Lösung

Es gibt einige Vorteile von JIT-Kompilierung erwähnt in Wikipedia:

  

JIT-Code im Allgemeinen bietet weit bessere Leistung als Dolmetscher. Darüber hinaus kann es in einigen oder vielen Fällen bieten eine bessere Leistung als statische Kompilierung, da viele Optimierungen nur möglich zur Laufzeit sind:

     
      
  1. Die Zusammenstellung kann die gezielte CPU und Betriebssystem-Modell optimiert werden, wenn die Anwendung ausgeführt wird. Zum Beispiel kann JIT SSE2 CPU-Anweisungen wählen, wenn es feststellt, dass die CPU unterstützt werden. Mit einem statischen Compiler muss man zwei Versionen des Codes schreiben, möglicherweise Inline-Montage verwendet wird.
  2.   
  3. Das System ist in der Lage Statistiken darüber zu sammeln, wie das Programm in der Umgebung tatsächlich läuft es in ist, und es kann für eine optimale Leistung neu ordnen und neu kompilieren. Allerdings können einige statische Compiler auch Profilinformationen als Eingabe.
  4.   
  5. Das System kann global Code-Optimierungen (z inlining von Bibliotheksfunktionen) tun, ohne die Vorteile der dynamischen Verknüpfung zu verlieren und ohne die Gemeinkosten inhärent statische Compiler und Linker. Insbesondere dann, wenn globale Inline-Ersetzungen zu tun, ein statischer Compiler muss Laufzeitprüfungen einsetzen und sicherstellen, dass ein virtueller Aufruf, wenn die tatsächliche Klasse des Objekts auftreten würde die inlined Methode überschreibt.
  6.   
  7. Das ist zwar möglich, mit statisch Müll gesammelt Sprachen übersetzt, kann ein Bytecode-System einfachen Speicher für eine bessere Cache-Nutzung neu anordnen.
  8.   

kann ich nicht an etwas denke, direkt auf die Verwendung von Referenzen anstelle von Zeigern verwendet.

Andere Tipps

In C ++ gibt es zwei Vorteile von Verweisen auf Optimierungsaspekte bezogen werden:

  1. Eine Referenz konstant ist (bezieht sich auf die gleiche Variable für seine gesamte Lebensdauer)

    Aus diesem Grunde ist es einfacher für die Compiler zu schließen, die Namen zu den gleichen zugrunde liegenden Variablen beziehen - also Optimierungsmöglichkeiten zu schaffen. Es gibt keine Garantie dafür, dass der Compiler mit Referenzen besser machen, aber es könnte ...

  2. Ein Verweis auf etwas verweisen wird angenommen (es gibt keine Null-Referenz)

    eine Referenz, die „bezieht sich auf nichts“ (äquivalent zu dem NULL-Zeiger) erstellt werden, aber dies ist nicht so einfach wie ein NULL-Zeiger erzeugt wird. Da diese von der Überprüfung der Referenz für NULL verzichtet werden.

Doch keine dieser Vorteile tragen über direkt verwalteten Sprachen, so sehe ich nicht die Relevanz, dass im Rahmen des Diskussionsthema.

Im Allgemeinen spricht, Referenzen machen es möglich, aus verschiedenen Orten auf das gleiche Objekt zu verweisen.

A 'Pointer' ist der Name eines Mechanismus Referenzen zu implementieren. C ++, Pascal, C ... haben Zeiger, C ++ bietet einen anderen Mechanismus (mit etwas anderen Anwendungsfällen) genannt ‚Reference‘, aber im Wesentlichen sind dies alle Implementierungen der allgemeinen Referenzierung Konzept.

Es gibt also keinen Grund, warum Referenzen per Definition sind schneller / langsamer als Zeiger.

Der wirkliche Unterschied ist ein JIT oder einen klassischen ‚vorne‘ Compiler in Verwendung: der JIT können Daten berücksichtigen, die für die vorne Compiler nicht verfügbar sind. Es hat nichts mit der Umsetzung des Konzepts ‚Referenz‘ zu tun.

Andere Antworten sind richtig.

Ich mag hinzufügen, nur dass jede Optimierung nicht pfeift Unterschied machen, wenn es in Code ist, wo der Programmzähler, wie in engen Schleifen tatsächlich viel Zeit damit verbringt, die keine Funktionsaufrufe (wie zB den Vergleich Strings) enthalten.

Eine Objektreferenz in einem verwalteten Rahmen ist sehr verschieden von einer bestandenen Referenz in C ++. Um zu verstehen, was sie besonders macht, sich vorstellen, wie das folgende Szenario behandelt werden würde, auf der Maschinenebene, ohne Garbage Collection Objektreferenzen: Methode „Foo“ gibt eine Zeichenfolge, die in verschiedenen Sammlungen gespeichert und an verschiedene Teile des Codes übergeben. Sobald nichts die Zeichenfolge nicht mehr benötigt, soll es möglich sein, die gesamten Speicher bei der Speicherung von früher zurückzugewinnen, aber es ist unklar, welcher Teil des Codes wird die letzte sein, um die Zeichenfolge zu verwenden.

In einem nicht-GC-System, entweder jede Sammlung braucht seine eigene Kopie des Strings haben, sonst muss etwas enthält einen Zeiger auf ein gemeinsames Objekt halten, die die Zeichen in der Zeichenfolge enthält. Im letzteren Fall muss das gemeinsame Objekt weiß irgendwie, wenn der letzte Zeiger darauf eliminiert wird. Es gibt eine Vielzahl von Möglichkeiten, dies gehandhabt werden kann, sondern ein wesentlicher gemeinsamer Aspekt aller von ihnen ist, dass gemeinsam genutzte Objekte müssen benachrichtigt werden, wenn Hinweise auf sie kopiert oder zerstört werden. Diese Mitteilung erfordert Arbeit.

In einem GC-System hingegen sind Programme mit Metadaten eingerichtet zu sagen, welche Register oder Teile eines Stapelrahmen werden zu einem bestimmten Zeitpunkt verwendet werden verwurzelte Objektreferenzen zu halten. Wenn ein Müllsammelzyklus auftritt, wird der Garbage Collector haben diese Daten zu analysieren, zu identifizieren und alle Live-Objekte zu erhalten, und alles andere atomisieren. Zu allen anderen Zeiten jedoch kann der Prozessor kopieren, ersetzen, Shuffle oder zerstören Referenzen in einem beliebigen Muster oder eine Sequenz es mag, ohne mitzuteilen, die beteiligt eines der Objekte. Beachten Sie, dass, wenn die Maus-Verwendung-Benachrichtigungen in einem Multi-Prozessor-System, wenn verschiedene Threads kopieren könnten oder zerstören, Verweise auf das gleiche Objekt, wird Synchronisationscode erforderlich sein, um die notwendige Meldung Thread-sicher zu machen. Im Gegensatz dazu in einem GC-System, kann jeder Prozessor Referenzvariablen jederzeit ändern, ohne dass seine Aktionen mit einem anderen Prozessor synchronisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top