C和汇编中的goto语句是否会破坏引用的局部性从而降低性能?
我用C编写了一个程序,从一本书中选择txt文件格式的随机单词,然后使用goto语句逐个打印出来。当我运行程序时,大约需要2到3分钟才能开始运行。goto语句是否会破坏引用的局部性并显著降低性能?汇编中的jmp是否也起到了破坏引用位置的作用?最终所有流控制都会导致某种形式的跳转。大多数只在局部跳转,因此不会破坏局部性。如果您的程序需要几分钟启动,您可能会让它在执行其他操作之前先读取(大的?)文本文件。用一个小文件试试,看看它是如何运行的。这是一个非常模糊的问题。Gotos可能会损害局部性,也可能不会,这取决于具体情况。但即使这样,也不一定是坏事。对于这种情况,您需要发布一些代码。请看以下两个示例: 案例1:C和汇编中的goto语句是否会破坏引用的局部性从而降低性能?,c,assembly,goto,C,Assembly,Goto,我用C编写了一个程序,从一本书中选择txt文件格式的随机单词,然后使用goto语句逐个打印出来。当我运行程序时,大约需要2到3分钟才能开始运行。goto语句是否会破坏引用的局部性并显著降低性能?汇编中的jmp是否也起到了破坏引用位置的作用?最终所有流控制都会导致某种形式的跳转。大多数只在局部跳转,因此不会破坏局部性。如果您的程序需要几分钟启动,您可能会让它在执行其他操作之前先读取(大的?)文本文件。用一个小文件试试,看看它是如何运行的。这是一个非常模糊的问题。Gotos可能会损害局部性,也可能不
for(int i = 0; i<SIZE ; i++){
if( strcmp(words[i],"key")==0 )
goto end;
}
end:
printf("FOUND!\n");
return 1;
用于(int i=0;i最有可能的是,您有i/O问题和/或算法复杂性问题。如何使用goto语句打印出来?您需要更详细地解释您的程序在做什么。这可能更多地取决于算法,而不是像那样的低级细节。如果您在*nix上,您可以执行时间。/u程序
来获得大致了解执行代码与执行(例如磁盘I/O)所花费的时间。(在time
输出中,real是程序花费的总时间,user是在代码中花费的CPU时间,sys是在内核中花费的CPU时间。real远高于这些时间的总和可能表明您受到磁盘I/O的限制。)@Ulfalizer我关心的不是程序的性能,而是试图了解goto和jmp语句是否破坏了引用的位置,但是感谢您提出的关于如何测试I/O与执行时间的建议,我将按照您的建议进行检查。@Urler:所有流控制构造(if
,while
,for
,goto
,等等)在机器代码级别变为(有条件或无条件)跳转,因此不可能对goto
做出笼统的陈述。
int flag = 0;
for(int i = 0; i<SIZE ; i++){
if( strcmp(words[i],"key")==0 )
flag = 1;
}
end:
if(flag) printf("FOUND!\n");