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

C# 如何计算C中方法的时间,c#,visual-studio,C#,Visual Studio,例如,我如何计算3种方法的时间,但这只是我需要时间的第一种和最后一种方法。我不需要时间在中间的方法。 例如,方法一需要200毫秒,方法二需要500毫秒,方法三需要300毫秒。总时间:1000毫秒。但它应该是1000毫秒–500毫秒方法二=500毫秒 有什么软件可以做到这一点吗?或者如何更改代码以使其正常工作 static void Main(string[] args) { Console.WriteLine("============================"); Consol

例如,我如何计算3种方法的时间,但这只是我需要时间的第一种和最后一种方法。我不需要时间在中间的方法。 例如,方法一需要200毫秒,方法二需要500毫秒,方法三需要300毫秒。总时间:1000毫秒。但它应该是1000毫秒–500毫秒方法二=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); 
}

如果没有单独的分析工具,您必须在MethodOne和MethodThree中使用秒表手动测量时间。无法自动执行此操作。

如果没有单独的分析工具,您必须使用MethodOne和MethodThree中的秒表手动测量时间。无法自动执行此操作。

如果线程安全不是问题,您可以将秒表置于计时方法之外。这允许您在方法开始或结束时在所需的位置调用Stop和Start


当然,您可以将秒表作为参数传递。或者让everything返回一个int/long,其中包含运行所需的毫秒数。这两种解决方案都非常难看,因为它要么添加一个额外的参数,要么强制输出参数,以防返回有用的值。

如果线程安全不是问题,则可以将秒表置于计时方法之外。这允许您在方法开始或结束时在所需的位置调用Stop和Start


当然,您可以将秒表作为参数传递。或者让everything返回一个int/long,其中包含运行所需的毫秒数。这两种解决方案都非常难看,因为它要么添加一个额外的参数,要么强制输出参数,以防您想要返回一个有用的值。

这里有许多选项

您可以在操作中使用a来了解这些方法的持续时间。当然,这是重复的代码,即使您将实际的秒表逻辑代码放在单独的方法中,但可能足以满足您的需要

或者,您可以使用来执行此操作,如果您在所有方法中都需要此行为,则可以避免重复代码。但是,您必须将代码组织得更加模块化,这也使得它更易于测试:

[LogExecutionTimeAttribute]
void MethodOne()
{
   Thread.Sleep(200);     
}

void MethodTwo()
{      
   Thread.Sleep(500);
}

[LogExecutionTimeAttribute]
void MethodThree()
{ 
   Thread.Sleep(300); 
}

void StartFlow()
{
   MethodOne();
   MethodTwo();
   MethodThree();
}
不确定为什么需要它们是静态的,应该避免


最后,像AppDynamics这样的APM工具也可以做到这一点,但对您来说可能有些过头了。

这里有许多选项

您可以在操作中使用a来了解这些方法的持续时间。当然,这是重复的代码,即使您将实际的秒表逻辑代码放在单独的方法中,但可能足以满足您的需要

或者,您可以使用来执行此操作,如果您在所有方法中都需要此行为,则可以避免重复代码。但是,您必须将代码组织得更加模块化,这也使得它更易于测试:

[LogExecutionTimeAttribute]
void MethodOne()
{
   Thread.Sleep(200);     
}

void MethodTwo()
{      
   Thread.Sleep(500);
}

[LogExecutionTimeAttribute]
void MethodThree()
{ 
   Thread.Sleep(300); 
}

void StartFlow()
{
   MethodOne();
   MethodTwo();
   MethodThree();
}
不确定为什么需要它们是静态的,应该避免


最后,像AppDynamics这样的APM工具也可以做到这一点,但对您来说可能有些过头了。

我编写了这段代码来进行一些简单的测量:

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

您可以在Start方法中提供一个委托来控制结果应该发生什么。默认情况下,它将时间输出到调试控制台。

我编写了这段代码来进行一些简单的测量:

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

您可以在Start方法中提供一个委托来控制结果应该发生什么。默认情况下,它会将时间输出到调试控制台。

请澄清您的问题。是否需要计算每个方法的运行时间?方法从另一个调用是有意的还是你的计算方法?Andy,我需要计算每个方法的运行时间。我不知道会调用什么巫婆方法。它可以是5种方法,也可以是不同项目中的20种方法。请澄清您的问题。是否需要计算每个方法的运行时间?方法从另一个调用是有意的还是你的计算方法?Andy,我需要计算每个方法的运行时间。我不知道会调用什么巫婆方法。它可以是5种方法,也可以是不同项目中的20种方法。我必须是线程安全的。我必须是线程安全的。只是出于好奇,使用PostSharp解决方案不会为MethodOne返回~1000ms吗?因为它只记录方法完成的时间,即Method2和Method3之后的时间。您是对的,但这会鼓励编写相互依赖性较小的代码。方法一、方法二和方法三可能无法相互调用,而另一个方法将包含调用这些方法的流程。它将更加模块化,每种方法都可以独立测试。它认为解决方案将是一个APM工具,可能是AppDynamics。只是出于好奇,使用PostSharp解决方案不会为MethodOne返回~1000ms吗?因为它只记录方法compl时的时间
etes,这是在Method2和Method3之后。你是对的,但这鼓励编写相互依赖性较小的代码。方法一、方法二和方法三可能无法相互调用,而另一个方法将包含调用这些方法的流程。它将更加模块化,每种方法都可以独立测试。它认为解决方案将是APM工具,可能是AppDynamics。