gpt4 book ai didi

c# - 如何计算具有实用程序类的方法耗时

转载 作者:太空狗 更新时间:2023-10-29 17:50:51 28 4
gpt4 key购买 nike

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

在我的例子中 Membership.ValidateUser(model.UserName, model.Password) 返回 bool 所以我得到一个异常。

我希望能不能写一个这种类型的实用程序类以及一个关于如何修复它的代码示例。使用动态而不是 Action 是否有意义?

Tracing.Log(Membership.ValidateUser(model.UserName, model.Password), "Membership.ValidateUser");

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

最佳答案

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

您只需将方法调用转换为使用 lambda 表达式来创建委托(delegate):

Tracing.Log(() => Membership.ValidateUser(model.UserName, model.Password), 
"Membership.ValidateUser");

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

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

编辑:我假设您只想将其用于基准测试。如果您尝试在实际应用程序中执行此跟踪,您将需要一种侵入性较小的方法。看Mini-MVC-Profiler例如。

关于c# - 如何计算具有实用程序类的方法耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385360/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com