Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和汇编中的goto语句是否会破坏引用的局部性从而降低性能?_C_Assembly_Goto - Fatal编程技术网

C和汇编中的goto语句是否会破坏引用的局部性从而降低性能?

C和汇编中的goto语句是否会破坏引用的局部性从而降低性能?,c,assembly,goto,C,Assembly,Goto,我用C编写了一个程序,从一本书中选择txt文件格式的随机单词,然后使用goto语句逐个打印出来。当我运行程序时,大约需要2到3分钟才能开始运行。goto语句是否会破坏引用的局部性并显著降低性能?汇编中的jmp是否也起到了破坏引用位置的作用?最终所有流控制都会导致某种形式的跳转。大多数只在局部跳转,因此不会破坏局部性。如果您的程序需要几分钟启动,您可能会让它在执行其他操作之前先读取(大的?)文本文件。用一个小文件试试,看看它是如何运行的。这是一个非常模糊的问题。Gotos可能会损害局部性,也可能不

我用C编写了一个程序,从一本书中选择txt文件格式的随机单词,然后使用goto语句逐个打印出来。当我运行程序时,大约需要2到3分钟才能开始运行。goto语句是否会破坏引用的局部性并显著降低性能?汇编中的jmp是否也起到了破坏引用位置的作用?

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

这是一个非常模糊的问题。Gotos可能会损害局部性,也可能不会,这取决于具体情况。但即使这样,也不一定是坏事。对于这种情况,您需要发布一些代码。请看以下两个示例:

案例1:

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");