2013-05-04 7 views
69

Я хочу знать, сколько времени требуется для выполнения процедуры/функции/заказа для целей тестирования.Время выполнения кода измерения

Это то, что я сделал, но мой метод является неправильным, потому, если разница в секундах =-не может вернуть ИСТЕКШУЮ миллисекунду:

Обратите внимание на значении сна составляет 500 мса, так истекшие секунды 0, то это может 't возвращает миллисекунды.

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

@Soner Если я отметил его с помощью C#, это потому, что код C# приветствуется для меня. – ElektroStudios

+0

Вы можете увидеть мой ответ на этот вопрос:> http://stackoverflow.com/a/16130243/1507182 Удачи – Obama

+1

Возможный дубликат [Найти время выполнения метода] (http://stackoverflow.com/questions/16130232/find-execute-time-of-the-method) – Jesse

ответ

152

Лучше всего было бы использовать Stopwatch вместо DateTime различий.

Stopwatch Class - MSDN

Предоставляет набор методов и свойств, которые можно использовать для точного измерения затраченного времени.

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); 
+0

@ElektroHacker, приветствуется, его проще в использовании, а также точнее, чем DateTime :) – Habib

+0

См. https://github.com/chai-deshpande/LogExec (также доступен пакет NUGET https://www.nuget.org/packages/LogExec/). Это делает то же самое, о чем упоминал @ soner-gonul, но, использование беспорядок свободно и скрывает весь шаблонный код. Очень полезно, когда вы хотите использовать его очень часто. Он также использует Common.Logging, чтобы вы могли интегрироваться с вашим предпочтительным поставщиком протоколирования. – Chai

+0

@ Хабиб, пожалуйста, помогите мне понять, почему нужен Thread.sleep (500)? Не могу ли я пропустить сон, это сделает его менее эффективным? –

45

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.

+0

может ли он использоваться для времени выполнения каждой строки кода? например: bindingSource.datasource = db.table; // Сколько это занимает много времени? – vaheeds

+2

@vaheeds Конечно. Просто запустите этот «секундомер» поверх каждой строки и остановите ее после каждой строки. Помните, что после каждой отдельной строки для вычисления вы также должны использовать ['Stopwatch.Reset'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.reset.aspx). На основе вашей линии; посмотрите http://ideone.com/DjR6ba –

+0

Я сделал небольшой трюк, чтобы получить миллисекунды из картинки. этот способ watch.Elapsed.ToString(). Split ('.') [0] – Doruk

8

При использовании секундомера класса, вы можете использовать .StartNew() метода сброс часов в 0. Таким образом, вы не должны вызывать .RESET() следует .start() , Может пригодиться.

21

Вы можете использовать эту Секундомер обертку:

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 

Для расширенных сценариев, вы можете использовать Benchmark.It или NBench

+2

Спасибо, лучший ответ до сих пор – pixel

+1

Спасибо, Ищите такие централизованно. Сделали эту стратегию и с ActionFilter. –

1

Секундомер предназначен для этой цели и является одним из лучших способов измерения времени выполнения в .NET.

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

Не используйте DateTimes для измерения времени выполнения в .NET.

Смежные вопросы