首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查常量TRUE或FALSE会占用大量的操作时间吗?

检查常量TRUE或FALSE会占用大量的操作时间吗?
EN

Stack Overflow用户
提问于 2020-09-25 19:31:39
回答 3查看 52关注 0票数 0

以搜索算法为例,假设它是一个顺序搜索算法。他们说,程序检查的条件数量越少,算法就越快。这里的条件被认为是一些值之间的比较(比如检查值的相等性)。也就是说,如果在节目中有比较,它确实会影响节目的表现。并且这些比较的量越大,程序终止的时间就越长。

代码语言:javascript
运行
复制
while(comparison)
{body;}

但我想知道,如果没有比较作为条件,而是一些字面上的表达式,程序会如何表现,比如:

代码语言:javascript
运行
复制
while(TRUE)
{body;}

问题是:如果通过性能估计,文字条件和比较条件有多大不同?

要使这个问题更清楚,请考虑以下代码片段:

代码语言:javascript
运行
复制
while(condition)
{body;}

while(TRUE)
{        
    if (condition) break;
    body;
}

也许第三个也是如此,它与第二个非常接近:

代码语言:javascript
运行
复制
char done = 0;
while (!done)
{        
    if (condition) done++;
    else body;
}

其中哪一个是最快的?第二个和第三个的处理速度是否比第一个慢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-25 19:40:15

你不能先验地说任何关于速度的事情。C的编译器将代码翻译成许多中间语言,在每次转换过程中,它都会改变代码表示形式。如今,编译器可以对代码进行大量更改。了解最终代码性能的唯一方法是检查输出程序集。通常,现在任何编译器都会将LOOP: ... goto LOOP中的while(TRUE) {...}翻译为时间,因为它可以证明TRUE是非零的。

当使用内部函数比使用标记来表示布尔值更快时,您的问题在最小编译或简单代码解释的上下文中是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 19:43:22

在这个简单的例子中,assembly output是完全相同的:

代码语言:javascript
运行
复制
void f1()
{
    int value = 1;
    while(value) {
        scanf("%d", &value);
    }
}

void f2()
{
    int value = 1;
    while(1) {
        if(value == 0)
            break;
        scanf("%d", &value);
    }
}

因此它们具有相同的性能。

如果有疑问,请使用编译器资源管理器比较汇编代码。或者使用分析器。

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 20:01:22

通常,如果编译器可以在编译时确定条件,则它会生成“总是分支”指令,其本身比“如果设置分支”/“如果相等则分支”等指令略快。

但更重要的是,“总是分支”意味着CPU的分支预测功能不需要推测它下一步将执行哪些指令。它可以将即将到来的代码从程序内存加载到预取指令高速缓存中,这是很快的。

而“分支如果设置”将意味着分支预测将推测并冒险执行哪些代码,如果猜错了,代码将不得不从程序存储器而不是高速缓存加载,这要慢得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64063308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档