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"
的情况在数组的最后一个位置。
我用 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"
的情况在数组的最后一个位置。