【问题标题】:Performance implications when using "_var" over "_" in Elixir?在 Elixir 中使用“_var”而不是“_”时的性能影响?
【发布时间】:2015-12-28 03:55:13
【问题描述】:

在 Elixir 中有一个通用规则,用 _ 命名任何未使用的变量。这样做会阻止任何东西绑定到该变量。

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

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

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

但这里有一个问题; _tail 绑定了变量,而仅使用 _ 时没有。

这是否意味着在使用 _ 以外的任何名称命名忽略的变量时会降低性能?或者 Elixir 是否仍然在幕后绑定 _,并且在任何尝试访问时都会出错?

编辑:看起来 Erlang 编译器专门优化了这种情况,将_* 视为_,因此没有开销,来源:http://erlang.org/doc/efficiency_guide/myths.html

【问题讨论】:

  • "真正的问题是程序员在错误的地方和错误的时间花费了太多时间来担心效率;过早的优化是万恶之源(或者至少是大部分)在编程中。” ——唐纳德·克努斯。当您发现代码中的性能问题而不是之前的问题时,请担心性能损失。
  • @OnorioCatenacci 我更感兴趣的是它的工作原理,而不是目前使用它来提高性能。一般来说,我同意您使用的报价,但是在成为问题之前不担心某事是一种非常无知的工作方式。例如;我可能永远不会知道这个问题的答案,因为我怀疑任何事情都值得如此仔细地观察性能。
  • @OnorioCatenacci 完全同意,如果您的代码无法正常工作,那就不值得了。您描述的过程,我基本上处于使其快速的最后阶段 - 但客户是我自己(副项目)。这就是导致我提出上述问题的原因 - 但只是因为我想知道它实际上有什么不同(如果有的话),而不是怀疑它是否存在任何特定问题。
  • 顺便说一句,Elixir Core 邮件列表中的这个线程中有一些关于 _var 与 _ 的讨论:groups.google.com/forum/#!searchin/elixir-lang-core/underscore/… 我不确定它是否是您正在寻找的,但 FWIW。
  • 啊,好的。我确实误解了你的问题的性质然后@zackehh。对于造成的误解,我深表歉意。

标签: elixir


【解决方案1】:

鉴于每个人都已经给出了不用担心这种性能行为的免责声明,答案是:如果一个变量没有被使用,编译器会注意到它并且编译的字节码会简单地忽略它,就像你使用了@987654321 @。这就是为什么如果您执行x = 1 而从不执行x,您会收到编译器警告的相同原因。

【讨论】:

  • 感谢您的参与。我希望有更多能力与底层机制对话的人添加评论或答案。
【解决方案2】:

在 Erlang(以及 Elixir)中,_ 变量确实存在特殊行为。 但除非您测量到这是您的应用程序的性能问题,否则我不会太担心这一点。我想如果你在函数内部做任何有趣的事情,绑定变量的开销将是完全微不足道的。

【讨论】:

  • 我并不是真的要求个人使用,我对行为模式更感兴趣 - 例如“tail”是否与“”一样对待?
  • 刚刚注意到我的评论被 Markdown 扼杀了 :) _tail_ 一样对待 :)
  • 不,不是。 _tail 被视为与任何其他变量完全相同(_ 除外)。你可以说前面的下划线只控制编译器警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多