2011-10-11 66 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(...) }); 
相关问题