看板 C_and_CPP 關於我們 聯絡資訊
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.233.250.201
cnj:如果只呼叫一次 差距不大 如果呼叫多次 就要看呼叫的方式 07/07 00:47
cnj:如果每次呼叫完成就釋放 要呼叫就在讀一次 這樣就會有比較多 07/07 00:48
cnj:時間差 一般來說static一定會比較快 厲害點的編譯器 07/07 00:49
cnj:還會讓你常用的Function盡量放在code cache中 會快很多 07/07 00:50
littleshan:那為什麼 dynamic linked code 不能做這種最佳化? 07/07 01:12
littleshan:Compile 的時候,compiler 不知道 dynamic or static 07/07 01:13
littleshan:那是 link 的時候才知道的 07/07 01:13
cnj:memory在讀是以page為單位 時常一起用的一系列function 07/07 01:25
cnj:放在附近 會有好處 07/07 01:26
嗯 virtual memory 被 swap 到硬碟時 的確是以 page 為單位啦 但 cache 到 memory 之間,是以 cache line 為單位的 目前流行的 CPU 其 cache line 通常是 64 byte 而這個大小 要同時放進多個 function code 是滿難的 更小的 function 使用 inline 還比較容易提升效率
cnj:static你可以控制要載入到哪塊連續的記憶體 07/07 01:27
cnj:把時常一同使用的functuion 放在附近的記憶體中 07/07 01:28
cnj:因為是事先分配的 07/07 01:29
cnj:但動態的方式 Loadlibrary你並不能指定要讀到哪裡 07/07 01:29
cnj:動態載入除非你自己寫以個Loadlibrary (這種事我做過) 07/07 01:30
cnj:可以載入到一大段你要的空間中 07/07 01:31
cnj:才能用到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
cnj:變態的做法是每個function有一個DLL檔 07/07 10:34
ledia:very slow start ... 如果沒有共用你要拼命開檔 load DLL 07/07 11:58
littleshan:cache line 的大小基本上已經讓這樣的最佳化得不到效果 07/07 14:10