2016-05-21 4 views
2

Follow-up zu Rust minimal compiled program size.Warum kompiliert Rust ein einfaches Programm 5-10 mal langsamer als gcc/clang?

rustc hello.rs 
> 600 ms 

Warum kompilieren rustc ein einfaches Hallo Welt 5-10 mal langsamer als gcc/Klirren?

Rust verwendet LLVM, daher sollte es auf Augenhöhe mit clang sein. Jedenfalls sprechen wir über ein Programm, das nur drei Zeilen Code hat.

rustc hello.rs -C opt-level=0 -C prefer-dynamic 
> 400 ms 

gcc hello.c 
> 60 ms 

gcc hello.c 
> 110 ms 
+0

Typprüfung und Ausleihprüfung, denke ich. Beachten Sie auch, dass 'println!' Zu einem ziemlich komplexen Code erweitert wird, im Gegensatz zu C 'printf', einem einfachen Funktionsaufruf. – kennytm

+1

@kennytm, 500 ms zum Eintippen einer Codezeile? – exebook

+1

Sehen Sie [diese] (https://www.reddit.com/r/rust/comments/2uxt46/rust_vs_c_inc_compile_speed/) Diskussion und werfen Sie einen Blick auf diese [Kompilierungszeiten] (https://rudvanasseldonk.com/2014/10/20/Schreiben-a-Pfad-Tracer-in-Rost-Teil-7-Schlussfolgerung) eines C++ - Programms, das nach Rust portiert wurde. – malbarbo

Antwort

16

Zunächst einmal, ich glaube nicht, dass es sehr sinnvoll, die Kompilierung von zwei extrem einfachen Programmen zu vergleichen und erwarten, dass das Ergebnis repräsentativ für Übersetzungszeiten zwischen zwei Sprachen allgemeiner sein.

Das heißt, ich erwarte, dass Rust, eine Sprache zu sein, die ein Abstraktionsniveau bietet, das viel höheren Sprachen mit wenig bis keinen Laufzeit-Performance-Kosten viel häufiger ist, für den Kompilierungszeitpunkt in gewissem Maße bezahlen müsste.

Rust Kompilation scheint langsam:

Dieser Auszug aus the Rust FAQ genommen. Warum das?

Code-Übersetzung und Optimierungen. Rust bietet High Level Abstraktionen, die in effizienten Maschinencode kompiliert werden, und diese Übersetzungen brauchen Zeit, um zu laufen, besonders wenn sie optimiert werden.

Aber Rust Compilation Zeit ist nicht so schlecht, wie es scheinen mag, und es gibt Grund zu der Annahme, dass es sich verbessern wird. Beim Vergleich von Projekten ähnlicher Größe zwischen C++ und Rust wird die Kompilierungszeit des gesamten Projekts allgemein als vergleichbar angesehen. Die allgemeine Wahrnehmung, dass die Kompilierung Rust langsam ist, ist zum großen Teil auf die Unterschiede im Kompilierungsmodell zwischen C++ und Rust zurückzuführen: C++ Compilation Unit ist die Datei, während Rust ist die Kiste, bestehend aus vielen Dateien. Daher kann das Ändern einer einzelnen C++ - Datei während Entwicklung viel weniger Neukompilierung als in Rust führen. Es gibt eine große Anstrengung im Gange Refactor den Compiler zu inkrementellen Compilierung einzuführen, die bieten Rust die Kompilierzeit Vorteile von C++ - Modell.

Neben dem Kompilierungsmodell gibt es einige andere Aspekte von Rust's Sprachdesign und Compiler-Implementierung, die Kompilierungszeit Leistung beeinflussen.

Zuerst hat Rust ein mäßig komplexes System und muss eine nicht zu vernachlässigende Menge an Kompilierzeit verbringen, die die Einschränkungen durchsetzt, die Rust während der Laufzeit sicher machen .

Zweitens leidet der Rust-Compiler unter den langjährigen technischen Schulden, und erzeugt vor allem schlechte Qualität LLVM IR, die LLVM Zeit verbringen muss "Fixing". Es gibt Hoffnung, dass zukünftige MIR-basierte Optimierung und Übersetzungsdurchläufe die Last erleichtern werden, die der Rust-Compiler auf LLVM setzt.

Drittens ist Rust die Nutzung von LLVM für die Codegenerierung ein zweischneidiges Schwert: Während es Rust ermöglicht Weltklasse-Leistung zur Laufzeit haben, ist LLVM ein großer Rahmen, die nicht auf Kompilierung- Leistung konzentriert, vor allem bei schlechten Eingängen.

Schließlich, während Rust's bevorzugte Strategie der Monomorphisierung Generika (ala C++) produziert schnellen Code, fordert es, dass deutlich mehr Code generiert werden als andere Übersetzungsstrategien. Rust-Programmierer können Trait-Objekte verwenden, um diesen Code-Bloat zu vertauschen, indem stattdessen dynamischer -Versand verwendet wird.

Verwandte Themen