2012-04-11 50 views
30

Tôi muốn xem chức năng đang chạy trong bao lâu. Vì vậy, tôi đã thêm một đối tượng hẹn giờ vào mẫu của tôi, và tôi bước ra với mã này:Làm cách nào để đo thời gian một hàm đang chạy?

private int counter = 0; 

// Inside button click I have: 
timer = new Timer(); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Start(); 
Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 
timer.Stop(); 

Và:

private void timer_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    btnTabuSearch.Text = counter.ToString(); 
} 

Nhưng điều này là không kể bất cứ điều gì. Tại sao?

+0

nếu bạn thiết lập timer.stop(); sau khi Start() là bình thường. Khi nào cần dừng hẹn giờ? Khi chức năng kết thúc? –

+3

tại sao không StopWatch? (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – VJAI

+0

Bản sao có thể có của [Đo thời gian thực thi mã] (https://stackoverflow.com/questions/16376191/measuring- code-execution-time) –

Trả lời

40

Để tránh các vấn đề trong tương lai với một bộ đếm thời gian, đây là mã đúng:

timer = new Timer(); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Interval = 1; //set interval on 1 milliseconds 
timer.Enabled = true; //start the timer 
Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 
timer.Enabled = false; //stop the timer 

private void timer_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    btnTabuSearch.Text = counter.ToString(); 
} 

Nhưng đó là aproach sai. Bạn phải sử dụng lớp học Stopwatch (System.Diagnostic) vì đó là Bộ hẹn giờ có độ phân giải cao và từ Chẩn đoán nói mọi thứ.

Vì vậy, cố gắng này:

Stopwatch timer = Stopwatch.StartNew(); 

Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

timer.Stop(); 
TimeSpan timespan = timer.Elapsed; 

btnTabuSearch.Text = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds/10); 
+4

Lưu ý: với bộ hẹn giờ được đặt với khoảng thời gian 1ms, bạn nên cẩn thận không nghĩ rằng bộ đếm của bạn thực sự là số mili giây. Tùy thuộc vào phần cứng, khoảng thời gian tối thiểu cho một bộ hẹn giờ (trên máy tính của tôi) là khoảng 15ms. Vì vậy, ngay cả khi bạn đặt khoảng thời gian thành 1ms, nó sẽ chỉ kích hoạt 15ms một lần hoặc lâu hơn. –

+0

tôi sẽ thử hẹn giờ vào ngày mai. Tôi chỉ muốn một bộ đếm để xem thời gian trôi qua kể từ khi tôi nhấn nút. –

+1

'var timer = Stopwatch.StartNew();' <- một dòng mã nhỏ hơn –

10

Cách tốt nhất để xem thời gian chạy một chút mã là sử dụng System.Diagnostics.Stopwatch.

Dưới đây là một ví dụ:

using System.Diagnostics; 

#if DEBUG 
    Stopwatch timer = new Stopwatch(); 
    timer.Start(); 
#endif 

    //Long running code 

