代码之家  ›  专栏  ›  技术社区  ›  Ash Burlaczenko

所有语言-程序效率

  •  3
  • Ash Burlaczenko  · 技术社区  · 15 年前

    考虑这些选项

    if(successful)
    {
        if(condition)
        {
           //do something
        }
        if(condition)
        {
           //do something
        }
        ...
    }
    

    if(successful)&&(condition)
    {
       //do something
    }
    if(successful)&&(condition)
    {
       //do something
    }
    ...
    

    效率有什么不同吗?

    提前谢谢。

    4 回复  |  直到 15 年前
        1
  •  8
  •   Dirk Vollmar    15 年前

    这完全取决于评估风险的代价有多大 successful 表情。

    您还应该注意,这两个版本在语义上并不等价,因为if表达式的求值可能有副作用 1

    如果您确实面临性能问题,那么 量,别猜

    1 为了解释评论中的一个问题,下面是一个简单的示例,您将得到不同的行为:

    方法 CreateProcess 具有启动新进程的副作用,并通过返回 true :

    bool CreateProcess(string filename, out handle) { ... } 
    
    if (CreateProcess("program.exe", out handle))
    {   
        if (someCondition)
        {
             handle.SomeMethod(...);
        }
        if (someOtherCondition)
        {
             handle.SomeOtherMethod(...);
        }
    }
    

    这与以下情况大不相同:

    if (CreateProcess("program.exe", out handle) && someCondition)
    {
        handle.SomeMethod(...);
    }
    if (CreateProcess("program.exe", out handle) && someOtherCondition)
    {
        handle.SomeOtherMethod(...);
    }
    
        2
  •  10
  •   JUST MY correct OPINION    15 年前

    这有两个正确答案。其他一切都是胡说八道。

    1. 不要再担心像这样的微优化,除非你已经证明了它们的必要性。这只能通过测量并确认您正在查看的代码是一个瓶颈来实现。(提示:你对这类事情的直觉几乎都是错误的,但也不完全是错误的。)
    2. 如果您已经成功地证明了您的代码是一个瓶颈,请尝试这两种方法并测量结果。这里没有人能够为您回答这个问题,除非他们碰巧有相同的硬件在相同的操作系统上运行,并且使用相同的编译器进行编译。

    如果需要的话 . 其他一切都是胡说八道。

        3
  •  1
  •   Niki    15 年前

    两者都是O(1)。其他的一切都取决于您使用的语言/编译器/优化器。

        4
  •  0
  •   Community Mohan Dere    8 年前

    让我先声明我完全同意 JMcO

    然而,我发现思考这些差异会很有趣。(可能是因为我在一个编译器上工作,其中关于优化(输出)的语句必须提前完成,并且不是基于度量,而是基于对编译器的一般用法的假设/知识)

    你的问题没有一个答案,只是有许多方面可能会影响性能。

    • 成功是一个值还是一个方法调用
    • 编译器是否为&创建短路;&操作(如果lhs为假,则退出)或它是否始终评估&的右侧和左侧;&

    这个列表可能会被拉长,但我的观点是,尽管考虑什么会影响性能是很有趣的,但是如果不了解构建和执行环境,基本上不可能预测性能

    推荐文章