2011-10-11 46 views
9

我需要一個簡單的方法(如果可能,緊湊)在計算時間的同時執行一個C#塊。一些與此類似C++代碼:如何輕鬆計時一段C#代碼?

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

其中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; 
} 

我知道秒錶方式...什麼更緊湊?

+3

這有什麼錯'Stopwatch'? – SLaks

+1

秒錶方式需要大約3行代碼,你希望它有多緊湊? – harold

回答

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

用法:

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

基於您的示例代碼(和GetTickCount使用),你可能想返回ElapsedTicks而不是Elapsed

+1

很明顯,'action'是阻塞的(即不是異步)。 – Joey

+0

System.Diagnostics缺省情況下未被「使用」。這將是'System.Diagnostics.Stopwatch.StartNew()',而不是'New StopWatch.StartNew()'。 – Philip

+0

@Joey:確實,更新的參數名稱更清晰。 –

0

我不知道秒錶的方式,但C#也有lambda表達式,所以它應該很容易實現類似於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; 
} 

如何,使用方法:

var elapsed = TimeCall(() => { foreach(...) }); 
相關問題