การวัดเวลาดำเนินการรหัส


120

ฉันต้องการทราบว่าขั้นตอน / ฟังก์ชัน / คำสั่งใช้เวลานานเท่าใดเพื่อจุดประสงค์ในการทดสอบ

นี่คือสิ่งที่ฉันทำ แต่วิธีการของฉันไม่ถูกต้อง 'ทำให้เกิดถ้าความแตกต่างของวินาทีเป็น 0 ไม่สามารถคืนค่ามิลลิวินาทีที่ผ่านไป:

สังเกตว่าค่าสลีปคือ 500 ms ดังนั้นวินาทีที่ผ่านไปจึงเป็น 0 ดังนั้นจึงไม่สามารถคืนค่ามิลลิวินาทีได้

    Dim Execution_Start As System.DateTime = System.DateTime.Now
    Threading.Thread.Sleep(500)

    Dim Execution_End As System.DateTime = System.DateTime.Now
    MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
    DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))

ใครช่วยแนะนำวิธีที่ดีกว่านี้ให้หน่อยได้ไหม อาจจะด้วยTimeSpan?

การแก้ไขปัญหา:

Dim Execution_Start As New Stopwatch
Execution_Start.Start()

Threading.Thread.Sleep(500)

MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
       "M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
       "S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
       "MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
       "Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information)

1
คุณสามารถดูคำตอบของฉันสำหรับคำถามนี้:> stackoverflow.com/a/16130243/1507182 ขอให้โชคดี
โอบามา

1
@Soner ถ้าฉันแท็กด้วย C # เป็นเพราะรหัส C # ยินดีต้อนรับฉัน
ElektroStudios

2
สามารถทำซ้ำได้ของFind Execution time of a Method
Jesse

2
นอกจากเหตุผลที่ชัดเจนในการใช้นาฬิกาจับเวลาแล้วคุณไม่ควรทำคณิตศาสตร์ใด ๆ ด้วยDateTime.Nowเนื่องจากปัญหาการออมแสงและโซนเวลา โปรดอ่านบล็อกโพสต์ของฉันเกี่ยวกับเรื่องนี้
Matt Johnson-Pint

คำตอบ:


234

วิธีที่ดีกว่าคือใช้นาฬิกาจับเวลาแทนDateTimeความแตกต่าง

คลาสนาฬิกาจับเวลา - Microsoft Docs

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

Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch
//your sample code
System.Threading.Thread.Sleep(500);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

1
@ElektroHacker ยินดีต้อนรับมันใช้งานง่ายกว่าบวกกับ DateTime ที่แม่นยำกว่า :)
Habib

1
โปรดดูที่github.com/chai-deshpande/LogExec (แพ็คเกจ NUGET มีให้ใช้งานnuget.org/packages/LogExec ) สิ่งนี้ทำสิ่งเดียวกันกับที่ @ soner-gonul กล่าวถึง - แต่การใช้งานนั้นไม่เกะกะและซ่อนรหัสสำเร็จรูปทั้งหมด มีประโยชน์มากเมื่อคุณต้องการใช้บ่อยมาก นอกจากนี้ยังใช้ Common.Logging เพื่อให้คุณสามารถทำงานร่วมกับผู้ให้บริการบันทึกข้อมูลที่คุณต้องการได้
ชัย

1
@Habib ได้โปรดช่วยฉันเข้าใจว่าทำไม Thread.sleep (500) จึงจำเป็น ฉันไม่สามารถข้ามการนอนหลับได้หรือไม่นั่นจะทำให้ประสิทธิภาพน้อยลง?
Md Sifatul Islam

8
@ Md.SifatulIslam ไม่จำเป็นต้องใช้Thread.Sleepก็แค่มีโค้ดตัวอย่างเพื่อแสดงความล่าช้า .... อันที่จริงคุณควรหลีกเลี่ยงการใช้Thread.Sleepที่ใดก็ได้ในโค้ดของคุณ
Habib

60

Stopwatch วัดเวลาที่ผ่านไป

// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

Threading.Thread.Sleep(500)

// Stop timing
stopwatch.Stop();

Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

นี่คือไฟล์DEMO.


สามารถใช้เป็นเวลาดำเนินการของรหัสแต่ละบรรทัดได้หรือไม่ เช่น: bindingSource.datasource = db.table; // ใช้เวลานานเท่าไหร่?
vaheeds

