我一直試圖採取一些Lua代碼的microbenchmarks,但遇到了令人難以置信的惱人的問題:我似乎無法得到一致的結果。嘗試microbenchmark結果不一致
例子:這裏是一個的應該是時間天真的斐波那契功能的死簡單的Lua程序:
function pfibs(n)
if n ~= math.floor(n) then return 0
elseif n < 0 then return pfibs(n + 2) - pfibs(n + 1)
elseif n < 2 then return n
else return pfibs(n - 1) + pfibs(n - 2)
end
end
t = os.clock()
pfibs(30)
t = os.clock() - t
print("time: "..t)
當我嘗試在連續跑了好幾次,這樣的事情發生了:
$ lua fib.lua
time: 1.265
$ lua fib.lua
time: 1.281
$ lua fib.lua
time: 1.343
$ lua fib.lua
time: 1.437
$ lua fib.lua
time: 1.562
$ lua fib.lua
time: 1.578
$ lua fib.lua
time: 1.64
$ lua fib.lua
time: 1.703
$ lua fib.lua
time: 1.75
$ lua fib.lua
time: 1.797
$ lua fib.lua
time: 1.796
$ lua fib.lua
time: 1.812
$ lua fib.lua
time: 1.89
(這僅僅是一個例子,爲簡潔起見,但代表性的是我看到的那種減速曲線)
從1.1秒開始的時間最終很好兩秒以上。我所做的一切都是坐在這裏反覆敲擊。如果我在呼叫time
而不是使用Lua時鐘的情況下將測試包裝進來,或者如果再循環幾次再花費幾秒鐘時間,就會發生同樣的事情;它似乎成比例地放緩。如果我離開它一段時間,有時候時間會縮短。有時候不是(可能是因爲我不知道要離開多久)。
這是在Windows + MSYS上。在Ubuntu(同一臺機器)上嘗試這種方式會導致不同的模式,但仍然會出現極其不一致和不可用的結果(例如,測試需要2秒,然後3.5秒,然後4秒,然後2.5秒...)。在任何情況下,任務管理器/頂部都不會在後臺咀嚼CPU。 CPU速度切換被禁用。
我在做什麼錯?我的機器是舊的,但它不能,損壞(當然,如果它是機器的錯誤,每一個程序每秒都會慢得多,我會注意到它是不可用的)。
什麼我其實想做:
我想做的是瞭解解釋實施後,有香草的Lua開始,調整它,看看對翻譯有什麼影響的變化性能。正如你所看到的,我還沒有過去「建立一個控制」,所以我還沒有實際做過這樣的事情 - 基準方差與上述一樣高,所做的任何改變都將完全喪失在噪聲。我選擇了Lua,因爲雖然它是一個真實世界的程序,但它也很小且易於閱讀和修改。如果有一個更好的基礎翻譯人員來解決這個問題,或者建立了最佳的解釋器性能基準測試方法,請隨時爲這些問題添加建議。
編輯:添加C
標籤,因爲同樣的事情在C程序中使用傳統的C時序水電費以及發生的,如:
#include <time.h>
#include <stdio.h>
int fib(int n) {
return n > 2 ? fib(n - 1) + fib(n - 2) : n;
}
int main(void) {
clock_t t1, t2; const int ITNS = 30;
for (int i = 0; i < ITNS; i ++) {
t1 = clock();
fib(38);
t2 = clock();
printf("time: %d\n", (int)((t2 - t1)/(CLOCKS_PER_SEC/1000)));
}
return 0;
}
...打印如下:
time: 687
time: 688
time: 687
time: 688
time: 671
time: 688
time: 687
time: 688
time: 672
time: 687
time: 688
time: 687
time: 672
time: 688
time: 687
time: 688
time: 672
time: 796
time: 766
time: 719
time: 969
time: 1000
time: 1015
time: 1000
time: 1016
time: 1000
time: 1000
time: 1015
time: 1000
time: 1000
這表示效果不限於單獨運行。我想這意味着機器或操作系統有問題。
我認爲這與操作系統無關,因爲整個計算都是在用戶空間中進行的。 – Naruil
我已經在我的英特爾和AMD服務器上測試了您的c程序,並且始終保持穩定。你能在這裏發佈你的機器/操作系統規格嗎? – Naruil
您應該做的一件事是將州長設置從按需或節能改爲性能。另請參閱Crypto ++項目中的''governor.sh'](https://github.com/weidai11/cryptopp/blob/master/TestScripts/governor.sh),該項目從OpenSSL項目的Andy Polyakov借用。 – jww