Grundsätzlich wäre nach der Byte-Code kompiliert und geladen wird, es sollte immer mindestens so schnell wie das Original AST-Interpreter interpretiert werden. Einige Codes profitieren von großen Beschleunigungen, dies ist normalerweise Code mit vielen skalaren Operationen und Schleifen, wo die meiste Zeit in R-Interpretation verbracht wird (Ich habe Beispiele mit 10-facher Beschleunigung gesehen, aber willkürliche Mikro-Benchmarks könnten dies bei Bedarf aufblasen). Ein Teil des Codes wird mit der gleichen Geschwindigkeit laufen, dies ist in der Regel gut vektorisiert und verbraucht daher fast keine Zeit für die Interpretation. Jetzt kann die Kompilierung selbst langsam sein. Daher kompiliert der Just-in-Time-Compiler jetzt keine Funktionen, wenn er rät, dass er sich nicht auszahlt (und die Heuristiken ändern sich im Laufe der Zeit, dies ist bereits in 3.4.x). Die Heuristiken erraten es nicht immer richtig, daher kann es Situationen geben, in denen sich die Kompilation nicht auszahlt. Typische problematische Muster sind Codegenerierung, Codemodifizierung und Manipulation von Bindungen von Umgebungen, die in Schliessungen erfasst sind.
Pakete können zum Installationszeitpunkt bytekompiliert werden, so dass die Kompilierungskosten (wiederholt) zur Laufzeit nicht bezahlt werden, zumindest für Code, der im Voraus bekannt ist. Dies ist jetzt der Standard in der Entwicklungsversion von R. Während das Laden von kompiliertem Code viel schneller ist als das Kompilieren, kann in manchen Situationen sogar Code geladen werden, der nicht ausgeführt wird, so dass es tatsächlich einen Overhead geben kann, aber insgesamt Vorkompilierung ist vorteilhaft. In letzter Zeit wurden einige Parameter des GC eingestellt, um die Kosten des Ladens von Code zu reduzieren, der nicht ausgeführt wird.
Meine Empfehlung für Paketexperten wäre die Verwendung der Standardwerte (die Just-in-Time-Kompilierung ist jetzt standardmäßig in den freigegebenen Versionen aktiviert, die Bytekompilierung zur Paketinstallationszeit ist jetzt in der Entwicklungsversion aktiviert). Wenn Sie ein Beispiel finden, in dem der Bytecode-Compiler nicht gut funktioniert, reichen Sie bitte einen Fehlerbericht ein (ich habe in früheren Versionen auch einen Fall gesehen, der rpart
betrifft). Ich würde gegen Code-Generierung und Code-Manipulation und vor allem in Hot-Loops empfehlen. Dies umfasst das Definieren von Schließungen, das Löschen und Einfügen von Bindungen in Umgebungen, die von Schließungen erfasst werden. Auf keinen Fall sollte man eval(parse(text=
in heißen Schleifen machen (und das war schon ohne Byte-Kompilierung schlecht). Es ist immer besser, Zweige zu verwenden, als dynamisch neue Verschlüsse (ohne Zweige) zu generieren. Außerdem ist es besser, Code mit Schleifen zu schreiben, als Code mit riesigen Ausdrücken (ohne Schleifen) dynamisch zu generieren. Mit dem Byte-Code-Compiler ist es jetzt oft ok, Loops zu schreiben, die auf Skalaren in R laufen (die Performance wird nicht so schlecht wie vorher sein, also könnte man öfter wegkommen, ohne zu C für die Performance-kritischen Teile zu wechseln) .
Ich bin mir nicht sicher über Performance-Hits (andere als erste Compilations (und vielleicht erhöhte Speicherauslastung)), aber die "Hinweis: keine sichtbare Bindung" Nachrichten können oft für einen Neuling überwältigend sein (z. B. wenn ggplot2) Tab-Complete (zumindest sind sie für mich) – mweylandt
Hallo mweylandt. Weißt du zufällig, was diese Fehlermassage bedeutet? –
Ich habe 'ByteCompile: true' in die DESCRIPTION-Datei meiner Pakete gesetzt, als ich neue Versionen erstelle und es scheint in Ordnung zu sein. Ich habe einen kleinen Test "http://www.johnmyleswhite.com/notebook/2012/03/31/julia-ich-liebe-du/kommentar-seite-1/# kommentar-19522" und die Byte kompilierte Version, ' fib2c lief 4x schneller als das normale fib2a. In einigen Fällen ist R sogar ohne Byte-Kompilierung bereits schnell (z. B. stark vektorisierter Code, der C darunter verwendet), und in diesen Fällen gibt es offensichtlich wenig Gelegenheit zur Beschleunigung - es ist hauptsächlich für langsamen R-Code nützlich. –