草庐IT

子分支

全部标签

c++ - 分支或乘法效率更高吗?

我正在尝试优化一个小的、经常使用的函数,它使用unsignedshortint中的高位来指示要加在一起的数组的值。起初我使用的是如下所示的明显方法。请注意,循环展开并未明确显示,因为它应该由编译器完成。inttotal=0;for(unsignedshortmask=0x0001,j=0;mask!=0;mask但是,后来我认为删除分支以帮助CPU流水线可能会更好,并提出了以下建议。inttotal=0;for(unsignedshortmask=0x0001,j=0;mask!=0;mask请注意,由于(i&mask)不会产生bool值答案,因此与0的比较会强制结果为1或0。虽然第二

c++ - 在计算中使用 boolean 值以避免分支

这是我想出的一些微优化的好奇心:structTimer{boolrunning{false};intticks{0};voidstep_versionOne(intmStepSize){if(running)ticks+=mStepSize;}voidstep_versionTwo(intmStepSize){ticks+=mStepSize*static_cast(running);}};这两种方法似乎实际上做同样的事情。第二个版本是否避免了分支(因此比第一个版本更快),或者是否有任何编译器能够使用-O3进行这种优化? 最佳答案

c++ - 使用位运算符消除分支

我在一个运行了大约2^26次的循环中有一些关键的分支代码。分支预测不是最优的,因为m是随机的。我将如何删除分支,可能使用按位运算符?boolm;unsignedinta;constunsignedintk=...;//k>=7if(a==0)a=(m?(a+1):(k));elseif(a==k)a=(m?0:(a-1));elsea=(m?(a+1):(a-1));这里是gcc-O3生成的相关程序集:.cfi_startprocmovl4(%esp),%edxmovb8(%esp),%clmovl(%edx),%eaxtestl%eax,%eaxjneL15cmpb$1,%clsbb

c++ - 分支? : operator?

对于现代硬件上的典型现代编译器,会吗?:运算符导致分支影响指令流水线?换句话说哪个更快,调用这两种情况以避免可能的分支:booltestVar=someValue();//Usedlater.purge(white);purge(black);或者选择真正需要清除的那个,并且只使用操作符?::booltestVar=someValue();purge(testVar?white:black);我知道您不知道purge()需要多长时间,但我只是在这里问一个一般性问题,即我是否愿意调用purge()两次以避免代码中可能出现分支。我意识到这是一个非常小的优化,可能没有真正的区别,但仍然想知道

c++ - 在二进制 {0, 255} 图像中找到中值时消除分支

我有一个二进制图像,二进制值是0或255。图像数据的类型是unsignedchar。这里我需要对这张图片做一个中值滤波。我认为使用直方图来查找中位数应该很快。用一些代码来解释:unsignedinthist[2]={0,0};for(inti=0;i然后,我们可以非常快速地得到中值。但是由于这种情况,代码还是可以改进的:intcounter=0;for(inti=0;i但我想知道是否有其他方法可以消除if-else分支,例如使用位操作将{0,255}映射到某个东西,这样我们就可以只更新标志而无需分支。有人有什么建议吗? 最佳答案 2

c++ - 分支预测 vs 分支目标预测

我理解的对吗,if语句更依赖于分支预测,而v-table查找更依赖于分支目标预测?关于v表,没有“分支预测”,只有目标预测?试图了解CPU如何处理v表。 最佳答案 分支预测是预测分支是否会被采用。分支目标预测是预测分支要去的地方。这两件事是独立的,可以在所有组合中发生。这些例子可能是:无条件分支,固定目标无限循环goto语句break或continue语句if/else语句的“then”子句结束(跳过else子句)非虚函数调用无条件分支,可变目标从函数返回虚函数调用函数指针调用switch语句(如果编译成跳转表)条件分支,固定目标i

c++ - 分支预测和分支目标预测优化

我的代码频繁调用具有多个(不可预测)分支的函数。在进行概要分析时,我发现这是一个较小的瓶颈,大部分CPU时间用于条件JMP。考虑以下两个函数,其中原始函数具有多个显式分支。voidbranch_example_original(void*mem,size_ts){if(!(s&7)){/*logicin_process_mem_64inlined*/}elseif(!(s&3)){/*logicin_process_mem_32inlined*/}elseif(!(s&1)){/*logicin_process_mem_16inlined*/}else{/*logicin_proces

C++:如何在模板函数中使用类型进行分支?

我对模板不是很精通。我如何编写一个名为get的模板函数,它根据模板类型选择它从中获取的数组?请参见下面的示例:structFoo{intiArr[10];charcArr[10];//Howtopickarrayherebasedontemplatetype?templateTget(intidx){//ThisdoesNOTwork!switch(T){caseint:returniArr[idx];casechar:returncArr[idx];}}};//Expectedbehaviourofget()Foofoo;inti=foo.get(2);charc=foo.get(4

c++ - 分支预测和分支目标预测之间的性能差异?

我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我努力保持代码分支自由。但我只能走这么远,这让我想知道不同类型的分支。在c++中,固定目标的条件分支:intcond_fixed(boolp){if(p)return10;return20;}并且(如果我理解thisquestion正确的话),变量目标的无条件分支:structbase{virtualintfoo()=0;};structa:publicbase{intfoo(){return10;}};structb:publicbase{intfoo(){return20;}};

c++ - 具有 void 类型分支的三元运算符

将三元运算符与返回void的函数一起使用是否安全?像这样:voidfoo1(){}voidfoo2(){}//////////////boolto_use_1=....;to_use_1?foo1():foo2();编译器可以删除这段代码吗?假设它将这些函数视为纯函数,并执行删除这些调用的积极优化 最佳答案 首先,编译器将/不应在逻辑上“删除”任何具有可观察效果的调用(copyelision除外)。无论优化模式多么激进,这都是不允许的事情。C++标准实际上明确允许条件运算符的操作数的结果为void,因此这是预期的且安全的。但是,它必