ฉันควรจับเวลา Stopwatch เมื่อสิ้นสุดวิธีการหรือไม่?


89

ลองจินตนาการว่าเรามีการวัดอย่างง่ายโดยใช้ 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?
}

ตาม MSDN:

ในสถานการณ์นาฬิกาจับเวลาทั่วไปคุณจะเรียกใช้เมธอด Start จากนั้นเรียกเมธอด Stopจากนั้นตรวจสอบเวลาที่ผ่านไปโดยใช้คุณสมบัติ Elapsed

ฉันไม่แน่ใจว่าควรเรียกวิธีนี้หรือไม่เมื่อฉันไม่สนใจอินสแตนซ์ตัวจับเวลาอีกต่อไป ฉันควร "ล้าง" โดยใช้Stopวิธีการหรือไม่?

แก้ไข

โปรดทราบว่า Logger.Log (.. ) ไม่มีค่าใช้จ่ายใด ๆ เนื่องจากtimer.Elapsedถูกอ่านก่อนบันทึกของคนตัดไม้


1
Stopวิธีการป้องกันไม่ให้คุณจากความผิดพลาดประมาทตัวอย่างเช่นถ้าคุณกำลังประเมินElapsedคุณสมบัติหลายครั้ง
Tim Schmelter


เนื่องจากตัวจับเวลาอยู่นอกขอบเขตเหตุใดคุณจึงเชื่อว่าการโทรStopจะสร้างความแตกต่าง คุณไม่สามารถใช้ค่านี้ได้
ค่าเริ่มต้น

คำตอบ:


81

ไม่คุณไม่จำเป็นต้องหยุดมัน Stop()เพียงแค่หยุดติดตามเวลาที่ผ่านไป ไม่ทำให้ทรัพยากรใด ๆ ว่างเปล่า


4
แต่ก็เป็นแนวทางปฏิบัติที่ดีที่จะใช้เพื่อป้องกันความผิดพลาดโดยประมาท
Tim Schmelter

12
มันไม่ได้ป้องกันอะไรเขาสร้างนาฬิกาจับเวลาด้วยวิธีการนี้และไม่ส่งคืนดังนั้นเขาจะไม่สามารถ "ทำผิดพลาด" ได้ในภายหลัง
Ronan Thibaudau

21
นอกจากนี้นาฬิกาจับเวลายังไม่ทำงานหรือกินวงจรนาฬิกาซีพียูระหว่างการโทรไปยัง Start () และ Stop () Start () เพียงแค่ตั้งค่าการประทับเวลาเป็นตอนนี้และ Stop () จะคำนวณและบันทึกเวลาที่ผ่านไปนับตั้งแต่นั้น ดูที่มาใน coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi

42

ไม่จำเป็นต้องหยุดหรือทำความสะอาด

Stopwatchไม่ใช้ทรัพยากรที่ไม่มีการจัดการใด ๆ (ถ้าคุณคิดว่าIDisposable) จริงๆแล้วมันไม่ได้ใช้ทรัพยากรใด ๆเลย (ยกเว้นหน่วยความจำที่ใช้โดยวัตถุนั้นเอง)! อีกทั้งยังไม่ใช้ CPU ใด ๆ ในขณะที่วัดเวลาที่ผ่านไป!

ในการใช้งาน Windows ของ. NET (.NET Framework เต็มรูปแบบ, Mono, .NET Core) มันจะเรียกQueryPerformanceCounter()Windows API เมื่อจำเป็น (เปิดStart()และStop()และเมื่ออ่านElapsed) เพื่อดึงการประทับเวลาที่มีความละเอียดสูง

ในการใช้งาน Linux ของ Mono และ. NET Core จะใช้clock_gettimeฟังก์ชันเพื่อดึงค่าเวลาที่เพิ่มขึ้นแบบโมโนโทนิค

สำหรับทุกคนที่มีความอยากรู้อยากเห็นเกี่ยวกับรายละเอียดการใช้งาน: อ่านโพสต์นี้


5

ฉันคิดว่า Stop มีประโยชน์หากคุณต้องการใช้ค่า Elapsed ซ้ำ


แต่ฉันไม่ต้องการในตัวอย่างของฉัน :)
Dariusz

ถ้าอย่างนั้นก็เยี่ยมมาก :) ฉันควรใช้ "only" คลาสนี้ไม่ได้ใช้อินเทอร์เฟซ Dispose ดังนั้นจึงไม่ควรทริกเกอร์การล้างข้อมูล
vvv

2
@vvv หากคุณต้องการคุณสามารถเพิ่มคำตอบนั้นได้ - มีปุ่มระหว่างคำตอบและความคิดเห็นที่ระบุว่า "แก้ไข"
ค่าเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.