2015-12-28 12 views
7

未使用の変数には、Elixirに_という名前を付けるのが一般的なルールです。そうすることで、その変数にバインドされているものはすべて停止します。エリクサーで "_var"を "_"に使用した場合のパフォーマンスへの影響?

しかし、無視された引数を示すために、接頭辞のアンダースコアを広く使用するパターンには、_tailという形式で気付いています(変数は何のヒントになるのかということを意図しています)。

あなたが_tailにアクセスしようとすると、このはシェルに警告を経由して、言語によって奨励されています

警告:下線変数「_tail」が設定された後に使用されています。先頭のアンダースコアは、変数の値を無視することを示します。これが意図されている場合は、変数の名前を変更してアンダースコアを削除してください。

しかし、ここにキャッチがあります。 _tailには変数がバインドされていますが、_を使用している場合は変数にバインドされていません。

これは、無視された変数に_以外の名前を付けるとパフォーマンスが低下することを意味しますか?または、エリクシールはまだ舞台裏で_を縛りますが、アクセスしようとするとエラーになりますか?

編集:アーランコンパイラは、具体的_として_*を治療するために、このケースを最適化し、したがって、オーバーヘッド、ソースが無いように見えます:http://erlang.org/doc/efficiency_guide/myths.html

+2

"実際の問題は、間違った場所や間違った時間で効率を心配するのにプログラマーが過度に時間を費やしてしまっていることであり、早すぎる最適化はプログラミングのすべての邪悪(または少なくともほとんど)の根源です。 - ドナルドクヌス。以前のコードではなく、コードでのパフォーマンスに問題があると、パフォーマンスの低下を心配します。 –

+0

@OnorioCatenacci私は、パフォーマンスを改善するために使用するのではなく、どのように動作するかにもっと関心があります。一般的に私はあなたが使用した見積もりに同意しますが、それが問題になるまで心配するのではなく、無関係な作業方法です。例えば;私はおそらくこの質問への答えを学ぶことはないだろう。 – whitfin

+0

未熟な最適化は、本当に無知な方法です。しかし、もしあなたが「フードの下で」この仕組みがどのように機能しているのかを知りたければ、Elixirのソースを見てみませんか? –

答えて

6

このようなパフォーマンスの動作について心配しないで、誰もがこの免責条項を既に与えているとすれば、答えは:変数が使用されない場合、コンパイラはそれに気付き、コンパイルされたバイトコードは単に_ 。これは、x = 1と決してxを実行しないと、コンパイラの警告が表示される同じ理由です。

+0

体重計をいただきありがとうございます。私は基礎的な力学に話す能力がより高い人が、コメントや回答を追加することを望みました。 –

5

実際のErlang(ひいてはエリクサー)での特別な動作がありますについて_変数。 これがアプリケーションのパフォーマンス上の問題であると判断しない限り、私はこれについてあまり心配しません。あなたが関数内で興味深いことをしているのであれば、バインディング変数のオーバーヘッドは完全に重要ではないと思います。

+0

私は実際に個人的な使用を求めていません。私は行動パターンにもっと関心があります。 "_tail"は "_"と同じ扱いですか? – whitfin

+0

ちょうど私のコメントはmarkdownによって殺害されたことに気づいた:) '_tail'と同じ扱い' _' :) – whitfin

+0

いいえ、そうではありません。 '_tail'は(' _'の他に)他の変数とまったく同じように扱われます。先頭のアンダースコアはコンパイラの警告のみを制御すると言うことができます。 – michalmuskala

関連する問題