这可能是一个天真的问题,我怀疑答案是“是的”,但我没有运气在这里和其他地方搜索“erlang编译器优化常数”等术语。
无论如何,erlang编译器能否(将)在编译时创建一个常量或文字的数据结构,并使用它而不是创建一遍又一遍地创建数据结构的代码?我将提供一个简单的玩具示例。
test() -> sets:from_list([usd, eur, yen, nzd, peso]).
编译器是否可以简单地将设置放在函数的输出处,而不是每次都计算它?
我问的原因是,我想在我正在开发的程序中有一个查找表。该表只是在编译时可以计算(至少在理论上)的常量。我想只计算一次表,而不必每次都计算它。我知道我可以通过其他方式执行此操作,例如计算事物并将其存储在流程字典中(或者可能是ets或mnesia表)。但是我总是从简单开始,对我来说最简单的解决方案就是像上面的玩具示例那样,如果编译器优化它。
如果这不起作用,还有其他方法可以实现我想要的吗? (我想我可以查看解析变换,如果它们可以用于此,但这比我想要的更复杂?)
这只是。我使用了compile:file / 2和'S'选项来生成以下内容。我不是erlang汇编专家,但看起来好像没有执行优化:
{function, test, 0, 5}.
{label,4}.
{func_info,{atom,exchange},{atom,test},0}.
{label,5}.
{move,{literal,[usd,eur,yen,nzd,peso]},{x,0}}.
{call_ext_only,1,{extfunc,sets,from_list,1}}.
答案 0 :(得分:4)
不,erlang编译器不会对set
的外部模块的调用执行部分评估。您可以使用着名ct_expand的parse_trans模块来实现此效果。
答案 1 :(得分:1)
假设该集合不是erlang的本机数据类型,并且(事实上)它只是一个用erlang编写的库,我不认为编译器在编译时创建集合是可行的。
答案 2 :(得分:1)
正如您所看到的,在erlang中没有优化集合(与在erlang中编写的任何其他库一样)。 解决问题的方法是计算一次集合并将其作为参数传递给函数或使用ETS / Mnesia。