我一直在研究一個可執行圖像處理的便攜式C庫。如何在C中測試性能優化?
爲了利用GCC自動矢量化(SSE和/或AVX取決於目標處理器)模式,我在一些低級函數上投入了相當多的時間,同時仍然保留了一些可移植的C代碼(擴展使用:restrict
和__builtin_assume_aligned
)。
現在是時間,以測試窗的代碼(MSVC編譯器)。但在此之前,我想設置一些單元測試,以免在腳中自我拍攝,並放棄所有我精心選擇的指令,以保持GCC自動矢量化代碼的原樣。
我可以簡單地#ifdef/#endif
全身功能,但我想到一個更長期的解決方案,可以檢測編譯器更新任何迴歸。
我與單元測試相當有信心(有噸很好的框架在那裏的),但我是一個有很多這樣的低級功能單元測試缺乏自信。如何在CI服務中集成性能單元測試,例如jenkins?
PS:我想避免存儲基於特定的處理器上硬編碼的時序結果,如:
// start timer:
gettimeofday(&t1, NULL);
// call optimized function:
...
// stop timer:
gettimeofday(&t2, NULL);
// hard code some magic number:
if(t2.tv_sec - t1.tv_sec > 42) return EXIT_FAILURE;
您是否具有非優化(通用)功能?比較執行時間w/them會更好...意味着't_opt'預計會小於't_non_opt' ...但即使這不是100%的擔保。其他進程可能會並行執行隨機磁盤訪問,您的測試可能會隨時被搶佔......並且其他一些事情可能不會在您的測試中發生...... – zaufi
您瞄準什麼?你想確保在你的修改之後你的代碼仍然是正確的(那麼你將進行單元測試)還是你想檢查結果代碼的性能(這是不同的,可能以不同的方式接近)?在後一種情況下,您甚至可能需要打印出生成的彙編代碼,將其與您的期望進行比較。 –
@DirkHerrmann這就是重點!如何打印'便攜式'彙編代碼?這可能取決於具體的gcc版本,如果您熟悉生成彙編代碼,請參閱其他詳細信息。 – malat