gpt4 book ai didi

c++ - 你如何从紧密循环中分解出分支?

转载 作者:太空宇宙 更新时间:2023-11-04 15:08:43 25 4
gpt4 key购买 nike

我的问题是:如何在不检查用户设置的真/假以导航分支的开销的情况下向我的处理循环添加功能?循环中所有迭代的设置都相同。具有分支预测功能的现代处理器是否不需要这样做?

我的程序遵循这种模式:

  1. 用户调整设置、复选框、 slider 、数字条目。
  2. 触发更新时处理数据
    1. 将设置应用于局部变量
    2. 在大型数据集上运行循环
      • 添加 if 语句以绕过用户设置中未使用的代码。
      • 从循环中返回
    3. 返回转换后的数据

如何提前模板化或内联所有排列?

例子:

bool setting1 = true;
bool setting2 = false;
vector<float> data;

for(int i=0;i<100000;i++)
data.push_back(i);

for(int i=0;i<100000;i++) {
if (setting1)
{
doStuff(data[i]);
....
}
if (setting2)
{
doMoreStuff(data[i]);
.....
}

.... //etc
}

我知道这是一个愚蠢的例子。但我想知道当有很多分支时,什么模式会扩展。

最佳答案

为主循环使用模板。

template <bool A, bool B>
void loop() {
while (1) {
if (A) // will get compiled out if A == false
{
doStuff(data[i]);
....
}
if (B)
{
doMoreStuff(data[i]);
.....
}

.... //etc
}
}

当您更改设置时:(您可能会减少代码)

if (setting1) {
if (setting2)
loop<1,1>;
else
loop<1,0>;
}
else {
if (setting2)
loop<0,1>;
else
loop<0,0>;
}

你想留在 loop() 直到设置改变。

应谨慎使用,因为它会导致腹胀。


剖析答案(G++ O2 优化):

 %Time
46.15 0.84 0.84 fb() (blackbear)
38.37 1.53 0.69 fa() (OP)
16.13 1.82 0.29 fc() (pubby8)

关于c++ - 你如何从紧密循环中分解出分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570486/

25 4 0
文章推荐: jquery - 淡入淡出一次分页 2 个元素
文章推荐: html - 获取特定
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com