簡體   English   中英

Performance C ++:動態加載庫和循環

[英]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的對象或動態庫,是否有辦法獲得更好的結果?

謝謝

沒什么大不了的,很簡單:

  1. object_func,dynamic_func相同,只是dinamic需要更多的時間來加載庫。 循環的復雜度是O(n),所以圖表。

  2. c ++不僅是帶有類的c語言,它還具有強大的功能強大的優化器。 因此,優化器將研究硬代碼並用以下代碼替換:

    c = N;

注意:優化器只有在編譯時知道N和操作/函數時才能這樣做。

行為說明:

對於前兩個,代碼由編譯器(O(1))優化。 對於最后兩個,該函數顯然稱為(O(N))。

如何獲得更好的結果:

您應該將N值作為參數傳遞給動態加載的函數,並在函數內部執行循環,以避免在大N上調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM