c# - 奇怪的性能行为

标签 c# .net string performance

我使用的是 Visual Studio 2010 SP1,目标框架是 2.0,平台目标:任何 CPU,在 Windows 7 x64 SP1 下测试。

我遇到了奇怪的性能行为。

如果没有 app.config,或者使用以下 app.config,它会使我的程序运行缓慢(秒表显示 ~0.11 秒)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

以下 app.config 使我的程序运行速度提高了 5 倍(秒表显示约 0.02 秒)

<?xml version="1.0"?>
<configuration>
  <startup >
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>

这是测试程序代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        while (true)
        {
            sw.Reset();
            sw.Start();

            for (int i = 0; i < 1000000; i++ )
            {
                "blablabla".IndexOf("ngrhotbegmhroes", StringComparison.OrdinalIgnoreCase);
            }

            Console.WriteLine(sw.Elapsed);
        }
    }
}

我坐了几个小时,无法弄清楚这里发生了什么。 你有什么想法吗?

最佳答案

听起来您刚刚发现 .NET 4 快得多的情况。默认情况下,您的应用程序使用其构建的目标框架运行。当您强制它使用 .NET 4 时,它会更快。这可能是 JIT 编译器的改进,恰好符合您的情况,或者它可能是框架的改进 - 但有些事情在新版本中更快也就不足为奇了。

(就其值(value)而言,如果我是你,我会增加你计时的迭代次数......在我的 .NET 4 盒子上,每次迭代只有 10 毫秒,这并不是一个很好的选择测量。我更喜欢基准测试至少几秒钟。)

(和 Mitch 一样,我可以确认我看到了相同的效果。)

编辑:我刚刚对此进行了进一步调查,并看到了一个有趣的效果......我假设我们正在调用 haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase):

  • 在 .NET 2 上,无论“针”有多大,结果都大致相同
  • 在 .NET 4 上:
    • 如果 needlehaystack 大(根据您的示例).NET 4 比 .NET 2 快得多
    • 如果 needlehaystack 大小相同,.NET 4 比 .NET 2 慢一点一点
    • 如果 needle 小于 haystack,.NET 4 比 .NET 2 慢 很多

(这是在测试 needle 的第一个字符从未出现在 haystack 中,顺便说一句。)

关于c# - 奇怪的性能行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544438/

相关文章:

java - String 类如何覆盖 + 运算符?

c# - ASP.net Identity Framework - 重新发送确认电子邮件

c# - 订阅 ObservableCollection 项目属性已更改 - WPF

asp.net - 网站从 ASP .NET 2.0 升级到 3.5

.net - C++/CLI 中的垃圾收集

c++ - 将map <string,int>保存到文本文件

c# - 在非 ASP.Net 应用程序中加密连接字符串

c# - 使用 X509 证书从 XML 文件中提取公钥?

.net - 什么 groupbox 方法(如果有)监视单选按钮选择?

python - 将由字母和数字组成的字符串分成几部分