2012-09-25 55 views
1

對於某些測試目的,我寫了一段代碼來測量我的實時視頻處理代碼中幾個快速操作的執行時間。事情工作正常。我得到了非常現實的結果,但我注意到一個有趣的特點。函數的執行時間在運行時減少。 (C++)爲什麼?

我正在使用一個POSIX功能clock_gettimeCLOCK_MONOTONIC屬性。所以我得到了納秒精度(1/1000000000sec)的timespecs,據說以這種方式獲取timespec值只需要幾個處理器蜱。

下面是我用來保存時間規格的兩個函數。我還補充說,正在使用的數據結構的定義:

QVector<long> timeMemory; 
QVector<std::string> procMemory; 
timespec moment; 

void VisionTime::markBegin(const std::string& action) { 
    if(measure){ 
    clock_gettime(CLOCK_MONOTONIC, &moment); 
    procMemory.append(action + ";b"); 
    timeMemory.append(moment.tv_nsec); 
    } 
} 

void VisionTime::markEnd(const std::string& action) { 
    if(measure){ 
    clock_gettime(CLOCK_MONOTONIC, &moment); 
    procMemory.append(action + ";e"); 
    timeMemory.append(moment.tv_nsec); 
    } 
} 

我收集的結果爲一對夫婦QVectors的,稍後使用。

我注意到,當第一次執行這兩個函數時(彼此之間正好相交,它們之間沒有任何內容),兩個保存的時間規格之間的差異是〜34000ns。下一次的差別大約小2倍。等等。如果我執行它們幾百次,那麼平均差異是〜2000ns。 因此,這些函數的平均循環執行時間比第一次少17000倍。因爲我連續進行了數百次測量,所以對我來說,一些第一次執行持續一點時間並不重要。但無論如何,它只是感興趣,爲什麼這樣呢?

我在Java中有各種各樣的經驗,但我對C++很陌生。我不太瞭解這裏的工作情況。 我正在使用O3標誌進行優化級別。 我QMAKE的conf: QMAKE_CXXFLAGS += -O3 -march=native

那麼,誰能告訴,其中的這個小部分代碼在運行時更快得到,如何和爲什麼?我懷疑追加QVector。不知何故優化會影響這個嗎?

這是我在stackoverflow上的第一個問題,希望它不會太長:)非常感謝您的回覆!

+1

你「懷疑追加QVector」?爲什麼?你認爲那是什麼?我不知道'QVector'的具體情況,但是我認爲'append'的花費會隨着時間推移分攤(就像'std :: vector'一樣)。 – Chad

+0

聽起來像你的緩存在開始業務之前必須先熱身。 – andre

+0

每次迭代的實際值是否每次都在下降,還是隻看平均值?基本上,如果你放棄第一次測量,所有其他測量是否一致? –

回答

2

您的測量代碼中存在相當多的首次潛在成本,這裏有一對夫婦以及您如何測試它們。

內存分配:那些QVectors直到第一次使用它們時纔會在堆上分配任何內存。另外,向量很可能通過分配少量內存開始,然後在添加更多數據(對於像這樣的容器的標準妥協)中以指數級分配更多。因此,您將在運行時開始時擁有許多內存分配,然後頻率將隨着時間的推移而減少。

您可以通過查看QVector::capacity()的返回值並通過QVector::reserve(int)來調整行爲 - 例如,如果你做timeMemory.reserve(10000);procMemory.reserve(10000);,那麼在測量開始之前,您可以爲前一萬次測量預留足夠的空間。

懶惰符號綁定:默認情況下動態鏈接器不會解析來自Qt(或其他共享庫)的符號,直到需要它們。因此,如果這些測量功能是您的代碼中調用某些QVectorstd::string函數的第一位,則動態鏈接器需要做一些一次性工作來解決這些需要時間的功能。

如果確實如此,可以通過在Linux上設置環境變量LD_BIND_NOW=1或在Mac上設置DYLD_BIND_AT_LAUNCH=1來禁用延遲加載。

+0

嘿,Rohanpm,這真是太棒了,事實上的解釋!這是史詩般的,你提到的兩件事情都有積極的影響。 QVectors的手動內存分配將首次執行時間減少到約25000ns。並且與禁用的惰性綁定一起的結果是〜5000ns。所以這個組合的首次執行速度快了7倍。完善 –