2011-10-11 21 views
9

Ho bisogno di un modo semplice (e compatto se possibile) per eseguire un blocco di C# durante il conteggio del tempo. Qualcosa di simile a questo codice C++:Come programmare facilmente un blocco di codice C#?

elapsed = time_call([&] 
    { 
     for_each (a.begin(), a.end(), [&](int n) { 
     results1.push_back(make_tuple(n, fibonacci(n))); 
     }); 
    }); 

dove time_call è:

// Calls the provided work function and returns the number of milliseconds 
// that it takes to call that function. 
template <class Function> 
__int64 time_call(Function&& f) 
{ 
    __int64 begin = GetTickCount(); 
    f(); 
    return GetTickCount() - begin; 
} 

So che il modo cronometro ... qualcosa di più compatto?

+3

Cosa c'è di sbagliato con 'Stopwatch'? – SLaks

+1

Il modo cronometro impiega circa 3 righe di codice, quanto compatto vuoi che sia? – harold

risposta

13
TimeSpan TimeAction(Action blockingAction) 
{ 
    Stopwatch stopWatch = System.Diagnostics.Stopwatch.StartNew(); 
    blockingAction(); 
    stopWatch.Stop(); 
    return stopWatch.Elapsed; 
} 

Usage:

var elapsed = TimeAction(() => 
    { 
     //Code to time 
    }); 

Sulla base della vostra codice di esempio (e l'utilizzo di GetTickCount) si potrebbe desiderare di tornare ElapsedTicks invece di Elapsed.

+1

Fornito ovviamente che 'action' sta bloccando (cioè non asincrono). – Joey

+0

System.Diagnostics non è "utilizzato" per impostazione predefinita. E sarebbe "System.Diagnostics.Stopwatch.StartNew()", non "new StopWatch.StartNew()". – Philip

+0

@Joey: vero, nome parametro aggiornato per rendere più chiaro. –

0

Non conosco il modo di cronometro, ma C# ha anche lambda, quindi dovrebbe essere abbastanza facile implementare qualcosa di simile a time_call().

6
public double TimeCall(Action actionToExecute) 
{ 
    double elapsed = 0; 

    if (actionToExecute != null) 
    { 
     var stopwatch = Stopwatch.StartNew(); 
     actionToExecute.Invoke(); 
     elapsed = stopwatch.ElapsedMilliseconds; 
    } 

    return elapsed; 
} 

Come Utilizzare:

var elapsed = TimeCall(() => { foreach(...) }); 
Problemi correlati