[英]Performance c++: Dynamic loading library and loops
我想對動態加載的庫符號進行快速迭代。 為了查看與硬編碼該函數相比可以獲得多少性能,我對一個簡單的加法運算做了一些基准測試。
我用這個功能做手術
long int func(long int x)
{
return x+1;
}
這循環測試時間
硬編碼:
for(i=0;i<N;i++)
c = c + 1;
使用函數(在循環所在的同一文件中定義):
for(i=0;i<N;i++)
c = func(c);
使用鏈接對象中的func(func.o):
for(i=0;i<N;i++)
c = object_func(c);
使用來自動態加載的符號的func(使用dlopen和dlsym)
for(i=0;i<N;i++)
c = dynamic_func(c);
這是不同N值的結果,以及使用g ++ -Ofast編譯的所有結果:
這里有一些“神秘”的事情,首先,函數版本給出了0個時間值,因此其行中缺少點。 然后,幾乎比硬編碼版本小一個數量級。 我認為編譯器正在優化操作,因此時間不會增加。 另一個奇怪的事情是,對於較小的N值,對象或共享庫會提供更好的時間。
沒有優化就一樣。 再次感到奇怪的是,硬編碼的啟動速度比其他編碼慢,但是現在很明顯,優化器負責平坦曲線。 但是,N參數是程序的參數,在構建時並不固定。
任何人都可以解釋這種行為嗎? 還有一個主要問題:對於大N的對象或動態庫,是否有辦法獲得更好的結果?
謝謝
沒什么大不了的,很簡單:
object_func,dynamic_func相同,只是dinamic需要更多的時間來加載庫。 循環的復雜度是O(n),所以圖表。
c ++不僅是帶有類的c語言,它還具有強大的功能強大的優化器。 因此,優化器將研究硬代碼並用以下代碼替換:
c = N;
注意:優化器只有在編譯時知道N和操作/函數時才能這樣做。
行為說明:
對於前兩個,代碼由編譯器(O(1))優化。 對於最后兩個,該函數顯然稱為(O(N))。
如何獲得更好的結果:
您應該將N值作為參數傳遞給動態加載的函數,並在函數內部執行循環,以避免在大N上調用函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.