如何计算具有实用程序类的方法的已用时间

Gib*_*boK 9 .net c# asp.net

我正在编写一个非常简单的实用程序类,目的是测量传入的任何方法(任何类型)执行的时间.

在我的情况下Membership.ValidateUser(model.UserName, model.Password)返回bool所以我得到一个例外.

我想如果有可能写一个这种类型的utililty类的代码示例如何解决它.是否有意义使用动态代替行动?

Tracing.Log(Membership.ValidateUser(model.UserName, model.Password), "Membership.ValidateUser");
Run Code Online (Sandbox Code Playgroud)
public static class Tracing
        {
            public static void Log(Action action, string message)
            {
                // Default details for the Log
                string sSource = "TRACE";
                string sLog = "Application";

                // Create the Log
                if (!EventLog.SourceExists(sSource))
                    EventLog.CreateEventSource(sSource, sLog);

                // Measure time Elapsed for an Action
                Stopwatch stopwatch = Stopwatch.StartNew();
                action();
                stopwatch.Stop();
                TimeSpan timeElapsed = stopwatch.Elapsed;

                // Write the Log
                EventLog.WriteEntry(sSource, "TIME-ELAPSED: " + timeElapsed .ToString() + message, EventLogEntryType.Warning, 234);
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

您当前的代码尝试执行ValidateUser并将结果用作方法参数.您希望在先执行的情况下传递操作ValidateUser.

您只需要转换方法调用以使用lambda表达式来创建委托:

Tracing.Log(() => Membership.ValidateUser(model.UserName, model.Password), 
            "Membership.ValidateUser");
Run Code Online (Sandbox Code Playgroud)

(动态类型根本不会影响这一点.)

请注意,单个方法执行的计时通常会给您带来非常嘈杂的结果,除非它是一个相当长的方法调用.通常要对您希望多次执行该方法的单个方法进行基准测试,直到您花费相当多的时间执行该方法.使用Stopwatch帮助,但它没有超越你的方法可能需要很少的滴答来完成的事实,并且如果线程被抢先,那将对结果产生不成比例的影响.

编辑:我假设您想纯粹用于基准测试.如果您尝试在实际应用程序中执行此跟踪,则需要采用创新性较低的方法.以Mini-MVC-Profiler为例.