Warum hat Java eine bessere Leistung als andere interpretierte Sprachen? [geschlossen]

8

Warum hat Java im Vergleich zu anderen interpretierten Sprachen wie Python eine viel bessere Leistung? Ich weiß, dass das wahrscheinlich etwas damit zu tun hat, dass es im Voraus kompiliert wurde, aber was ist mit Nebenläufigkeit?

Wie kann die JVM mit konkurrierenden Programmen so viel besser arbeiten, während interpretierte Sprachen sich mit Dingen wie der globalen Interpretersperrung usw. befassen müssen, die die Dinge wirklich verlangsamen?

    
Tarighat 10.06.2013, 20:37
quelle

2 Antworten

11

Das ist eine wirklich interessante Frage, aber ich bin mir nicht sicher, ob es eine einfache Antwort gibt. JVMs verwenden heutzutage eine Reihe von sehr aggressiven Optimierungen, um die Leistung zu verbessern. Hier sind ein paar:

  • Dynamische Kompilierung: Die meisten guten JVMs können den Bytecode dynamisch direkt in Maschinencode kompilieren, der dann mit nativen Geschwindigkeiten ausgeführt wird.
  • Polymorphes Inline-Caching: Viele JVMs verwenden Inline-Caching , um die Leistung der Methodenverteilung zu verbessern Erinnern, welche Funktionen in der Vergangenheit aufgerufen wurden.
  • Statische Typisierung: Da Java statisch typisiert ist, müssen Bytecode-Anweisungen selten eine teure Introspektion für den Typ eines Objekts durchführen, um zu bestimmen, wie eine Operation an ihm ausgeführt wird. Feldoffsets können statisch berechnet werden, und Methodenindizes in einer virtuellen Funktionstabelle können ebenfalls vorberechnet werden. Vergleichen Sie dies mit Sprachen wie JavaScript, die keine statische Typisierung haben und viel schwieriger zu interpretieren sind.
  • Garbage collection: Der JVM-Garbage Collector ist für die effiziente Zuweisung und Freigabe von Objekten optimiert. Es verwendet eine Kombination aus Mark-and-Sweep- und Stop-and-Copy-Techniken, um die meisten Zuweisungen wirklich schnell zu machen und die schnelle Wiederherstellung von viel Speicherplatz zu erleichtern.
  • Bekannte Engpasspunkte: Anstatt eine riesige VM-Sperre zu verwenden, fügen einige JVM-Implementierungen automatisch zusätzlichen Code in jeden kompilierten / interpretierten Code ein, um sich regelmäßig bei der VM anzumelden und festzustellen, ob sie weiter ausgeführt werden kann. Auf diese Weise kann die JVM die Garbage Collection in nur wenigen Threads durchführen, während die anderen Threads ausgeführt werden. Wenn es eine Stop-the-World-Operation ausführen muss, tritt es nur auf, wenn die Threads bestimmte Punkte erreichen, was bedeutet, dass einfache Operationen nicht ständig mit dem VM-Status übereinstimmen müssen.

Es gibt viele, viele weitere Optimierungen, die mir wahrscheinlich nicht bewusst sind, aber ich hoffe, dass dies Ihnen hilft, auf eine Antwort zu kommen!

    
templatetypedef 10.06.2013, 20:41
quelle
3

Java-Code hat während der Kompilierung fast keine Optimierung.

Der Laufzeit-JIT übernimmt den Großteil der Kompilierung.

Was bei Java anders sein kann, ist, dass es relativ schlecht mit minimalen Nebenwirkungen ist. Dies macht den Code einfacher zu optimieren.

  

Während interpretierte Sprachen sich mit Dingen wie der globalen Interpretersperrung usw. befassen müssen, die Dinge wirklich verlangsamen?

Dies ist ein Implementierungsproblem. Java wurde von Anfang an mit Multi-Threading-Unterstützung entwickelt. Ich vermute, dass Python für Scripting und schnelle Entwicklungszyklen entwickelt wurde, was viel besser ist.

    
Peter Lawrey 10.06.2013 20:39
quelle

Tags und Links