Re: [問題] 動態連結和靜態連結的執行速度

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/07/07 10:13), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串2/2 (看更多)
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.233.250.201

07/07 00:47,
如果只呼叫一次 差距不大 如果呼叫多次 就要看呼叫的方式
07/07 00:47

07/07 00:48,
如果每次呼叫完成就釋放 要呼叫就在讀一次 這樣就會有比較多
07/07 00:48

07/07 00:49,
時間差 一般來說static一定會比較快 厲害點的編譯器
07/07 00:49

07/07 00:50,
還會讓你常用的Function盡量放在code cache中 會快很多
07/07 00:50

07/07 01:12,
那為什麼 dynamic linked code 不能做這種最佳化?
07/07 01:12

07/07 01:13,
Compile 的時候,compiler 不知道 dynamic or static
07/07 01:13

07/07 01:13,
那是 link 的時候才知道的
07/07 01:13

07/07 01:25,
memory在讀是以page為單位 時常一起用的一系列function
07/07 01:25

07/07 01:26,
放在附近 會有好處
07/07 01:26
嗯 virtual memory 被 swap 到硬碟時 的確是以 page 為單位啦 但 cache 到 memory 之間,是以 cache line 為單位的 目前流行的 CPU 其 cache line 通常是 64 byte 而這個大小 要同時放進多個 function code 是滿難的 更小的 function 使用 inline 還比較容易提升效率

07/07 01:27,
static你可以控制要載入到哪塊連續的記憶體
07/07 01:27

07/07 01:28,
把時常一同使用的functuion 放在附近的記憶體中
07/07 01:28

07/07 01:29,
因為是事先分配的
07/07 01:29

07/07 01:29,
但動態的方式 Loadlibrary你並不能指定要讀到哪裡
07/07 01:29

07/07 01:30,
動態載入除非你自己寫以個Loadlibrary (這種事我做過)
07/07 01:30

07/07 01:31,
可以載入到一大段你要的空間中
07/07 01:31

07/07 01:35,
才能用到cache的好處吧
07/07 01:35
首先,dynamic linking 和 dynamic loading 是兩回事 你說的 LoadLibrary 是 dynamic loading 接著,先不論 cache line 夠不夠塞下許多一同被使用的 function 若想實現這樣的 optimization compiler 勢必要知道哪些 function 比較常用 這樣它才能把它們放在一起 但是在你編 library 的時候,compiler 不知道 client 會呼叫哪些 function 所以也很難重新安排 function 的位置 linker 是否能做這種最佳化?也許可以 但我想真正這麼做的 linker 或許不多 因為這會大幅增長 link 時間,得到的效率改善卻微乎其微 最後,使用 dynamic link library 其實有一個好處 那就是若許多執行檔用到同一個 library 那麼 OS 並不需要重覆載入相同的資料 可以讓這些 code 在同一塊記憶體中給每個 process 共享 而且這些 code 因為同時被許多 process 共用 讓它們更有機會進入 cache 當中 所以 static library 和 dynamic library 哪個比較快? 我想答案是不一定 但在一般的 PC 上差距不會太大就是了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.151.2

07/07 10:34, , 1F
變態的做法是每個function有一個DLL檔
07/07 10:34, 1F

07/07 11:58, , 2F
very slow start ... 如果沒有共用你要拼命開檔 load DLL
07/07 11:58, 2F

07/07 14:10, , 3F
cache line 的大小基本上已經讓這樣的最佳化得不到效果
07/07 14:10, 3F
文章代碼(AID): #1AKgyu9U (C_and_CPP)
文章代碼(AID): #1AKgyu9U (C_and_CPP)