C 和程序集中的 goto 语句会破坏引用的局部性从而降低性能吗?

Do goto statements in C and assembly break locality of reference thereby decreasing performance?

我用 C 编写了一个程序,它从 txt 文件格式的书中随机选择单词,并使用 goto 语句将它们一个一个地打印出来。当我 运行 程序启动 运行ning 大约需要 2 到 3 分钟。 goto 语句是否会破坏引用的局部性并显着降低性能?汇编中的 jmp 是否也充当 goto 中断引用的位置?

最终所有的流量控制都会导致某种形式的跳转。大多数只在本地跳转,因此不会破坏本地。如果您的程序需要几分钟才能启动,您可能会让它在执行任何其他操作之前先读取那个(大?)文本文件。用一个小文件试试,然后看看它是如何运行的。

这是一个非常模糊的问题。 Gotos 可能会损害局部性,也可能不会,这取决于具体情况。但即使这种说法成立,也不一定是坏事。对于这种情况,您需要 post 一些代码。看看这两个例子:

案例 1:

for(int i = 0; i<SIZE ; i++){
   if( strcmp(words[i],"key")==0 )
    goto end;
}

end:
    printf("FOUND!\n");

return 1;

案例 2:

int flag = 0;

for(int i = 0; i<SIZE ; i++){
   if( strcmp(words[i],"key")==0 )
    flag = 1;
}

end:
    if(flag) printf("FOUND!\n");

当然,案例 2 比第一个享有更多的局部性,但案例 1 会更有效率(即到 运行 需要更少的时间),除了 "key" 的情况在数组的最后一个位置。