2010-05-10 51 views
64

Tôi cần có bộ hẹn giờ chính xác và DateTime.Now có vẻ không đủ chính xác. Từ các mô tả tôi đọc, System.Diagnostics.Stopwatch có vẻ là chính xác những gì tôi muốn.Đồng hồ bấm giờ có thể được sử dụng trong mã sản xuất không?

Nhưng tôi có một nỗi ám ảnh. Tôi lo lắng về việc sử dụng bất cứ điều gì từ System.Diagnostics trong mã sản xuất thực tế. (Tôi sử dụng nó rộng rãi để gỡ lỗi với Asserts và PrintLns, vv, nhưng chưa bao giờ cho công cụ sản xuất.) Tôi không chỉ cố gắng sử dụng một bộ đếm thời gian để chuẩn chức năng của tôi - ứng dụng của tôi cần một bộ đếm thời gian thực tế. Tôi đã đọc trên một diễn đàn khác mà System.Diagnostics.StopWatch chỉ dành cho điểm chuẩn, và không nên được sử dụng trong mã bán lẻ, mặc dù không có lý do nào được đưa ra. Đây có phải là chính xác, hoặc tôi (và bất cứ ai đăng lời khuyên đó) là quá kín đáo về System.Diagnostics? tức là, nó là ok để sử dụng System.Diagnostics.Stopwatch trong mã sản xuất? Cảm ơn Adrian

+0

Bạn cần loại hẹn giờ nào? Bạn có muốn một số phương thức được gọi sau một thời gian đã trôi qua hay bạn cần phải biết bao nhiêu thời gian đã trôi qua cho đến bây giờ? Bạn cần độ chính xác nào? – mnemosyn

+1

có thể trùng lặp [cách nhận đồng hồ thời gian thực trong C#?] (Http://stackoverflow.com/questions/2800559/how-to-get-a-real-time-clock-in-c). Tôi không thấy điều này khác với câu hỏi khác. Có lẽ nếu bạn thay đổi nó thành ", có vấn đề gì khi sử dụng các lớp System.Diagnostics trong sản xuất, nhưng bây giờ nó là một bản sao". –

+1

@ John - IMO, chắc chắn không phải là bản sao. Câu hỏi khác hỏi làm thế nào để làm điều đó; câu hỏi này hỏi xem có OK không. OP khác có thể có một số lý do kỳ lạ để tránh Đồng hồ bấm giờ (ví dụ như các quy tắc BS công ty điên rồ mà không có ý nghĩa nhưng vẫn phải được theo sau .. Không, tôi không cay đắng!) – dss539

Trả lời

51

Dưới mui xe, hầu như tất cả Đồng hồ bấm giờ làm là quấn QueryPerformanceCounter. Như tôi đã hiểu, Đồng hồ bấm giờ có mặt để cung cấp quyền truy cập vào bộ hẹn giờ có độ phân giải cao - nếu bạn cần độ phân giải này trong mã sản xuất, tôi không thấy có vấn đề gì khi sử dụng nó.

+2

Chúng tôi sử dụng QueryPerformanceCounter tất cả thời gian trong mã sản xuất. Nó là hoàn toàn hợp lý để sử dụng cơ sở hạ tầng này trong sản. –

4

Afaik StopWatch là hệ vỏ chức năng QueryPerformanceCounter. Hàm này là cơ sở của nhiều phép đo liên quan đến hiệu suất. QPF rất nhanh để gọi và hoàn toàn an toàn. NẾU bạn cảm thấy hoang tưởng về không gian tên Diagnostics, hãy pInvoke QPF trực tiếp.

+7

Bằng cách mở rộng, nếu bạn cảm thấy hoang tưởng về 'int' viết của riêng bạn ... – Gusdor

3

Đồng hồ bấm giờ là basically a neat wrapper xung quanh các phương thức gốc QueryPerformanceCounterQueryPerformanceFrequency. Nếu bạn không cảm thấy thoải mái khi sử dụng không gian tên System.Diagnostic, bạn có thể access these directly.

Sử dụng Bộ đếm hiệu suất rất phổ biến, không có gì sai với điều đó. AFAIK, không có độ chính xác hẹn giờ cao hơn. Lưu ý QPF có thể dẫn đến sự cố với nhiều bộ xử lý máy, nhưng Điều MSDN được liên kết trước đây cung cấp thêm một số thông tin về điều đó. Chúng tôi khuyên bạn nên đảm bảo rằng System.Diagnostics.Stopwatch hoạt động ở chế độ nền hoặc gọi số SetThreadAffinity theo cách thủ công - nếu không, bộ hẹn giờ của bạn có thể nhảy ngược thời gian!

Lưu ý rằng đối với các phép đo chính xác rất cao, có some subtleties cần được tính đến. Nếu bạn cần độ chính xác này, đây có thể là một số lo ngại.

5

Bạn nói rằng bạn đã đọc trên một diễn đàn không sử dụng lớp từ System.Diagnostics trong sản xuất. Nhưng nguồn duy nhất bạn nên lo lắng là Microsoft, người đã tạo mã. Họ nói rằng StopWatch class:

Cung cấp một tập hợp các phương pháp và thuộc tính mà bạn có thể sử dụng để đo chính xác thời gian đã trôi qua.

Họ không nói, "ngoại trừ trong sản xuất".

+5

Tôi nghĩ rằng hàm ý là nó có thể tốn kém ... – Tim

0

Tùy thuộc vào những gì bạn đang sử dụng bộ hẹn giờ, bạn có thể có các vấn đề khác cần xem xét. Windows không cung cấp bảo đảm về thời gian thực thi, vì vậy bạn không nên dựa vào nó cho bất kỳ xử lý thời gian thực nào (có các phần mở rộng thời gian thực mà bạn có thể nhận được cho Windows cung cấp lịch trình thời gian thực cứng).Tôi cũng nghi ngờ bạn có thể mất độ chính xác như là kết quả của bối cảnh chuyển đổi sau khi bạn nắm bắt khoảng thời gian và trước khi bạn làm điều gì đó với nó phụ thuộc vào độ chính xác của nó. Về nguyên tắc, điều này có thể là một khoảng thời gian dài tùy ý; trong thực tế nó nên được trên thứ tự của mili giây. Nó thực sự phụ thuộc vào cách nhiệm vụ quan trọng thời gian này là.

21

Có, System.Diagnostics có vẻ giống như chỉ để gỡ lỗi, nhưng đừng để tên đánh lừa bạn. Không gian tên System.Diagnostics có vẻ hơi đáng sợ để sử dụng trong mã sản xuất lúc đầu (nó đã làm cho tôi), nhưng có rất nhiều thứ hữu ích trong không gian tên đó.

Một số thứ, chẳng hạn như lớp Process, rất hữu ích để tương tác với hệ thống. Với Process.Start bạn có thể khởi động các ứng dụng khác, khởi chạy trang web cho người dùng, mở tệp hoặc thư mục, v.v.

Những thứ khác, chẳng hạn như lớp Trace, có thể giúp bạn theo dõi lỗi trong mã sản xuất. Cấp, bạn sẽ không phải lúc nào cũng sử dụng chúng trong mã sản xuất, nhưng chúng là rất hữu ích cho việc ghi nhật ký và theo dõi lỗi khó nắm bắt trên máy từ xa.

Đừng lo lắng về tên.

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