2011-10-20 86 views
6

我爲某些網絡調試創建了一個小工程應用程序。它需要一個IP地址列表並對它們進行排序,用戶設置超時和速率。它記錄平均往返時間,並且每次發送失敗時記錄失敗的持續時間和發生時間的時間戳...32位和64位Windows之間的日期間粒度

這就是主意。我在一臺使用.Net4的Win7機器上開發了它,並且不得不將它放在一臺XP筆記本電腦上。

問題是測試期間我的盒子上的持續時間值顯示不錯的ms持續時間,在XP盒子上,當我看他們顯示0或15.625(魔術數字?)...並且有趣的方塊,串?

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _upTime = DateTime.Now; 
     var span = _upTime.Subtract(_downTime); 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 

這就是做日誌的位。 _ipStatus是ping失敗的原因(通常是超時)。

_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n"); 

這就是印刷的那一點......任何人都可以對這種明顯的區別有所瞭解嗎?

這個問題已經回答,但我會在這裏包括一些編輯更多信息。

編輯:

看來,差異倒不是Win7的和WinXP的差異,但32位和64位。

在一個32位Windows系統中,如Henk指出的那樣,系統時鐘的粒度爲15-16ms,對於每個時間跨度小於16ms的值,這給了我15.625的值。

在64位系統中,系統調用是針對具有更精細粒度的一組不同的方法。所以在我的開發機器在x64我有我的系統時鐘ms精度!

現在,秒錶通過處理器工具使用硬件接口來記錄更精細的粒度(可能不是每個處理器的時間間隔,但我想象一下這種想法是否符合要求)。如果操作系統底層的硬件沒有這種級別的儀器,它將使用系統時間。所以要小心!但我猜想大多數現代臺式機/筆記本電腦都有這種儀器......嵌入式設備或者這種性質的東西可能不會,但是就我所見,秒錶類不在Compact Framework中(在這裏您必須使用QueryPerformanceCounter( ))。

希望這一切都有所幫助。這對我很有幫助。

某處圍繞_spanStopWatch初始化劑:

if (!_spanStopWatch.IsHighResolution) 
    { 
     throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine."); 
    } 

的螺母和螺栓:

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _spanStopWatch.Stop(); 
     var span = _spanStopWatch.Elapsed; 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 
+0

雖然這可能不是解決問題的辦法,但應該使用TotalMilliseconds.ToString()來顯式轉換爲字符串,而不是隱式地執行。 – Polynomial

+2

@Polynomial這是絕對不必要的,因爲它會產生完全相同的代碼。 –

回答

5

0或15.625(?幻數)

是,使用DateTime.Now被精確到只有CPU時間片的長度,15-20毫秒取決於你的努力軟件和操作系統版本。

使用System.Diagnostics.Stopwatch可獲得更準確的計時。

+2

+1;然後,如果您遇到'秒錶'的問題,請檢查以下問題:http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

我已閱讀更多...我認爲這是粒度的事情。我的開發機器是64位......所以使用了更細粒度的不同調用。 – tigerswithguitars

+0

@亨克你可以提供一個秒錶使用秒錶嗎?我會細讀MSDN,但擁有經驗豐富的用戶輸入總是很好的!非常感謝你們。 – tigerswithguitars