#if DEBUG 
    timer.Stop(); 
    Debug.WriteLine("Time Taken: " + timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'")); 
#endif 

tôi sử dụng #if DEBUG để đảm bảo mã đồng hồ bấm giờ không nhận được vào việc phát hành sản xuất, nhưng bạn có thể làm mà không có nó.

43

Không sử dụng bộ hẹn giờ - sử dụng lớp Stopwatch.

var sw = new Stopwatch(); 
Result result = new Result(); 

sw.Start(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

sw.Stop(); 

// sw.Elapsed tells you how much time passed 
+7

Hoặc thậm chí 'var sw = Stopwatch.StartNew();' <- một dòng mã nhỏ hơn –

6

Đối với thời gian một hàm, bạn nên sử dụng Stopwatch Class

Ngoài ra, lý do hẹn giờ của bạn không được đếm là bởi vì bạn không thiết lập một khoảng thời gian cho nó.

7

Sử dụng Stopwatch của System.Diagnostics:

static void Main(string[] args) 
{ 
    Stopwatch stopWatch = new Stopwatch(); 
    stopWatch.Start(); 
    Thread.Sleep(10000); 
    stopWatch.Stop(); 

    // Get the elapsed time as a TimeSpan value. 
    TimeSpan ts = stopWatch.Elapsed; 

    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", 
     ts.Hours, ts.Minutes, ts.Seconds, 
     ts.Milliseconds/10); 
    Console.WriteLine("RunTime " + elapsedTime); 
} 
+2

Sẽ không dễ dàng hơn khi in thời gian bằng 'ts.ToString (" hh: mm: ss.ff ")' hoặc 'ts.ToString (" G ")'? – Oliver

11

Bạn nên sử dụng lớp đồng hồ bấm giờ cho các chức năng thời gian.

Hãy thử như sau:

private int counter = 0; 

// setup stopwatch and begin timing 
var timer = System.Diagnostics.Stopwatch.StartNew(); 

Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

// stop timer and get elapsed time 
timer.Stop(); 
var elapsed = timer.Elapsed; 

// display result time 
MessageBox.Show(elapsed.ToString("mm':'ss':'fff")); 
4

Có lẽ, bạn có thể viết một phương pháp như thế:

public static void Time(Action action) 
{ 
    Stopwatch st = new Stopwatch(); 
    st.Start(); 
    action(); 
    st.Stop(); 
    Trace.WriteLine("Duration:" + st.Elapsed.ToString("mm\\:ss\\.ff")); 
} 

Và sử dụng nó như thế:

Time(()=> 
{ 
CallOfTheMethodIWantToMeasure(); 
}); 
7

Visual Studio 2015, 2017 Professional và Doanh nghiệp có công cụ chẩn đoán.Nếu bạn có một breakpoint ở phần cuối của chức năng của bạn, nó sẽ hiển thị thời gian và thời gian dưới Sự kiện tab như thể hiện trong hình ảnh:

Enter image description here

Bạn có thể xem bài viết Diagnostic Tools debugger window in Visual Studio 2015 để biết thêm chi tiết.

PS; Cho đến nay chỉ có các hình thức Xamarin, dự án nền tảng chéo không hỗ trợ tính năng này. Tôi ước rằng Microsoft mang đến tính năng tuyệt vời này cho các dự án biểu mẫu xamarin.

+0

điều này đã được một thời gian dài đến – goodies4uall

1

Tôi đã xem xét và đồng ý với tất cả các đề xuất. Nhưng muốn chia sẻ một triển khai chung cho trình ghi thời gian thực thi mà chúng ta không muốn thực hiện logic Đồng hồ bấm giờ nhiều lần nhưng vẫn muốn đo thời gian thực hiện cho nhiều phương thức.

Lý do chính để không triển khai trình ghi theo cách thức chung là - thực hiện phương thức nằm giữa đồng hồ bấm giờ.Start() và stopwatch.Stop() cũng có thể yêu cầu kết quả phương pháp sau khi thực hiện xử lý tiếp.

Vì vậy, để giải quyết vấn đề này tôi tạo ra sau khi thực hiện mẫu, nơi thực hiện thời gian đăng nhập một cách riêng biệt mà không trộn nó với dòng phương pháp thực tế.

public static class Helper 
{ 
    public static T Time<T>(Func<T> method, ILogger log) 
    { 
     var stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     var result = method(); 
     stopwatch.Stop(); 
     log.Info(string.Format("Time Taken For Execution is:{0}", stopwatch.Elapsed.TotalMilliseconds)); 
     return result; 
    } 
} 

public class Arithmatic 
{ 
    private ILogger _log; 
    public Arithmatic(ILogger log)//Inject Dependency 
    { 
     _log = log; 
    } 

    public void Calculate(int a, int b) 
    { 
     try 
     { 
      Console.WriteLine(Helper.Time(() => AddNumber(a, b), _log));//Return the result and do execution time logging 
      Console.WriteLine(Helper.Time(() => SubtractNumber(a, b), _log));//Return the result and do execution time logging 
     } 
     catch (Exception ex) 
     { 
      _log.Error(ex.Message, ex); 
     } 
    } 

    private string AddNumber(int a, int b) 
    { 
     return "Sum is:" + (a + b); 
    } 

    private string SubtractNumber(int a, int b) 
    { 
     return "Subtraction is:" + (a - b); 
    } 
} 

public class Log : ILogger 
{ 
    public void Info(string message) 
    { 
     Console.WriteLine(message); 
    } 

    public void Error(string message, Exception ex) 
    { 
     Console.WriteLine("Error Message:" + message, "Stacktrace:" + ex.StackTrace); 
    } 
} 

public interface ILogger 
{ 
    void Info(string message); 
    void Error(string message, Exception ex); 
} 

Calling Phần:

static void Main() 
{ 
    ILogger log = new Log(); 
    Arithmatic obj = new Arithmatic(log); 
    obj.Calculate(10, 3); 
    Console.ReadLine(); 
} 
+0

ý tưởng thú vị. Cảm ơn vì đăng. –

+0

bạn không nghĩ rằng mã chứa quá nhiều thông tin không liên quan, tôi tin rằng chỉ có phương pháp trợ giúp và cách sử dụng nó trong một dòng là đủ. – mkb

+0

Một số mở rộng tôi đồng ý nhưng thông tin không liên quan nếu bạn muốn sử dụng khái niệm này ở cấp độ rộng hơn/doanh nghiệp sau đó anh ta phải xem xét tất cả các thông tin này như logger và tất cả. Vì vậy, tôi chỉ đề cập đến cách thực hiện chi tiết. –

-1

Hãy thử cách này:

this.Cursor = Cursors.WaitCursor; 

    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); 

    //YOUR CODE - CALL FUNCTION -- OTHER COMPUTATIONS 

    long elapsed = sw.ElapsedMilliseconds; // or sw.ElapsedTicks 

    this.Cursor = Cursors.Default; 
    lblTimeNew.Text = "Time: " + elapsed.ToString(); 

Để biết thêm thông tin thăm chính thức MSDN Web

https://msdn.microsoft.com/it-it/library/system.diagnostics.stopwatch(v=vs.110).aspx

1

kỷ lục thời gian khi bước hiện tại bắt đầu xử lý

DateTime dtStart = DateTime.Now; 

//Calculate the total number of milliseconds request took (Timespan = to represent the time interval)-> current - started time stamp ... 
//TotalMilliseconds -->Gets the value of the current TimeSpan structure expressed in whole and fractional milliseconds. 
// to measure how long a function is running 
var result=((TimeSpan)(DateTime.Now - dtStart)).TotalMilliseconds.ToString("#,##0.00") + "ms"; 
Các vấn đề liên quan