DxC*_*xCK 7 .net c# 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>
Run Code Online (Sandbox Code Playgroud)
以下app.config使我的程序运行速度提高了x5倍(秒表显示~0.02秒)
<?xml version="1.0"?>
<configuration>
<startup >
<supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0" />
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是测试程序代码:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我坐了几个小时,无法弄清楚这里发生了什么.你知道吗?
Jon*_*eet 15
听起来你刚刚发现.NET 4的速度要快得多.默认情况下,您的应用程序正在运行其构建目标的框架.当你强制它使用.NET 4时,它会更快.这可能是JIT编译器的改进,恰好碰到了你的情况,或者它可能是一个框架改进 - 但是在新版本中某些东西更快的情况应该不会太令人惊讶.
(对于它的价值,如果我是你的话,我会增加你的计时重复次数...在.NET 4下的盒子里,每次迭代只有10ms,这不是一个很好的测量.我喜欢基准测试至少几秒钟.)
(和米奇一样,我可以确认我看到同样的效果.)
编辑:我刚刚调查了一下,看到了一个有趣的效果......我假设我们正在调用haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase):
needle大于haystack(根据您的示例).NET 4比.NET 2快得多needle是的大小相同haystack,.NET 4是小比.NET 2较慢比特needle小于haystack,则.NET 4 比.NET 2慢很多(这是测试needle从未出现的第一个字符haystack,顺便说一下.)