查看函数执行需要多长时间的最佳方法

时间:2018-10-22 18:26:10

标签: c#

我正在尝试查看执行几个功能需要花费多长时间。

执行此操作的代码很简单

select FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (5/24) AS TIMESTAMP), 'America/Los_Angeles'),
       FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (13/24) AS TIMESTAMP), 'America/Los_Angeles')
from dual;

FROM_TZ(CAST(TRUNC(CURRENT_DATE)+(5/24)ASTIMESTAM FROM_TZ(CAST(TRUNC(CURRENT_DATE)+(13/24)ASTIMESTA
------------------------------------------------- -------------------------------------------------
2018-10-22 05:00:00.000000000 AMERICA/LOS_ANGELES 2018-10-22 13:00:00.000000000 AMERICA/LOS_ANGELES

但是,我不想用新的Stopwatch实例和此代码的其余部分添加我的所有功能。而是以某种方式将函数传递给此方法或其他方法

获得多个函数的执行时间而不复制并将此代码粘贴到所有函数中的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您正在做的事情称为分析。并且已经有一个great number of profilers用于.NET。不需要您重新发明轮子。

如果确实需要,可以将逻辑封装在方法中,并使这些方法在ActionFunc<T>上运行。下面是一个示例。

using System;
using System.Diagnostics;
using System.Threading;

namespace HelloConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            ProfileMethod(() => SomeLongRunningMethod(), nameof(SomeLongRunningMethod));
            var result = ProfileFunction(() => SomeLongRunningFunction(), nameof(SomeLongRunningFunction));

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        public static void ProfileMethod(Action action, string methodName)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            action();
            stopwatch.Stop();
            Console.WriteLine($"Time elapsed ({stopwatch.Elapsed}): {methodName}");
        }

        public static T ProfileFunction<T>(Func<T> function, string functionName)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            var result = function();
            stopwatch.Stop();
            Console.WriteLine($"Time elapsed ({stopwatch.Elapsed}): {functionName}");
            return result;
        }

        public static void SomeLongRunningMethod()
        {
            Thread.Sleep(1000);
        }

        public static double SomeLongRunningFunction()
        {
            Thread.Sleep(1000);
            return 3.14;
        }
    }
}

您将操作作为参数传递给配置方法。这将启动计时器,执行操作,停止计时器并写入其输出。对于函数,它会捕获结果并返回它。

请注意,我还将您的格式字符串转换为使用interpolated strings,这在大多数情况下是首选。

答案 1 :(得分:0)

无法评论: 添加@mason的答案(应该是公认的答案)

您可以删除方法中的nameof(..)参数,因为您可以通过属性action.Method.Name访问方法名称,这与Func<T>相同