Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 使用“时的性能影响”_var";超过_&引用;长生不老药?_Elixir - Fatal编程技术网

Elixir 使用“时的性能影响”_var";超过_&引用;长生不老药?

Elixir 使用“时的性能影响”_var";超过_&引用;长生不老药?,elixir,Elixir,在Elixir中,有一个通用规则,可以用\uu来命名任何未使用的变量。这样做会停止任何绑定到该变量的操作 然而,我注意到一种广泛使用的模式,即使用下划线作为前缀来表示被忽略的参数,其形式为\u tail(目的是提供关于变量是什么的提示) 如果您尝试访问\u tail,则该语言会通过shell中的警告鼓励您这样做: 警告:带下划线的变量“\u tail”在设置后使用。前导下划线表示应忽略变量的值。如果有意这样做,请重命名变量以删除下划线 但这里有一个陷阱\u tail将变量绑定到它,而仅使用\u时

在Elixir中,有一个通用规则,可以用
\uu
来命名任何未使用的变量。这样做会停止任何绑定到该变量的操作

然而,我注意到一种广泛使用的模式,即使用下划线作为前缀来表示被忽略的参数,其形式为
\u tail
(目的是提供关于变量是什么的提示)

如果您尝试访问
\u tail
,则该语言会通过shell中的警告鼓励您这样做:

警告:带下划线的变量“\u tail”在设置后使用。前导下划线表示应忽略变量的值。如果有意这样做,请重命名变量以删除下划线

但这里有一个陷阱
\u tail
将变量绑定到它,而仅使用
\u
时则不绑定

这是否意味着在使用
\uuuu
以外的任何名称命名被忽略的变量时会有性能损失?或者Elixir是否仍在幕后绑定
,只是在尝试访问时出错


编辑:看起来Erlang编译器专门优化了这种情况,将
.*
视为
.
,因此没有开销,来源:

事实上,
.
变量在Erlang中有特殊的行为(因此是Elixir)。
但是,除非您认为这是应用程序的性能问题,否则我不会对此太担心。我认为如果你在函数中做一些有趣的事情,绑定变量的开销将是完全不重要的。

鉴于每个人都已经声明不必担心这种性能行为,答案是:如果不使用变量,编译器会注意到它,编译后的字节码会简单地忽略它,就好像您使用了
\uuu
。这也是为什么如果你做了
x=1
而从不做
x
,你会收到编译器警告的原因。

“真正的问题是程序员花了太多时间在错误的地方和错误的时间担心效率;过早优化是编程中所有罪恶(或至少大部分)的根源。”--唐纳德·克努斯。当您在代码中发现性能问题时,而不是之前,请担心性能损失。@OnorioCatenacci我更感兴趣的是它是如何工作的,而不是现在使用它来提高性能。一般来说,我同意你所说的话,但是在事情变成问题之前不担心它是一种相当无知的工作方式。例如我可能永远也学不到这个问题的答案,因为我怀疑任何东西都不值得如此仔细地研究性能。@OnorioCatenacci完全同意如果您的代码不工作,那么它就不值得。您描述的过程中,我基本上处于快速完成的最后阶段,但客户就是我自己(附带项目)。这就是为什么我要问上面的问题——但这只是因为我想知道它到底有什么不同(如果有的话),而不是怀疑它有什么特殊的问题。顺便说一句,在Elixir Core邮件列表的这个帖子中有一些关于“var vs.”的讨论:我不确定这是你要找的,但是FWIW。啊,好的。我当时确实误解了你问题的本质@zackehh。我对误解表示歉意。我不是真的要求个人使用,我更感兴趣的是行为模式——例如,“tail”是否被视为“相同”?刚刚注意到我的评论被打了个折扣:)
\u tail
被视为
\u
:)不,不是
\u tail
与任何其他变量(除
\u
外)的处理方式完全相同。可以说,前导下划线只控制编译器警告。感谢您的参与。我希望有能力与潜在的机制对话的人能添加评论或回答。