2
@vaheeds ชัวร์. เพียงเริ่มสิ่งนี้Stopwatchที่ด้านบนของแต่ละบรรทัดและหยุดหลังจากแต่ละบรรทัด จำไว้ว่าคุณต้องใช้Stopwatch.Resetในทุก ๆ บรรทัดเพื่อคำนวณ ตามสายงานของคุณ ลองดูideone.com/DjR6ba
Soner Gönül

ฉันใช้เคล็ดลับเล็ก ๆ น้อย ๆ เพื่อให้เสี้ยววินาทีออกไปจากภาพ วิธีนี้ดู Elapsed ToString (). Split ('.') [0]
Doruk

2
@Doruk ใช่คุณสามารถทำเช่นนั้นหรือคุณสามารถใช้กำหนดเอง TimeSpan สตริงรูปแบบเช่นstopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")ซึ่งดูเหมือนว่าเป็นวิธีการทำความสะอาดให้ฉัน
Soner Gönül

1
คำตอบที่ดีที่สุด ขอบคุณ!
ธ เดช

48

คุณสามารถใช้เสื้อคลุมนาฬิกาจับเวลานี้:

public class Benchmark : IDisposable 
{
    private readonly Stopwatch timer = new Stopwatch();
    private readonly string benchmarkName;

    public Benchmark(string benchmarkName)
    {
        this.benchmarkName = benchmarkName;
        timer.Start();
    }

    public void Dispose() 
    {
        timer.Stop();
        Console.WriteLine($"{benchmarkName} {timer.Elapsed}");
    }
}

การใช้งาน:

using (var bench = new Benchmark($"Insert {n} records:"))
{
    ... your code here
}

เอาท์พุท:

Insert 10 records: 00:00:00.0617594

สำหรับสถานการณ์ขั้นสูงคุณสามารถใช้BenchmarkDotNetหรือBenchmark itหรือNBench


3
ขอบคุณคำตอบที่ดีที่สุด
พิกเซล

2
ขอบคุณกำลังมองหาสิ่งนี้แบบรวมศูนย์ ได้ทำกลยุทธ์นี้กับ ActionFilter เช่นกัน
ಅನಿಲ್

13

หากคุณใช้คลาส Stopwatch คุณสามารถใช้เมธอด .StartNew ()เพื่อรีเซ็ตนาฬิกาเป็น 0 ดังนั้นคุณไม่ต้องเรียก. รีเซ็ต ()ตามด้วย. เริ่ม () อาจมีประโยชน์


4

นาฬิกาจับเวลาออกแบบมาเพื่อจุดประสงค์นี้และเป็นวิธีที่ดีที่สุดวิธีหนึ่งในการวัดการทำงานของเวลาใน. NET

var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

อย่าใช้ DateTimes เพื่อวัดการดำเนินการเวลาใน. NET


3

หากคุณกำลังมองหาระยะเวลาที่เธรดที่เกี่ยวข้องใช้เวลาในการรันโค้ดภายในแอปพลิเคชัน
คุณสามารถใช้ProcessThread.UserProcessorTimeคุณสมบัติที่คุณจะได้รับภายใต้System.Diagnosticsเนมสเปซ

TimeSpan startTime= Process.GetCurrentProcess().Threads[i].UserProcessorTime; // i being your thread number, make it 0 for main
//Write your function here
TimeSpan duration = Process.GetCurrentProcess().Threads[i].UserProcessorTime.Subtract(startTime);

Console.WriteLine($"Time caluclated by CurrentProcess method: {duration.TotalSeconds}"); // This syntax works only with C# 6.0 and above

หมายเหตุ: หากคุณใช้เธรดหลายเธรดคุณสามารถคำนวณเวลาของเธรดแต่ละเธรดทีละรายการและสรุปรวมเพื่อคำนวณระยะเวลาทั้งหมด


0

ฉันไม่เห็นเวอร์ชัน vb.net ของวิธีการใช้คลาสนาฬิกาจับเวลาดังนั้นฉันจึงให้ตัวอย่างด้านล่าง

        Dim Stopwatch As New Stopwatch

        Stopwatch.Start()
                    ''// Test Code
        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

        Stopwatch.Restart()            
                   ''// Test Again

        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

ฉันหวังว่านี่จะช่วยทุกคนที่มาถึงคำถามนี้ที่กำลังมองหา vb.net

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