對於某些測試目的,我寫了一段代碼來測量我的實時視頻處理代碼中幾個快速操作的執行時間。事情工作正常。我得到了非常現實的結果,但我注意到一個有趣的特點。函數的執行時間在運行時減少。 (C++)爲什麼?
我正在使用一個POSIX功能clock_gettime
與CLOCK_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上的第一個問題,希望它不會太長:)非常感謝您的回覆!
你「懷疑追加QVector」?爲什麼?你認爲那是什麼?我不知道'QVector'的具體情況,但是我認爲'append'的花費會隨着時間推移分攤(就像'std :: vector'一樣)。 – Chad
聽起來像你的緩存在開始業務之前必須先熱身。 – andre
每次迭代的實際值是否每次都在下降,還是隻看平均值?基本上,如果你放棄第一次測量,所有其他測量是否一致? –