|
|
1
14
首先,处理器具有一种称为
branch prediction
. 运行几次循环后,处理器将能够注意到
然而,在你的一条评论中,你提到过你有一个“更加复杂的bools序列”。我认为处理器可能没有内存来匹配所有这些跳转——当它返回到第一个时
编译器有能力
转换循环和if语句
它认为是更理想的形式。例如,它可能会将您的代码转换成schnaader给出的格式。这被称为
loop unswitching
. 你可以通过做来帮助它
Profile-Guided Optimization (PGO)
让编译器知道热点在哪里。(注:在海湾合作委员会,
你应该 轮廓 您的指令级代码( VTune 这将是一个很好的工具)看看if语句是否真的是瓶颈。如果它们真的是这样,并且通过查看生成的程序集,您认为编译器在PGO的情况下把它弄错了,那么您可以尝试自己提升if语句。也许模板化的代码会使它更方便:
|
|
|
2
6
我认为根本不可能进一步优化这一点。编译器足够聪明,可以知道
这在某种程度上也属于对编译器的二次猜测。除非你真的知道自己在做什么,否则最好坚持最简单的解决方案。
作为一个练习,尝试使用
|
|
|
3
5
另一种选择是:
但正如Smashery已经说过的,这是一个微优化,不会像其他优化那样加速程序。 |
|
|
4
4
从技术上讲,编译器可以优化这样的情况。 例如:
MAIN编译为(g++-o3):
如您所见,条件只计算一次,以确定要运行哪个循环。它把真正的树枝展开了一点。) 我的结论是,没有理由担心这些微优化,除非您确定编译器无法优化不断变化的布尔值的重复计算(例如,如果它是全局的,编译器如何知道它不会被函数调用修改),并且它确实是瓶颈。 |
|
|
5
1
您说用户实际上有一个设置可以将此标志设置为
一般来说,编译器只能“优化”它知道的东西。 编译时 . 这意味着:当你点击编辑器菜单中的“构建”项时。如果它可以改变,它通常不能被优化掉。 然而,这是相当容易(好,取决于你没有显示的部分)优化它远离自己。如果您被它在循环内部使用的一条汇编指令所困扰,请将if语句放在循环外部。这样,函数调用只执行一次。 |
|
|
6
0
如果您在编译时知道标志的值,则可以将不包括if语句的编译标志添加为:
|
|
|
7
0
|
|
|
BlurKid · R中for循环时结果的奇怪差异 1 年前 |
|
|
bigjdawg43 · 迭代多个数据帧中的列并有条件地执行操作 2 年前 |
|
|
xhamsterIT · 循环VBA Microsoft Excel 2 年前 |
|
|
Nico44044 · 使用for循环遍历Django模型字段 2 年前 |
|
|
chanbo chung · 如何在聚合中获得所有可能的组合 2 年前 |
|
|
Himanshu · 无法在逐行二进制搜索中迭代2D数组中的所有行 2 年前 |
|
|
stephr · 循环为多个变量选择最接近另一个日期的日期 2 年前 |