以搜索算法为例,假设它是一个顺序搜索算法。他们说,程序检查的条件数量越少,算法就越快。这里的条件被认为是一些值之间的比较(比如检查值的相等性)。也就是说,如果在节目中有比较,它确实会影响节目的表现。并且这些比较的量越大,程序终止的时间就越长。
while(comparison)
{body;}但我想知道,如果没有比较作为条件,而是一些字面上的表达式,程序会如何表现,比如:
while(TRUE)
{body;}问题是:如果通过性能估计,文字条件和比较条件有多大不同?
要使这个问题更清楚,请考虑以下代码片段:
while(condition)
{body;}
while(TRUE)
{
if (condition) break;
body;
}也许第三个也是如此,它与第二个非常接近:
char done = 0;
while (!done)
{
if (condition) done++;
else body;
}其中哪一个是最快的?第二个和第三个的处理速度是否比第一个慢?
发布于 2020-09-25 19:40:15
你不能先验地说任何关于速度的事情。C的编译器将代码翻译成许多中间语言,在每次转换过程中,它都会改变代码表示形式。如今,编译器可以对代码进行大量更改。了解最终代码性能的唯一方法是检查输出程序集。通常,现在任何编译器都会将LOOP: ... goto LOOP中的while(TRUE) {...}翻译为时间,因为它可以证明TRUE是非零的。
当使用内部函数比使用标记来表示布尔值更快时,您的问题在最小编译或简单代码解释的上下文中是有意义的。
发布于 2020-09-25 19:43:22
在这个简单的例子中,assembly output是完全相同的:
void f1()
{
int value = 1;
while(value) {
scanf("%d", &value);
}
}
void f2()
{
int value = 1;
while(1) {
if(value == 0)
break;
scanf("%d", &value);
}
}因此它们具有相同的性能。
如果有疑问,请使用编译器资源管理器比较汇编代码。或者使用分析器。
发布于 2020-09-25 20:01:22
通常,如果编译器可以在编译时确定条件,则它会生成“总是分支”指令,其本身比“如果设置分支”/“如果相等则分支”等指令略快。
但更重要的是,“总是分支”意味着CPU的分支预测功能不需要推测它下一步将执行哪些指令。它可以将即将到来的代码从程序内存加载到预取指令高速缓存中,这是很快的。
而“分支如果设置”将意味着分支预测将推测并冒险执行哪些代码,如果猜错了,代码将不得不从程序存储器而不是高速缓存加载,这要慢得多。
https://stackoverflow.com/questions/64063308
复制相似问题