我爲某些網絡調試創建了一個小工程應用程序。它需要一個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;
}
雖然這可能不是解決問題的辦法,但應該使用TotalMilliseconds.ToString()來顯式轉換爲字符串,而不是隱式地執行。 – Polynomial
@Polynomial這是絕對不必要的,因爲它會產生完全相同的代碼。 –