Đo thời gian thực thi mã


120

Tôi muốn biết mất bao nhiêu thời gian để hoàn thành một thủ tục / chức năng / lệnh, cho mục đích thử nghiệm.

Đây là những gì tôi đã làm nhưng phương pháp của tôi sai 'vì nếu sự khác biệt của giây là 0 không thể trả về mili giây đã trôi qua:

Lưu ý rằng giá trị ngủ là 500 ms nên số giây trôi qua là 0 thì nó không thể trả về mili giây.

    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))

Ai đó có thể chỉ cho tôi một cách tốt hơn để làm điều này? Có thể với một TimeSpan?

Giải pháp:

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
Bạn có thể xem câu trả lời của tôi cho câu hỏi này:> stackoverflow.com/a/16130243/1507182 Chúc may mắn
Obama

1
@Soner Nếu tôi gắn thẻ nó bằng C # là vì mã C # được chào đón với tôi.
ElektroStudios


2
Bên cạnh những lý do rõ ràng để sử dụng đồng hồ bấm giờ, bạn không bao giờ nên làm bất kỳ phép toán nào DateTime.Nowdo các vấn đề về Tiết kiệm ánh sáng ban ngày và múi giờ. Vui lòng đọc bài đăng trên blog của tôi về chủ đề này
Matt Johnson-Pint

Câu trả lời:


234

Một cách tốt hơn sẽ là sử dụng Đồng hồ bấm giờ , thay vì DateTimesự khác biệt.

Lớp đồng hồ bấm giờ - Microsoft Docs

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.

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, bạn được chào đón, nó dễ sử dụng hơn, cộng với đó là DateTime chính xác hơn :)
Habib

1
Vui lòng tham khảo github.com/chai-deshpande/LogExec (một gói NUGET cũng có sẵn nuget.org/packages/LogExec ). Điều này thực hiện chính xác những điều mà @ soner-gonul đã đề cập - nhưng, việc sử dụng không lộn xộn và ẩn tất cả mã bảng soạn sẵn. Rất hữu ích khi bạn muốn sử dụng nó thường xuyên. Nó cũng sử dụng Common.Logging để bạn có thể tích hợp với nhà cung cấp ghi nhật ký ưa thích của mình.
Chai

1
@Habib, bạn có thể vui lòng giúp tôi hiểu tại sao Thread.sleep (500) lại cần thiết không? Tôi không thể làm nó bỏ qua giấc ngủ, điều đó có làm cho nó kém hiệu quả hơn không?
Md Sifatul Islam,

8
@ Md.SifatulIslam, không có nhu cầu sử dụng Thread.Sleep, nó chỉ có như một mẫu mã để hiển thị chậm trễ .... trong thực tế, bạn nên tránh sử dụng Thread.Sleepbất cứ nơi nào trong mã của bạn
Habib

59

Stopwatch đo thời gian trôi qua.

// 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);

Đây là một DEMO.


nó có thể được sử dụng cho thời gian thực thi của mỗi dòng mã không? ví dụ: bindSource.datasource = db.table; // mất bao lâu?
vaheeds,

2
@vaheeds Chắc chắn rồi. Chỉ cần bắt đầu điều này Stopwatchở đầu mỗi dòng của bạn và dừng nó sau mỗi dòng của bạn. Hãy nhớ rằng, bạn cũng cần sử dụng Stopwatch.Reseton sau mỗi dòng để tính toán. Dựa trên dòng của bạn; hãy xem ideone.com/DjR6ba
Soner Gonul

tôi đã thực hiện một thủ thuật nhỏ trên nó để lấy ra từng mili giây trong hình ảnh. Bằng cách này watch.Elapsed.ToString () Split ( '') [0].
Doruk

2
@Doruk Vâng, bạn có thể làm điều đó hoặc bạn có thể sử dụng Chuỗi định dạng Timespan tùy chỉnh giống như cách stopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")đó có vẻ là một cách gọn gàng hơn đối với tôi.
Soner Gönül

1
Câu trả lời tốt nhất. Cảm ơn!
Tadej

48

Bạn có thể sử dụng trình bao bọc Đồng hồ bấm giờ này:

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}");
    }
}

Sử dụng:

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

Đầu ra:

Insert 10 records: 00:00:00.0617594

Đối với các tình huống nâng cao, bạn có thể sử dụng BenchmarkDotNet hoặc Benchmark.It hoặc NBench


3
Cảm ơn, câu trả lời hay nhất cho đến nay
pixel

2
Cảm ơn, đã tìm kiếm như vậy một cách tập trung. Cũng đã thực hiện chiến lược này với ActionFilter.
ಅನಿಲ್

13

Nếu bạn sử dụng lớp Đồng hồ bấm giờ, bạn có thể sử dụng phương thức .StartNew () để đặt lại đồng hồ về 0. Vì vậy, bạn không phải gọi .Reset () theo sau là .Start (). Có thể có ích.


4

Đồng hồ bấm giờ được thiết kế cho mục đích này và là một trong những cách tốt nhất để đo thời gian thực thi trong .NET.

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

Không sử dụng DateTimes để đo thời gian thực thi trong .NET.


3

Nếu bạn đang tìm khoảng thời gian mà chuỗi liên kết đã dành để chạy mã bên trong ứng dụng.
Bạn có thể sử dụng ProcessThread.UserProcessorTimeThuộc tính mà bạn có thể lấy dưới System.Diagnosticskhông gian tên.

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

Lưu ý: Nếu bạn đang sử dụng nhiều luồng, bạn có thể tính thời gian của từng luồng riêng lẻ và cộng lại để tính tổng thời lượng.


0

Tôi không thể thấy phiên bản vb.net về cách một người có thể sử dụng Lớp đồng hồ bấm giờ, vì vậy tôi đã cung cấp một ví dụ bên dưới.

        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)

Tôi hy vọng điều này sẽ giúp bất cứ ai đã đặt câu hỏi này khi tìm kiếm vb.net.

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.