【问题标题】:Erlang performance - parameter passing/inliningErlang 性能 - 参数传递/内联
【发布时间】:2011-07-30 12:41:30
【问题描述】:

这是一个简单的问题。这是我在空闲时间慢慢阅读的这本书的练习代码,它检查(不平衡的)二叉树是否有序(例如左

对于is_ordered函数,可以为每个组合写出所有带有嵌套记录的子句,并去掉compare_nodes;但是使用 compare_nodes 后代码看起来更清晰。问题是,没有 compare_nodes 的代码会更快,还是编译器足够聪明,可以以其他方式跟踪 const 正确性/优化 compare_node(对于现实世界的代码,不仅仅是这个简单的例子)?

-record(node, {l=false,r=false,v}).

is_ordered(false) -> true;
is_ordered(#node{l=L,r=R} = N) -> 
    compare_nodes(L,N) and compare_nodes(N,R) and is_ordered(L) and is_ordered(R).

compare_nodes(L,R) when L == false; R == false -> true;
compare_nodes(#node{v=LV},#node{v=RV}) -> LV =< RV.

【问题讨论】:

    标签: performance erlang


    【解决方案1】:

    我不确定哪个版本会更快。

    找出答案的最佳方法是同时尝试并衡量。

    但始终优先考虑更清晰和更简洁的代码。仅当您遇到性能问题时,首先分析瓶颈所在,然后对其进行优化。

    在我看来,另一个建议的版本有很多重复的代码。违反 IMHO 非常重要的“Once and only once”规则只能通过真正显着的性能提升来证明。

    别忘了:

    “我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源”(D. Knuth)

    【讨论】:

      【解决方案2】:

      对于内联,请参阅compile module documentation

      【讨论】:

        猜你喜欢
        • 2013-04-06
        • 2011-11-29
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2010-10-08
        • 1970-01-01
        • 2011-11-10
        相关资源
        最近更新 更多