2011-10-20 40 views
6

Tôi đã tạo một ứng dụng kỹ thuật nhỏ để gỡ lỗi mạng. Phải mất một danh sách các địa chỉ IP và ping chúng, với thời gian chờ và tỷ lệ người dùng đã đặt. Nó ghi lại thời gian chuyến đi khứ hồi trung bình và mỗi lần một lần gửi không thành công, nó sẽ ghi lại thời gian lỗi và dấu thời gian khi nó xảy ra ...Chi tiết thời gian giữa 32bit và 64bit Windows

Đó là ý tưởng. Tôi đã phát triển nó trên một máy Win7 với .Net4 và đã phải đặt điều trên một bộ máy tính xách tay XP.

Vấn đề là giá trị thời gian trên hộp của tôi trong khi kiểm tra hiển thị thời lượng ms tốt, trên hộp XP khi tôi nhìn chúng hiển thị 0 hoặc 15.625 (số ma thuật?) ... và có biểu tượng hình vuông, vui trong hộp chuỗi?

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; 
    } 

Đó là bit thực hiện nhật ký. _ipStatus là lý do lỗi ping (thường hết thời gian chờ).

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

Đó là chút in ấn ... Ai có thể làm sáng tỏ sự khác biệt rõ ràng này không?

Câu hỏi đã được trả lời nhưng tôi sẽ bao gồm một chỉnh sửa ở đây để biết thêm thông tin.

CHỈNH SỬA:

Có vẻ như sự khác biệt không phải là sự khác biệt giữa Win7 và WinXP mà là 32bit và 64bit.

Trong hệ thống cửa sổ 32 bit như Henk chỉ ra, độ chi tiết của đồng hồ hệ thống là 15-16ms, đây là giá trị 15.625 cho mỗi giá trị nhỏ hơn 16ms cho khoảng thời gian.

Trong hệ thống 64 bit, cuộc gọi hệ thống đến một bộ phương pháp khác có độ chi tiết mịn hơn nhiều. Vì vậy, trên máy dev của tôi trong x64 tôi đã có độ chính xác ms từ đồng hồ hệ thống của tôi!

Giờ đây, đồng hồ bấm giờ sử dụng giao diện phần cứng thông qua bộ xử lý để ghi lại chi tiết hơn (có lẽ không phải mọi bộ xử lý đều đánh dấu, nhưng tôi tưởng tượng điều gì đó chính xác phù hợp với suy nghĩ này). Nếu phần cứng nằm bên dưới hệ điều hành không có mức thiết bị này, tuy nhiên nó sẽ sử dụng thời gian của hệ thống. Cẩn thận! Nhưng tôi đoán hầu hết các máy tính để bàn/máy tính xách tay hiện đại có thiết bị này ... Các thiết bị nhúng hoặc những thứ có tính chất đó có thể không, nhưng sau đó lớp đồng hồ bấm giờ không nằm trong khung Compact theo như tôi thấy (ở đây bạn phải sử dụng QueryPerformanceCounter ()).

Hy vọng tất cả điều này sẽ hữu ích. Nó đã giúp tôi rất nhiều.

Một nơi nào đó xung quanh initialiser _spanStopWatch:

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

Các loại hạt và bu lông:

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

Trong khi đó có thể không phải là giải pháp cho vấn đề của bạn, bạn nên sử dụng TotalMilliseconds.ToString() để chuyển đổi một cách rõ ràng thành chuỗi thay vì thực hiện ngầm định. – Polynomial

+2

@ Đa thức điều này là hoàn toàn không cần thiết, vì nó sẽ tạo ra chính xác cùng một mã. –

Trả lời

5

0 hoặc 15,625 (? Con số kỳ diệu)

Vâng, sử dụng DateTime.Now được chính xác chỉ với độ dài của một CPU timeslice, 15-20 ms tùy thuộc vào khó khăn của bạn ware và phiên bản hệ điều hành.

Sử dụng System.Diagnostics.Stopwatch để có thời gian chính xác hơn.

+2

+1; Sau đó, nếu bạn gặp vấn đề với 'Đồng hồ bấm giờ', hãy kiểm tra câu hỏi này: http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

Tôi đã đọc thêm một số ... Tôi nghĩ đó là điều chi tiết này. Máy dev của tôi là 64 bit ... do đó, sử dụng một cuộc gọi khác có độ chi tiết tốt hơn. – tigerswithguitars

+0

@Henk Bạn có thể cung cấp đoạn trích để sử dụng đồng hồ bấm giờ không? Tôi sẽ sử dụng MSDN, nhưng nó luôn tốt đẹp để có một người dùng có kinh nghiệm đầu vào! Rất cám ơn các bạn. – tigerswithguitars

Các vấn đề liên quan