如何测试方法实现更快
-
26-09-2020 - |
题
虽然问题检查输入是否为字符串的类型已关闭两个答案在我脑海中飙升了微优化问题:以下哪种解决方案中的哪一个更好?
reed copsey 提供了一个使用Char.IsLetter
:
解决方案
string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );
.
适应解决方案使用regex 来自 mark byers :
string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
.
不想询问芦苇或标记的问题我认为我会写一个快速测试来确定哪个表现更好。问题是我没有做过大量代码优化(我倾向于将代码可读性放在其他方面)。
除了在每个运行之前和之后采取时间戳,还有一些(更好的?)确定哪些解决方案运行速度的速度更快?编辑
我修改了 martin的答案工作使用Console.WriteLine(...)
并作为控制台应用程序运行。不确定如何 linqpad 运行应用程序,但结果大致相同:
41 178.
解决方案
您将要这样做,使用秒表。此外,这里有一些非常重要的事情,以便在剖析时要记住:
- 始终运行您的测试超过1次。第一次运行它时,JIT将出现开销,并且时间可能会误导。多次运行,平均是一种很好的方法(例如,我经常运行这样的测试,例如这10万次。)
- 始终使用完全发布构建,在Visual Studio托管过程之外运行您的测试。(默认情况下,您可以使用Ctrl + F5为此。)Visual Studio主机显着影响时间。
其他提示
您应该查看System.Diagnostics.Stopwatch
!
http://msdn.microsoft.com/zh-us / library / system.diagnostics.stopwatch.aspx
你应该在循环中多次运行该次数以减少定时错误和其他无法控制的因素。
希望有帮助。
我只是把它放在 linqpad 中作为我如何做到的一个例子(因此调用转储() - 如果您没有使用此方便的工具,请替换为console.writeline(...))。
看起来Linq方式略高于四倍以上:
System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();
stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();
.
输出:
47
196
. 有一个system.diagnostics.stopwatch类可以使用。
无论您测试的代码如何,运行一次测试一次以删除JIT成本,然后再次运行最终时间。由于PC上的其他因素,大多数单独的时序计数可能是不成绩 - 因此运行许多迭代,然后从中计算平均运行时。
使用system.diagnostics.stopwatch类。
启动秒表并运行几千次迭代,停止它并检查已过度的总毫秒(>)
确定哪个更快的步骤: -
-
获得一系列计算机,几百个应该做,AMD / Intel /其他,32位/ 64位,...
-
安装您关心的每个.NET Framework您在每个(依次)
-
尝试编译的优化选项的每个组合(依次)
-
使用秒表来测试每个
的大运行
-
监视每个的内存利用率,因为它可能对应用程序的其余部分产生更大的影响。以增加的内存消耗节省一些循环,更加垃圾收集活动通常是“优化”差。
可能为您提供一些关于该速度更快的想法,至少对于编译器的当前版本。用每个新版本重复编译器。