Lua os.clock在win和linux下的差異

最近在做一些框架的優化工作,其中一個就是完善測試用例,在進行http模塊測試的時候,我注意到輸出的時間有異常

[T1LP10-20 19:25:09]http(s) test
[T1LP10-20 19:25:19][  OK] http get example.com (25ms)
[T1LP10-20 19:25:19]21 passing, 0 failing (1962ms)

可以看到get example.com這個測試花25ms,但實際這個測試花了10秒時間,這說明測試輸出的時間是錯誤的。

由於整個框架的代碼都是自己寫的,包括測試模塊的代碼。首先懷疑是測試模塊的代碼寫得有問題,但是檢查了一遍,代碼裏都是直接用的os.clock(),沒有發現問題。第二,測試模塊裏使用了coroutine,懷疑是os.clock()coroutine下有什麼設定,查了資料也沒有發現。第三,測試是在Virtual Box虛擬機裏進行的,懷疑是不是虛擬機裏得到的時間不一樣,於是去了另一臺win7的機子上測試,結果發現在win7上時間是正確的。於是簡化代碼,拿到另一臺linux真機上測試,結果發現時間還是不對。

# cat test.lua

print("before", os.clock(), os.date())

os.execute("sleep 5")

print("after", os.clock(), os.date())
root@debian:/home/xzc/local_code# lua test.lua
before  0.001295        Wed Oct 21 10:42:41 2020
after   0.001688        Wed Oct 21 10:42:46 2020

這說明不是虛擬機的問題,於是查了下os.clock()的源碼,極其簡單

// loslib.c
static int os_clock(lua_State *L) {
    lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);
    return 1;
}

直接調用C標準庫的clock函數。我對這個函數的印象就是它會溢出,但這裏程序啓動才幾秒鐘,顯然不是溢出的情況,但爲啥在linux下時間不對。在搜索clock linux time這個關鍵字的時候,才發現自己忽略了這個函數的另一個問題

linux

The clock() function returns an approximation of processor time used by the program.

windows

The clock function tells how much wall-clock time has passed since the CRT initialization during process start. Note that this function does not strictly conform to ISO C, which specifies net CPU time as the return value.

linux下該函數返回cpu消耗的時間(不包括sleep、epoll_wait等不消耗cpu函數所用的時間),而win返回整個程序運行的時間,詳見stackoverflow的討論

因此,測試中日誌的時間雖然和預期不太一樣,但“並不算是一個bug”。如果要轉換成經過的時間,就需要額外處理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章