- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
llvm
或 gcc
编译器时,以下两个代码块在生成的机器代码方面是否存在差异?未优化:
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
在循环执行期间不会改变。
最佳答案
array
的定义。 .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/
我正在生成代码,其中我恰好将 n 个单词从一个内存位置复制到另一个非重叠内存位置。 n 是静态已知的。 目前,我发出大量加载指令,然后是大量存储指令,但我怀疑从 n 的某个值开始,调用 memcpy会
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
用例如下: 我有一张 map ,其中将插入一些键/值。 该程序将查询该 map ,但是在第一个查询之后,我可以保证该 map 将完全不会被修改。 因为查询的结果完全是输入的函数,所以在查询方法上放置属
Helo 伙计们,我尝试使用 Refs 并在他的内部提供 this.setState 但它给出: Maximum update depth exceeded. This can happen when
在检查事件时,使用带有 switch 或 if 的代码块是很常见的事情。如果变得简单,它可以是干净的代码,但似乎仍然有比需要更多的行,并且可以使用 lambda 进行简化。 用 if 阻止: if(a
Amazon 最近宣布在其 RDS 产品线中支持 Oracle: http://aws.amazon.com/rds/oracle/ 我想知道是否有人使用过它,或者是否有令人信服的理由将我的数据从 M
我是一名优秀的程序员,十分优秀!