如何计算3种方法的时间,但它只是我需要时间的第一种和最后一种方法。我不需要中间方法的时间。 防爆。 MethodOne需要200 ms,MethodTwo需要500 ms,MethodThree需要300 ms。总时间:1000毫秒。但它应该是1000毫秒 - 500毫秒(MethodTwo)= 500毫秒。
有没有可以做到的软件?或者我如何更改代码以使其有效?
static void Main(string[] args)
{
Console.WriteLine("============================");
Console.WriteLine(" Performance ");
Console.WriteLine("============================\n");
Console.WriteLine("Total time: {0}", TimeTaking(MethodOne).TotalMilliseconds.ToString());
Console.ReadKey();
}
static TimeSpan TimeTaking(Action methodName)
{
Stopwatch stopwatch = Stopwatch.StartNew();
methodName();
stopwatch.Stop();
return stopwatch.Elapsed;
}
static void MethodOne()
{
Thread.Sleep(200);
MethodTwo();
}
static void MethodTwo()
{
// Stop TimeTaking
Thread.Sleep(500);
MethodThree();
}
static void MethodThree()
{
// continue TimeTaking
Thread.Sleep(300);
}
答案 0 :(得分:2)
如果线程安全不是问题,您可以将Stopwatch
置于TimeTaking
方法之外。这样,您就可以在所需的位置(方法的开头或结尾)调用Stop()
和Start()
。
当然,您可以将Stopwatch
作为参数传递。或者让所有内容都返回int
/ long
,其中包含运行所花费的ms量。这两个解决方案都非常难看,因为它会添加额外的参数或强制out
参数,以防您想要返回有用的值。
答案 1 :(得分:1)
如果没有单独的分析工具,则必须使用Stopwatch
和MethodOne
内的MethodThree
手动衡量时间。没有办法自动执行此操作。
答案 2 :(得分:1)
这里有很多选择......
您在操作中使用stopwatch来了解这些方法的持续时间。当然,这是重复的代码(即使您将实际的秒表逻辑代码放在一个单独的方法中),但可能足以满足您的需要。
或者,您可以使用AOP with PostSharp执行此操作,如果您在所有方法中都需要此行为,则可以避免重复代码。但是,您必须将代码组织得更加模块化(这使得它更易于测试):
[LogExecutionTimeAttribute]
void MethodOne()
{
Thread.Sleep(200);
}
void MethodTwo()
{
Thread.Sleep(500);
}
[LogExecutionTimeAttribute]
void MethodThree()
{
Thread.Sleep(300);
}
void StartFlow()
{
MethodOne();
MethodTwo();
MethodThree();
}
(不确定为什么你需要它们是静态的,应该避免)
最后,但对你来说可能有些过分,像AppDynamics这样的APM工具也可以做到这一点。
答案 3 :(得分:0)
我写了一小段代码来做一些简单的测量:
public class Timer : IDisposable
{
private readonly Stopwatch _stopwatch;
private readonly Action<TimeSpan> _finishedDelegate;
private Timer(Action<TimeSpan> finishedDelegate)
{
if (finishedDelegate == null)
{
finishedDelegate = timeSpan => Debug.Print("Elapsed time: {0}", timeSpan);
}
_finishedDelegate = finishedDelegate;
_stopwatch = Stopwatch.StartNew();
}
public static Timer Start(Action<TimeSpan> finishedDelegate = null)
{
return new Timer(finishedDelegate);
}
public void Dispose()
{
_stopwatch.Stop();
_finishedDelegate.Invoke(_stopwatch.Elapsed);
}
}
使用类似:
using (Timer.Start())
{
// Code to be measured here
}
您可以在Start方法中提供委托来控制结果应该发生的事情。默认情况下,它会将时间输出到Debug控制台。