亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 C 構建小程序的速度比 Go 或 D 快?

為什么 C 構建小程序的速度比 Go 或 D 快?

Go
慕碼人8056858 2021-12-27 10:39:57
Go 和 D 宣稱擁有令人難以置信的快速編譯器。由于語言本身的現代設計,并考慮到了并發單遍解析。了解大部分構建時間都浪費在鏈接階段。我想知道為什么 gcc 在小程序上仍然更快。C#include <stdio.h>    int main() {    printf("Hello\n");}$ time gcc hello.c真實 0m0.724s用戶 0m0.030s系統 0m0.046sD慣用語import std.stdio;void main() {    writeln("Hello\n");}$ time dmd hello.d真正的 0m1.620s用戶 0m0.047s系統 0m0.015s與黑客import core.stdc.stdio;void main() {    printf("Hello\n");}$ time dmd hello.d真正的 0m1.593s用戶 0m0.061s系統 0m0.000s$ time dmd -c hello.d真正的 0m1.203s用戶 0m0.030s系統 0m0.031s去package mainimport "fmt"func main() {    fmt.Println("Hello.")}$ time go build hello.go真正的 0m2.109s用戶 0m0.016s系統 0m0.031s爪哇public class Hello {    public static void main(String[] args) {        System.out.println("Hello.");    }}$ time javac Hello.java真正的 0m1.500s用戶 0m0.031s系統 0m0.031s
查看完整描述

1 回答

?
GCT1015

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在小程序上也做得很好。


查看完整回答
反對 回復 2021-12-27
  • 1 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號