我使用的是 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 上:
- 如果
needle
比haystack
大(根据您的示例).NET 4 比 .NET 2 快得多 - 如果
needle
与haystack
大小相同,.NET 4 比 .NET 2 慢一点一点 - 如果
needle
小于haystack
,.NET 4 比 .NET 2 慢 很多
- 如果
(这是在测试 needle
的第一个字符从未出现在 haystack
中,顺便说一句。)
关于c# - 奇怪的性能行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544438/