我有以下内容:
public class Logger
{
public static void LogStartMethod(MethodBase method)
{
Console.WriteLine("{0} Method '{1}' started", DateTime.Now, method.Name);
}
public static void LogStartMethod1()
{
StackTrace stackTrace = new StackTrace();
MethodBase method = stackTrace.GetFrame(0).GetMethod();
LogStartMethod(method);
}
public static void LogStartMethod2()
{
MethodBase method = MethodBase.GetCurrentMethod();
LogStartMethod(method);
}
}
我想确定LogStartMethod1或LogStartMethod2之间性能最佳的方法......
让我们对具体方法的作用进行抽象,但是有一个工具(在线或Visual Studio加载项)能够比较两种方法的性能吗?
我现在有很多商业性能分析器...我们应该支付或使用Visual Studio Ultimate来为整个解决方案提供性能工具....
我想比较两种方法,一切都是......
答案 0 :(得分:4)
StopWatch
课程可以衡量速度
在测试之前调用StopWatch.Start
,之后调用StopWatch.Stop
。
请记住在发布模式下运行速度测试,而不是调试模式。
答案 1 :(得分:2)
我现在可以告诉你,任何组装堆栈跟踪的东西都会慢于类似的(tm)代码。
获取调用方法名称的最快方法是使用System.Runtime.CompilerServices.CallerMemberName
属性。编译代码时,编译会将方法名称作为字符串文字插入。它非常快,但需要C#.5
这是我经过试验和测试的性能代码,其中包含示例方法以演示此问题:
class Program
{
static void Main(string[] args)
{
Dictionary<string, Action> tasks = new Dictionary<string, Action>();
List<string> results = new List<string>();
tasks.Add("Task 1", Task1);
tasks.Add("Task 2", Task2);
tasks.Add("Task 3", Task3);
string input = "This is a sample string";
int count = 9999;
Console.Write("Warming up...");
foreach (var item in tasks.Values)
{
item();
}
Console.WriteLine("Done.");
Console.WriteLine();
Console.WriteLine();
foreach (var item in tasks)
{
var time = RunPerf(item.Key, count, item.Value);
results.Add(string.Format("{0}\t\t{1}", item.Key, time));
}
Console.WriteLine();
Console.WriteLine("RESULTS");
foreach (var item in results)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
public static void Task1()
{
StackTrace stackTrace = new StackTrace();
MethodBase method = stackTrace.GetFrame(0).GetMethod();
LogStartMethod(method);
}
public static void Task2()
{
MethodBase method = MethodBase.GetCurrentMethod();
LogStartMethod(method);
}
public static void Task3()
{
LogStartMethod();
}
public static void LogStartMethod(MethodBase method)
{
Console.WriteLine("{0} Method '{1}' started", DateTime.Now, method.Name);
}
public static void LogStartMethod([System.Runtime.CompilerServices.CallerMemberName]string methodName = null)
{
Console.WriteLine("{0} Method '{1}' started", DateTime.Now, methodName);
}
static TimeSpan RunPerf(string name, int count, Action action)
{
var sw = new System.Diagnostics.Stopwatch();
Console.WriteLine(string.Format("Starting perf for {0}. {1} times", name, count));
sw.Start();
for (int i = 0; i < count; i++)
{
action();
}
sw.Stop();
Console.WriteLine(string.Format("{0} completed in {1}", name, sw.Elapsed));
return sw.Elapsed;
}
}
注意。请务必在发布中运行此代码。它需要 C#5。我建议使用.net 4.5项目
RESULTS
Task 1 00:00:00.7226149
Task 2 00:00:00.5001454
Task 3 00:00:00.4690296
答案 2 :(得分:1)
VS 12 Ultimate:查看菜单项ANALYZE & Start Performance Analysis
---它提供了有趣的反馈,不仅与2种方法相关 - 本周已经尝试过,结果对于当前状态和未来都非常有成果一些编码问题的方向。
答案 3 :(得分:1)
我建议在两个解决方案上使用 Performance Counters ,一个使用方法LogStartMethod1
,另一个使用LogStartMethod2
。连续几分钟调用此方法,并观察% Processor Time
和.NET CLR Memory
等计数器的运行过程,当然还要测量方法执行的总数。然后,您将看到时间处理差异以及CPU和内存消耗的差异。