gpt4 book ai didi

objective-c - 是否值得在 for 循环中预先计算条件?

转载 作者:太空狗 更新时间:2023-10-30 03:52:42 28 4
gpt4 key购买 nike

  1. 在使用 llvmgcc 编译器时,以下两个代码块在生成的机器代码方面是否存在差异?
  2. 这种优化什么时候真正值得(如果有的话)?

未优化:

for (int i=0; i<array.count; i++) {
//do some work
}

优化:

int count = array.count;
for (int i=0; i<count; i++) {
//do some work
}

编辑:我应该指出 array 是不可变的并且 array.count 在循环执行期间不会改变。

最佳答案

  1. 你真的需要自己检查一下。我的猜测是发出的代码有所不同,但这可能取决于编译器和编译器选项,当然也可能取决于 array 的定义。 .
  2. 几乎从不,假设评估 array.count与“一些工作”相比几乎总是微不足道的。不过,衡量它的方法是使用分析器(或等效工具)并观察你的程序运行时间中有多少比例花在了该行代码上。如果探查器是准确的,那是您希望通过更改它获得的最多

假设 array.count真的很慢,你碰巧知道总是会返回相同的结果,但编译器不知道。那么可能值得手动提升它。 strlen被用作示例。有争议的频率strlen 实际上在实践中很慢,但是容易制造的例子可能运行得比他们需要的慢:

char some_function(char a) {
return (a * 2 + 1) & 0x3F;
}

for (int i = 0; i < strlen(ptr); ++i) {
ptr[i] = some_function(ptr[i]); // faster than strlen for long enough strings.
}

你我都知道some_function永远不会返回 0,因此字符串的长度永远不会改变。编译器可能看不到 some_function 的定义,即使它确实看到了定义,也可能没有意识到它的非零返回性很重要。

关于objective-c - 是否值得在 for 循环中预先计算条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12816856/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com