2013-02-03 43 views
5

Tìm lớp System.Diagnostics.Stopwatch có những thứ có vẻ đo lường không chính xác ngay cả trong khoảng thời gian ngắn (tức là 20 giây). quá trình của tôi hiển thị thời gian trôi qua của 20.3+ giây cho một quá trình mã hoá để chạy 20 giây:Powershell hẹn giờ/độ chính xác đồng hồ bấm giờ

$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
write-host "Started at $(get-date)" 
for ($t=1; $t -le 20; $t++) { 
    Write-Host "Elapsed Time: $($elapsed.Elapsed.ToString())" 
    sleep 1 
    } 
write-host "Ended at $(get-date)" 
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 

    Started at 02/02/2013 15:08:43 
    Elapsed Time: 00:00:00.0329924 
    Elapsed Time: 00:00:01.0417435 
    Elapsed Time: 00:00:02.0547547 
    Elapsed Time: 00:00:03.0689716 
    Elapsed Time: 00:00:04.0820497 
    Elapsed Time: 00:00:05.0963413 
    Elapsed Time: 00:00:06.1113915 
    Elapsed Time: 00:00:07.1244044 
    Elapsed Time: 00:00:08.1396105 
    Elapsed Time: 00:00:09.1528952 
    Elapsed Time: 00:00:10.1659905 
    Elapsed Time: 00:00:11.1800884 
    Elapsed Time: 00:00:12.1940009 
    Elapsed Time: 00:00:13.2081824 
    Elapsed Time: 00:00:14.2223585 
    Elapsed Time: 00:00:15.2375023 
    Elapsed Time: 00:00:16.2506360 
    Elapsed Time: 00:00:17.2656845 
    Elapsed Time: 00:00:18.2790676 
    Elapsed Time: 00:00:19.2928700 
    Ended at 02/02/2013 15:09:04 
    Total Elapsed Time: 00:00:20.3080067 

là loại này chính xác trôi dạt để được mong đợi khi sử dụng lớp Stopwatch trong Powershell? Dường như tăng không cân xứng với khoảng thời gian (nghĩa là 10 giây bị tắt 0,1 và 20 bằng 0,3). Mã của tôi có bị lỗi không?

Trả lời

2

Câu hỏi đặt ra là, những gì bạn đang cố gắng làm ? Nếu bạn đang cố gắng xác định thời gian chạy tập lệnh, chính xác, bạn nên sử dụng đồng hồ bấm giờ. Tuy nhiên, nếu bạn đang cố bắt đầu một chuỗi lệnh mới sau một khoảng thời gian cụ thể, hãy sử dụng [System.Timers.Timer] và đăng ký sự kiện cho sự kiện đã trôi qua trên đối tượng bộ hẹn giờ. Sau đó, chỉ định hành động của sự kiện đã đăng ký với những gì bạn đang cố gắng thực hiện.

17

Bạn có 20 giây tạm dừng, nhưng bạn cũng có những thứ khác đang diễn ra. Có một vòng lặp gia tăng và kiểm tra một biến, và bạn viết thời gian trôi qua trên mỗi lần lặp. Những thứ phụ thêm này cần có thời gian.

này vẫn có một tạm dừng 20 giây, và thời gian trôi qua là gần gũi hơn với 20 giây bởi vì có những thứ ít bổ sung mà PowerShell đã làm:

$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
write-host "Started at $(get-date)" 
sleep 20 
write-host "Ended at $(get-date)" 
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 
+2

Loại bỏ các cuộc gọi Bắt đầu và Kết thúc cuộc gọi ghi và nó sẽ còn gần hơn. Đồng hồ bấm giờ sử dụng api truy cập tần số cao của Windows để nó khá chính xác. –

+0

Rynant, sẽ mất 20 giây. Nhưng nó sẽ không còn là đồng hồ bấm giờ nữa - chỉ là một bộ đếm thời gian ngủ. Điều đó sẽ ngừng tập lệnh của tôi chạy cho đến khi giấc ngủ hoàn tất. Tôi cần nó để chạy một quá trình và cuối cùng, cho tôi biết phải mất bao lâu để hoàn thành. –

+0

Tôi nghĩ rằng bạn đã bỏ lỡ điểm của ví dụ của tôi. Tôi đã cố gắng cho thấy lớp 'Diagnostics.Stopwatch' không chính xác. Lý do đồng hồ bấm giờ trong kịch bản của bạn cho thấy "20.3080067" giây là bởi vì kịch bản của bạn đang làm những việc khác ngoài việc ngủ. Ngoài ra, lý do các câu lệnh 'Get-Date' xuất hiện chính xác 20 giây là do thời gian hiển thị được làm tròn đến giây gần nhất. – Rynant

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