我有这个简单的循环:
int[] array = new int[100000000];
int sum = 0;
for (int i = 0; i < array.Length; i++)
sum += array[i];
我将其性能与其 C++ 版本进行了比较。我虽然性能应该接近相同,因为它是非常简单的代码并且在这种情况下省略了范围检查。但事实证明,C++ 版本几乎快了三倍。所以我实现了 C# 不安全版本,但性能更差。 Resharper 建议将循环转换为 linq 表达式,如下所示:
sum = array.Sum();
该代码比 C# 中的原始循环慢很多倍
有人能告诉我是否可以做更多的事情来提高这个循环的性能(无需将其编译为 64 位版本 - 速度快两倍)。
所有测试都是在 32 位发布版本上进行的,并且在没有调试器的情况下运行。
编辑: 小更正。 64 位版本是 double 的两倍,而不是整数
最佳答案
var watch = new Stopwatch();
int[] array = new int[100000000];
for (int i = 0; i < array.Length; i++)
{
array[i] = 1;
}
watch.Restart();
int sum = 0;
for (int i = 0; i < array.Length; i++)
sum += array[i];
Console.WriteLine("for loop:" + watch.ElapsedMilliseconds + "ms, result:" + sum);
sum = 0;
watch.Restart();
sum = array.Sum();
Console.WriteLine("linq sum:" + watch.ElapsedMilliseconds + "ms, result:" + sum);
sum = 0;
watch.Restart();
int length = array.Length;
for (int i = 0; i < length; i++)
sum += array[i];
Console.WriteLine("for loop fixed:" + watch.ElapsedMilliseconds + "ms, result:" + sum);
sum = 0;
watch.Restart();
foreach (int i in array)
{
sum += i;
}
Console.WriteLine("foreach sum:" + watch.ElapsedMilliseconds + "ms, result:" + sum);
sum = 0;
watch.Restart();
sum = array.AsParallel().Sum();
Console.WriteLine("linq parallel sum:" + watch.ElapsedMilliseconds + "ms, result:" + sum);
Linq Parallel 似乎至少在我的机器上速度很快。
固定长度并不重要,但会提高 ~10%
实际上您无能为力,非托管 C 代码在这方面总是更快。
我电脑上的结果是:
for loop: 241ms, result:100000000
linq sum: 559ms, result:100000000
for loop fixed:237ms, result:100000000
foreach sum: 295ms, result:100000000
linq parallel: 205ms, result:100000000
关于c# - 我该怎么做才能使这个循环运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347190/