【发布时间】:2012-03-31 04:37:22
【问题描述】:
如果我有一个标准的 for 循环,是否有更有效的方法来省略某些事件?
例如:
答:
for (int i = 0; i < n; i++)
{
if (i != n / 2 && i != n / 3 && i != n / 4)
{
val += DoWork(i);
}
else
{
continue;
}
}
乙:
for (int i = 0; i < n / 4; i++)
{
val += DoWork(i); ;
}
for (int i = n / 4 + 1; i < n / 3; i++)
{
val += DoWork(i);
}
for (int i = n / 3 + 1; i < n / 2; i++)
{
val += DoWork(i);
}
for (int i = n / 2 + 1; i < n; i++)
{
val += DoWork(i);
}
C:
for (int i = 0; i < n; i++)
{
if (i == n / 2 || i == n / 3 || i == n / 4)
{
continue;
}
else
{
val += DoWork(i);
}
}
对于n = int.MaxValue,结果如下:
A 结果:57498 毫秒。
B 结果:42204 毫秒。
C 结果:57643 毫秒。
根据@Churk 的回答进行编辑。 我添加了另一个测试用例方法D如下:
D:
for (int i = 0; i < n; i = (i != n / 2 -1 && i != n / 3 -1 && i != n / 4-1) ? i+1: i+2)
{
val += DoWork(i);
}
得到以下结果:
A 结果:56355 毫秒。 B 结果:40612 毫秒。 C 结果:56214 毫秒。 D 结果:51810 毫秒。
Edit2:在循环外预先计算 n/2 n/3 和 n/4 的值后:
A 结果:50873 毫秒。 B 结果:39514 毫秒。 C 结果:51167 毫秒。 D 结果:42808 毫秒。
D 循环似乎再次接近 B 的“展开”,而 A 和 C 仍需要更多时间。
就每种方法之间的比较而言,这与我的预期相符。
我的问题是,有没有更有效的方法来做到这一点?
【问题讨论】:
-
这是您应用程序的性能瓶颈吗?听起来不太可能。
-
你不需要
else{continue;}。在C:示例中,将if语句更改为if(!(..)){ val += DoWork(i); }并完全省略else。 -
如果你做了 DoWork(0);DoWork(1);DoWork(2)...DoWork(n) 它可能会更快。
-
别在意我的回答,只是意识到它会在 for 循环遇到这些条件之一而不继续时停止。
-
是的。如果它不是硬编码的,那么值得预先计算这些表达式,例如:n/2、n/3 并为它们分配变量,而不是在循环中每次都计算它们。
标签: c# performance