關於windows下的時間函數

    最近開始上班,公司要求實現windows下的ping測試功能,需要得到ping目標主機時的RTT、JITTER等數據信息,於是從網上down了一段源代碼,運行後發現跟windows cmd下運行的ping命令有較大的差別,主要是RTT不準確,出現大量的0 (ms),研究代碼後發現求RTT調用的是API函數GetTickCount(),msdn中介紹該函數時說返回的數據爲毫秒級,但是卻有10-16(ms)的誤差,即當運行前後的時間差小於16(ms)時,GetTickCount() API將不能返回正確的結果,兩次調用返回的結果是一樣的!做差運算後RTT可不就是0(ms)了。

    於是在網上搜索相關的帖子,最後終於在一帖子中找到了解決辦法;即放棄GetTickCount(),而使用QueryPerformanceFrequence()和QueryPerformanceCount() API,他們分別是返回CPU頻率(每秒跳動的次數)和從開機到現在CPU所跳動的次數,這樣就能知道執行前後CPU跳動的次數,併除於CPU頻率(浮點數除法)再乘上1000就能得到精確的毫秒級時間差,誤差爲微秒級的!

    windows下同樣返回毫秒數的API還有timeGettime、和timeGetSystemtime,他們同樣也有精度問題,當需要計算代碼執行前後的精確毫秒級時間差時最好不要使用他們!

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