1

我有以下代码(这是用于演示的部分伪代码):

void foo(...){

  //some code here
  do{
     min_item = _MAX_VALUE;
     //some code here also


    if (min_item == _MAX_VALUE)
       break;

    if (smaller_item_x == min_item){
FIRST_IS_SMALLER:
       global_queue[size++] = smaller_item_x;    
       if (next_item_x!=0){
            smaller_item_x= next_item_x;
            if (smaller_item_x > smaller_item_y)
               goto SECOND_IS_SMALLER;
       }
    }else{
SECOND_IS_SMALLER:
       global_queue[size++] = smaller_item_y;    
       if (next_item_y!=0){
            smaller_item_y= next_item_y;
            if (smaller_item_y > smaller_item_x)
               goto FIRST_IS_SMALLER;
       }
    }
  }while(true)       

据我所知,goto 在汇编程序中被翻译为 jmp,我有兴趣通过将第二个 goto 更改为类似于分支的内容(较短的命令与短跳转)来提高此过程的性能,我可能会遗漏一些东西,它可能是微不足道的,所以我很抱歉。

4

2 回答 2

7

这些天来猜测 C 编译器是非常困难的。他们经常编译成比人们直接编码更严格的汇编程序。他们也不向程序员提供将他们的优化导向这种程度的控制。

如果您想要这种级别的控制,您可能必须用汇编程序编写,而且您的代码很有可能比 C 编译器的慢。

于 2012-06-30T12:13:15.033 回答
1

这可能不是您正在寻找的答案,但它不适合评论,因此我将其粘贴在这里。

这段代码应该和你的一样,只是没有gotos,也没有引入额外的间接性。有一个额外的检查和一个switchon branchId,但编译器应该能够将它优化为一个单一的访问,甚至可能把它放在一个寄存器中。

int branchId = smaller_item_x == min_item;
while (branchId >= 0) {
    switch (branchId) {
    case 0:
        global_queue[size++] = smaller_item_y;    
        if (next_item_y != 0) {
            branchId = (smaller_item_y=next_item_y) > smaller_item_x ? 1 : -1;
        }
        break;
    case 1:
        global_queue[size++] = smaller_item_x;    
        if (next_item_x != 0) {
            branchId = (smaller_item_x=next_item_x) > smaller_item_y ? 0 : -1;
        }
        break;
    }
}
于 2012-06-30T14:32:36.663 回答