2011-10-11 15 views
9

Necesito una manera simple (y compacta, si es posible) para ejecutar un bloque de C# al tiempo de contar. Algo similar a este código C++:¿Cómo se puede sincronizar fácilmente un bloque de código C#?

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

donde time_call es:

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

Conozco el camino cronómetro ... nada más compacto?

+3

Qué le pasa a 'Stopwatch'? – SLaks

+1

La forma del cronómetro toma alrededor de 3 líneas de código, ¿qué tan compacto quiere que sea? – harold

Respuesta

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

Uso:

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

Sobre la base de su código de muestra (y el uso de GetTickCount) es posible que desee volver ElapsedTicks en lugar de Elapsed.

+1

Siempre que obviamente 'action' sea bloqueable (es decir, no asincrónico). – Joey

+0

System.Diagnostics no se usa "de manera predeterminada". Y sería 'System.Diagnostics.Stopwatch.StartNew()', no 'new StopWatch.StartNew()'. – Philip

+0

@Joey: Nombre del parámetro verdadero y actualizado para que quede más claro. –

0

No conozco el modo de cronómetro, pero C# también tiene lambdas, por lo que debería ser fácil implementar algo similar 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; 
} 

Como usar:

var elapsed = TimeCall(() => { foreach(...) }); 
Cuestiones relacionadas