具有 i
本文关键字:循环 FOR 性能 之间 具有 | 更新日期: 2023-09-27 17:57:02
在较小程度上,带有 i<(n+1) 的 for 循环呢?(n+1) 会在循环开始时或每次迭代时被评估一次?
for(int i=0; i<(n+1); i++){
// Do something
}
for(int i=0; i<=n; i++){
//Do something
}
更新:
正如几乎每个人都建议的那样,我运行了一个简单的测试,其中包含三个循环变体 i
这可能取决于 n 的值是否在循环过程中发生变化。如果没有,我认为任何现代编译器都会缓存 n+1 的值,而不是每次迭代都计算它。当然,这不是一个保证,如果没有优化,每次都会评估 n+1。
编辑:为了回答标题问题,i
我真的怀疑这会在循环执行中产生可衡量的差异。特别是<
与<=
。如果你真的担心,你应该衡量它。
这是编译器特定的,没有语言标准定义这一点,尽管大多数编译器会尝试缓存该值(如果它被证明是不变的)。
信任编译器。尽管 c# 编译器 + JITer 不如最好的 c++ 编译器,但它仍然相当不错。 除非您使用探查器确定它导致了问题,否则您不应该花费周期来担心这些类型的微优化。 相反,写下逻辑上与你正在做的事情相匹配的东西。
(n+1)
将在非常迭代时被评估,假设它没有被编译器优化出来。
至于性能问题 - 使用 StopWatch
类很容易自己衡量。
我猜除非你的i
非常高,否则差异可以忽略不计。
本文关键字:循环 FOR 性能 之间 具有 | 更新日期: 2023-09-27 17:57:02
在
较小程度上,带有 i<(n+1) 的 for 循环呢?(n+1) 会在循环开始时或每次迭代时被评估一次?
for(int i=0; i<(n+1); i++){
// Do something
}
for(int i=0; i<=n; i++){
//Do something
}
更新:
正如几乎每个人都建议的那样,我运行了一个简单的测试,其中包含三个循环变体 i
这可能取决于 n 的值是否在循环过程中发生变化。如果没有,我认为任何现代编译器都会缓存 n+1 的值,而不是每次迭代都计算它。当然,这不是一个保证,如果没有优化,每次都会评估 n+1。
编辑:为了回答标题问题,i 我真的怀疑这会在循环执行中产生可衡量的差异。特别是<
与<=
。如果你真的担心,你应该衡量它。
这是编译器特定的,没有语言标准定义这一点,尽管大多数编译器会尝试缓存该值(如果它被证明是不变的)。
信任编译器。尽管 c# 编译器 + JITer 不如最好的 c++ 编译器,但它仍然相当不错。 除非您使用探查器确定它导致了问题,否则您不应该花费周期来担心这些类型的微优化。 相反,写下逻辑上与你正在做的事情相匹配的东西。
(n+1)
将在非常迭代时被评估,假设它没有被编译器优化出来。
至于性能问题 - 使用 StopWatch
类很容易自己衡量。
我猜除非你的i
非常高,否则差异可以忽略不计。