1 回答

TA貢獻1827條經驗 獲得超4個贊
運行compiler filename實際上仍然運行鏈接器,并且可能將大量標準庫復制到生成的可執行文件中(特別是傷害 D 和 Go,默認情況下它們靜態鏈接它們的語言運行時以獲得更好的兼容性)。
鑒于這個微不足道的 D 你好世界:
import std.stdio;
void main() { writeln("hello world"); }
讓我在我的電腦上向您展示一些時間:
$ time dmd hello.d
real 0m0.204s
user 0m0.177s
sys 0m0.025s
與使用 跳過鏈接步驟相反-c,這意味著“編譯,不鏈接”:
$ time dmd -c hello.d
real 0m0.054s
user 0m0.048s
sys 0m0.006s
將第一次運行的時間減少到大約 1/4——在這個小程序中,將近 3/4 的編譯時間實際上是鏈接。
現在,讓我稍微修改一下程序:
import core.stdc.stdio;
void main() { printf("hello world\n"); }
$ time dmd -c hello.d
real 0m0.017s
user 0m0.015s
sys 0m0.001s
使用 printf 代替 writeln 將其減半!我會回到這個。
而且,為了比較,編譯+鏈接:
$ time dmd hello.d
real 0m0.099s
user 0m0.083s
sys 0m0.014s
這讓我們知道發生了什么:
鏈接器占用了大量時間。使用-c將其從等式中刪除。
解析標準庫也需要花費大量時間。只使用 C 函數而不是 D lib 可以消除這種情況,并提供更多的蘋果對蘋果的外觀。
但是,使用 stdlib 對查看可擴展性很重要。
D(我認為是 Go,但我對它們知之甚少)的目的是減少編譯大中型程序的時間。小程序已經很快 - 等待幾分之一秒(或者在較慢的計算機上等待一兩個,我現在使用的那個有一個很好的 SSD 可以加快速度,在旋轉硬盤上運行相同的命令磁盤大約兩倍的時間!)對于小型構建來說沒什么大不了的。
但是,等待幾分鐘以進行大型構建是一個問題。如果我們可以將其縮短到幾秒鐘,那將是一場重大勝利。
編譯 100,000 行的時間比編譯 10 行的時間更重要。所以初始化時間并不重要。鏈接時間很重要,但編譯器本身并沒有做太多事情(鏈接器是由不同團隊編寫的單獨程序,盡管其他地方也在努力改進它)。
因此,D 構建包括標準庫所花費的時間是令人印象深刻的地方。比 C hello world 慢(因為 C 編譯器對較小的 lib 做的工作較少),但是您已經看到了 C++ hello world 的好處,它每行更慢,并且在每次構建時也往往有更多的工作要做(解析#includes 等)。
一個好的編譯器基準測試會比小程序更希望隔離這些問題并測試可擴展性。如果您正確運行測試以確保公平比較,D在小程序上也做得很好。
- 1 回答
- 0 關注
- 225 瀏覽
添加回答
舉報