2017-12-28 10 views
-5

ich die Zeit zwischen fucnctions messen möchten + erhalten die GesamtzeitC#, um die Zeit zwischen den verschiedenen Funktionen messen

ich jetzt, dass es Stoppuhr ist aber, was ich weiß ist, dass ich nur die Zeit zwischen dem Start bekommen und aufhören mit Verstrichen, also kann ich auf diese Weise die Gesamtzeit bekommen.

Wie kann ich die Zeit zwischen den Funktionen bekommen? für Beispiel :

Stopwatch s= new Stopwatch(); 
s.Start(); 
Function1(); 
//here I want get the time of function1 
Function2(); 
//here I want get the time of function2 
Function3(); 
//here I want get the time of function3 

//here I want get the time of total time 
s.Stop(); 

Wenn ich die Stoppuhr zwischen der Funktion neu starte, werde ich nicht die Gesamtzeit haben. Ich möchte nicht mehr als 1 Stoppuhr anwenden

Was kann ich tun?

+0

Was ist, wenn Sie mehr als eine Stoppuhr hatte? Oder wenn Sie nach jeder Funktion diese Menge an Zeit in einer Variablen gespeichert haben und dann alle Variablen am Ende hinzugefügt haben, um die Summe zu erhalten? – mjwills

+0

Sie müssen die Uhr nicht anhalten, um abgelaufene Ticks zu erhalten. Holen Sie sich einfach die Ticks und speichern Sie sie in einer Variablen, wann immer Sie wollen und machen Sie Ihre Berechnungen. –

+0

Wenn Ihre Funktion wie linear wie das können Sie einfach DateTime.Now verwenden und Math-Operator verwenden, um eine Zeitspanne – Steve

Antwort

0

Sie könnten sich einen kleinen Helfer machen, dass es für Sie stoppt und kehrt die verstrichenen Zeiten:

using System; 
using System.Threading; 
using System.Diagnostics; 

public class Program 
{ 
    // measures a given lambdas run time - you can call any 
    // other function by StopFunc(() => .........) and supply 
    // your function call instead of ........ 
    public static TimeSpan StopFunc(Action act) 
    { 
     var watch = Stopwatch.StartNew(); 

     act?.Invoke(); // call the function 

     watch.Stop(); 

     return watch.Elapsed; 
    } 

    static void Fast() { Thread.Sleep(100); } 
    static void Slow() { Thread.Sleep(2000); } 

    public static void Main() 
    { 
     // this calls the "to be measured function" 
     // via lambda and prints the time needed 
     Console.WriteLine("Slow took: " + StopFunc(() => Slow())); 
     Console.WriteLine("Fast took: " + StopFunc(() => Fast()));  
    } 
} 

Ausgang:

Slow took: 00:00:02.0024322 
Fast took: 00:00:00.1099702 

Die StopFunc nimmt eine Aktion, die Sie von einem Lambda-Versorgung (() => YourFuncToCall()) - es ist nur für Messungen obwohl.

2

Sie können die verstrichene Zeit vom Stopwatch abrufen, wie Sie gehen:

Stopwatch s= new Stopwatch(); 
s.Start(); 
Function1(); 
var timeF1 = s.Elapsed; 
Function2(); 
var timeF2 = s.Elapsed-timeF1; 
Function3(); 
var timeF3 = s.Elapsed-timeF2-timeF1; 

s.Stop(); 
//here I want get the time of total time 
var timeTotal = s.Elapsed; 
+0

var timeF2 = s.Elapsed; gib die Zeit ab am Start(); bis var timeF2 = s.Elapsed, aber ich möchte wissen, die Zeit, die Function2 dauert – csc3cc3

+0

Sie haben Recht - behoben. – NetMage

-2

Hier ist eine Klasse, die ich in der Vergangenheit verwendet haben, die Ihnen nützlich sein können. Es bietet eine einfache Abstraktion über die Stoppuhr-Klasse, die es Ihnen ermöglicht, Ihren Code so frei wie möglich von dem für die Zeitsteuerung benötigten Kesselblech-Code zu halten. Dies macht es einfacher zu lesen und zu einem späteren Zeitpunkt leichter zu entfernen.

public class StopwatchWrapper : IDisposable 
{ 
    private bool disposed = false; 
    private Stopwatch _overallStopwatch; 
    private List<long> _increments; 

    public StopwatchWrapper() 
    { 
     _overallStopwatch = Stopwatch.StartNew(); 
     _increments = new List<long>(); 
    } 

    public void Reset() 
    { 
     _increments.Clear(); 
     _overallStopwatch.Restart(); 
    } 

    public long ElapsedMilliseconds 
    { 
     get 
     { 
      _overallStopwatch.Stop(); 
      var elapsed = _overallStopwatch.ElapsedMilliseconds; 
      _increments.Add(elapsed); 
      _overallStopwatch.Start(); 

      return elapsed; 
     } 
    } 

    public long OverallMilliseconds 
    { 
     get 
     { 
      return _increments.Sum(); 
     } 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!disposed) 
     { 
      if (disposing) 
      { 
       if (_overallStopwatch != null) 
       { 
        _overallStopwatch.Stop(); 
       } 
      } 

      disposed = true; 
     } 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
    } 
} 

Man könnte es in Ihrem Szenario wie folgt verwenden:

using (var sw = new StopwatchWrapper()) 
{ 
    Function1(); 
    //here I want get the time of function1 
    Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); 

    Function2(); 
    //here I want get the time of function2 
    Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); 

    Function3(); 
    //here I want get the time of function3 
    Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); 

    //here I want get the time of total time 
    Console.WriteLine($"{sw.OverallMilliseconds}ms"); 
} 
+2

Ihre Klasse bietet buchstäblich keine Funktionalität, die nicht von der Klasse 'StopWatch' bereitgestellt wird. – Servy

+0

@Servy Anstatt eine Reihe von Zwischenvariablen zu definieren oder jeden Funktionsaufruf in einer Aktion zu verpacken, finde ich, dass es eine sauberere und weniger aufdringliche Art und Weise bietet, das gewünschte Ergebnis zu erreichen, ohne den eigentlichen zu testenden Code zu verschmutzen mit einem Haufen Kesselplattenkram. – pmcilreavy

Verwandte Themen