Tôi có nên bấm giờ ở cuối phương pháp không?


89

Hãy tưởng tượng chúng ta có các phép đo đơn giản bằng cách sử dụng Stopwatch

public void DoWork()
{
    var timer = Stopwatch.StartNew();
    // some hard work
    Logger.Log("Time elapsed: {0}", timer.Elapsed);
    timer.Stop(); // Do I need to call this?
}

Theo MSDN:

Trong một tình huống Đồng hồ bấm giờ điển hình, bạn gọi phương thức Bắt đầu, sau đó cuối cùng gọi phương thức Dừng , rồi bạn kiểm tra thời gian đã trôi qua bằng thuộc tính Đã trôi qua.

Tôi không chắc liệu mình có nên gọi phương thức này hay không khi tôi không còn quan tâm đến phiên bản bộ đếm thời gian. Tôi có nên "giải tỏa" bằng Stopphương pháp?

BIÊN TẬP

Hãy nhớ rằng Logger.Log (..) không tốn phí vì timer.Elapsedđược đọc trước khi ghi nhật ký.


1
Các Stopphương pháp ngăn chặn bạn từ những sai lầm bất cẩn, ví dụ nếu bạn đang đánh giá các Elapsedtài sản nhiều lần.
Tim Schmelter


Vì bộ hẹn giờ sắp vượt khỏi phạm vi, tại sao bạn tin rằng việc gọi điện Stopsẽ tạo ra bất kỳ sự khác biệt nào? Bạn vẫn không thể sử dụng giá trị này
Mặc định

Câu trả lời:


81

Không, bạn không cần phải dừng nó lại. Stop()chỉ dừng theo dõi thời gian đã trôi qua. Nó không giải phóng bất kỳ tài nguyên nào.


4
Nhưng dù sao cũng nên sử dụng nó để tránh những sai lầm bất cẩn.
Tim Schmelter

12
Nó không ngăn cản bất cứ điều gì, anh ấy tạo ra đồng hồ bấm giờ trong phương pháp này và không trả lại nó, vì vậy anh ấy sẽ không thể nắm giữ nó sau này để "mắc lỗi với".
Ronan Thibaudau

21
Ngoài ra, Đồng hồ bấm giờ không thực hiện bất kỳ công việc nào hoặc ăn các chu kỳ đồng hồ cpu giữa các lệnh gọi đến Bắt đầu () và Dừng (). Start () chỉ đặt dấu thời gian thành bây giờ và Stop () tính toán và lưu thời gian đã trôi qua kể từ đó. Xem nguồn trong coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi

41

Không, không cần phải dừng lại hoặc dọn dẹp nó.

Stopwatchkhông sử dụng bất kỳ tài nguyên không được quản lý nào (nếu bạn nghĩ đến IDisposable). Nó thực sự không sử dụng bất kỳ tài nguyên nào (tất nhiên là ngoại trừ bộ nhớ được sử dụng bởi chính đối tượng)! Nó cũng không tiêu tốn bất kỳ CPU nào trong khi đo thời gian đã trôi qua!

Trong cửa sổ hiện thực của .NET (.NET Framework đầy đủ, Mono, NET Core), nó chỉ gọi QueryPerformanceCounter()API của Windows khi cần thiết (trên Start()Stop()và khi đọc Elapsed) để lấy một con tem thời gian phân giải cao.

Trong các triển khai Linux Mono và .NET Core, nó sử dụng clock_gettimehàm để truy xuất giá trị thời gian tăng đơn điệu.

Đối với bất kỳ ai thực sự tò mò về chi tiết triển khai: hãy đọc bài đăng này .


5

Tôi nghĩ rằng Dừng hữu ích nếu bạn muốn sử dụng lại giá trị Đã trôi qua.


Nhưng tôi không cần trong ví dụ của mình :)
Dariusz

Vậy thì thật tuyệt :), lẽ ra tôi nên sử dụng "only" Lớp không triển khai giao diện Dispose, vì vậy không có quá trình dọn dẹp nào nên được kích hoạt.
vvv

2
@vvv Nếu muốn, bạn có thể thêm câu trả lời đó vào câu trả lời của mình - có một nút giữa câu trả lời và nhận xét có nội dung "chỉnh sửa".
Mặc định

0

Nếu mã của bạn không cần tính toán, thì không cần sử dụng Stop ().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.