如何测试实现运行速度更快的方法

ahs*_*ele 3 c# optimization premature-optimization micro-optimization speed-test

虽然问题检查输入是否是字符串的类型已经关闭,但两个答案在我的脑海中飙升了一个微优化问题:以下哪两个解决方案会表现更好?

Reed Copsey提供了一个解决方案Char.IsLetter:

string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );
Run Code Online (Sandbox Code Playgroud)

适合使用正则表达式的解决方案,从马克·拜尔斯:

string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

不想只问里德或马克的问题我以为我会写一个快速测试来确定哪个表现更好.问题是我没有做过很多代码优化(我倾向于将代码可读性放在首位).

除了在每个运行之前和之后获取时间戳之外,还有哪些其他(更好的?)选项可以确定哪个解决方案运行得更快?

编辑

我修改了Martin的工作答案Console.WriteLine(...)并将其作为控制台应用程序运行.不确定LinqPad究竟是如何运行应用程序的,但结果大致相同:

41
178

Ree*_*sey 7

您需要这样做,使用秒表测量运行时间.此外,在分析时要记住以下几个非常重要的事项:

  1. 总是运行你的测试超过一次.第一次运行时,JIT会产生开销,时间可能会产生误导.多次运行并取平均值是一种很好的方法(例如,我经常会进行100,000次测试.)
  2. 始终在Visual Studio托管过程之外使用完整的发布版本运行测试.(默认情况下,您可以使用Ctrl + F5.)Visual Studio主机会显着影响计时.

  • 强调里德所说的话.测量时间有一些错误.例如,如果您的秒表仅精确到毫秒,但操作需要纳秒,那么您将获得非常不准确的测量.要解决此问题,您需要启动秒表,多次循环运行该方法(可能超过1000次),然后停止秒表.然后,您可以将总时间除以1000,以获得每次方法调用的时间. (2认同)