如何计算C#中方法的时间

时间:2014-12-10 13:07:52

标签: c# visual-studio

如何计算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); 
}

4 个答案:

答案 0 :(得分:2)

如果线程安全不是问题,您可以将Stopwatch置于TimeTaking方法之外。这样,您就可以在所需的位置(方法的开头或结尾)调用Stop()Start()

当然,您可以将Stopwatch作为参数传递。或者让所有内容都返回int / long,其中包含运行所花费的ms量。这两个解决方案都非常难看,因为它会添加额外的参数或强制out参数,以防您想要返回有用的值。

答案 1 :(得分:1)

如果没有单独的分析工具,则必须使用StopwatchMethodOne内的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控制台。