c# - 我该怎么做才能使这个循环运行得更快?

标签 c# performance for-loop

我有这个简单的循环:

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/

相关文章:

c# - 如何使用相对路径指向我希望将数据从中导入数据模型的文件?

c# - signalR性能游戏数据实时刷新

c# - 如何使用嵌套 for 循环对数组元素进行排序?

c# - 你能在 IF 语句中测试一系列值吗

c# - MVVMCross ValueConverter Bool 到 MvxColor/Color

javascript - 我可以做些什么来减少 HTML 页面的加载时间?

r - 将在 for 循环中创建的多个 ggplots 保存到单个图

javascript - 在 if 语句中循环遍历数组以检查是否所有值都通过

c# - 绑定(bind)未按预期更新

python - 为什么使用 Python mmap 模块比从 C++ 调用 POSIX mmap 慢得多?