很久以前在stackoverflow上看到如下代码,今天忍不住解压出来。#include#include#includeintmain(){//生成数据constunsignedarraySize=32768;intdata[arraySize];for(unsignedc=0;c=128)sum+=data[c];}}doubleelapsedTime=static_cast(clock()-start)/CLOCKS_PER_SEC;std::cout<=128)sum+=data[c];在保留std::sort(data,data+arraySize)的情况下;数组data中的内容是这样的:T=branchtakenN=branchnottakendata[]=0,1,2,3,4,...126,127,128,129,130??,...250,251,252,...branch=NNNNN...NNTTT...TTT...=NNNNNNNNNNNNNNNN...NNNNNNNTTTTTTTTT...TTTTTTTTTT(easytopredict)在未排序的情况下,数组data中的内容是这样的:data[]=226,185,125,158,198,144,217,79,202,118,14,150,177,182,133,...brT,T,N,T,T,T,T,T,N,T,N,N,T,T,T,N...=TTNTTTTTNTNNTTTN...(completelyrandom-hardtopredict)即在排序在这种情况下,处理器可以更好地预测分支。因此,程序也运行得更快。在阅读有关分支预测的linux源代码时,您会发现类似if(likely()){}或if(unlikely())的语句。对于条件选择语句,gcc有内置的优化指令。当一个条件经常或很少出现时,编译器可以根据这条指令优化条件分支选择。Linux内核将这条指令封装成宏likely()和unlikely()。因此,在编写程序时,如果分支条件只是在极少数情况下出现,我们可以使用unlikely()和likely()来加快程序的运行速度,这也是优化程序的一种手段。例如:if(unlikely(statement)){//这是告诉编译器,这种情况只会在少数情况下发生dosomething();}原文链接:http://www.cricode.com/3347.html