gpt4 book ai didi

Erlang 编译器优化

转载 作者:行者123 更新时间:2023-12-03 09:30:21 25 4
gpt4 key购买 nike

我不是编译器优化专家。我什至不确定就编译器或优化而言什么是“合理的”。我只是好奇,问问题就是全部。

无论如何,我正在以这样的基本形式编写一些 Erlang 代码:

% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.

然后我对其进行了优化,以免减法两次:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.

然后我想“浪费时间 - 编译器肯定会将第一个示例优化为第二个示例。”所以我决定通过运行 compile:file 和 'S' 选项来检查两者。这是输出:
% TOY EXAMPLE 1
{function, test, 1, 15}.
{label,14}.
{func_info,{atom,exchange},{atom,test},1}.
{label,15}.
{gc_bif,'-',{f,16},1,[{x,0},{integer,1}],{x,1}}.
{test,is_lt,{f,16},[{integer,0},{x,1}]}.
{move,{atom,yes},{x,0}}.
return.
{label,16}.
{gc_bif,'-',{f,17},1,[{x,0},{integer,1}],{x,1}}.
{test,is_eq,{f,17},[{x,1},{integer,0}]}.
{move,{atom,maybe},{x,0}}.
return.
{label,17}.
{move,{atom,no},{x,0}}.
return.

% TOY EXAMPLE 2
{function, test, 1, 15}.
{label,14}.
{func_info,{atom,exchange},{atom,test},1}.
{label,15}.
{gc_bif,'-',{f,0},1,[{x,0},{integer,1}],{x,0}}.
{test,is_lt,{f,16},[{integer,0},{x,0}]}.
{move,{atom,yes},{x,0}}.
return.
{label,16}.
{test,is_eq,{f,17},[{x,0},{integer,0}]}.
{move,{atom,maybe},{x,0}}.
return.
{label,17}.
{move,{atom,no},{x,0}}.
return.

他们不一样。如果我没看错(也许我没看错),则不会执行优化。

我可以看到几种可能性:
  • 可以执行优化,我只是没有启用优化,因为我使用了错误的函数进行编译,或者没有使用正确的标志等。
  • 只是不执行优化。
  • 其他。

  • 是哪个?

    注意:请不要陷入谈论“如果您使用 case 语句,您可以执行某某”或“您可以通过执行 blah-blah 来避免这种情况”的讨论。重点只是测试 erlang 编译器执行或不执行哪些优化,以及为什么或为什么不执行。

    谢谢。

    最佳答案

    你说得对 - Beam 编译器不做任何常见的子表达式消除。原因可能是在Erlang通常用于的那种程序中,这不会有任何明显的影响,所以没有人费心去实现它。 (对于计算密集型 Erlang 代码的罕见情况,程序员通常很容易处理这个问题,就像您在第二个示例中所做的那样。)

    如果您编译为 native 代码,您可能会得到这种优化 - HiPE 编译器会付出更大的努力来生成良好的低级代码。

    关于Erlang 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9193301/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com