CoffeeScript配列の理解-トレンディでスタイリッシュ、遅い

子供の頃、私は砂糖は白人の死だとよく言われました。 後で私はカロリーがカロリーであり、砂糖の危険性について話す人が材料を単に所有しないことをしばしば実感しました。

そして突然、大人を怖がらせたものはすべて純粋な真実であることが判明しました。 砂糖は脳を殺し、ゆっくりとアルツハイマー病に導く恐ろしいものです。 誰も食べてはいけません。 このトピックは、Harry Taub Good Calories Bad Caloriesの本とDavid Perlmutter Grain Brainの本で詳しく説明されています。

しかし、記事はそれについてではありません。 私は最近、友人のグループがCoffeeScriptにしっかりと座っていることを発見しました。 彼らはこの事実にまったく恥ずかしくないし、その過程で不自然な喜びを経験することさえできます。 さらに、彼らはコーヒーに含まれる構文糖を使用することをためらわず、中毒になりたがっていました。

幸いなことに、私には珍しい贈り物があります。 私はいつも悪を認識しており、今回どのような服を着ていようとも。

公式ウェブサイトで慎重に(そして絶対に無料で)提供する最初の用量。 開始ページの右に、コーヒースクリプトのコードとjavascriptコードがレイアウトされており、コンパイラーはそれを変換します。

私たちは人々に彼らの義務を与えなければなりません-彼らはあなたを欺こうとはしていません。 スタートページに記載されているコードは、構文上の砂糖を永久に放棄し、一般的に海外の飲み物を飲み始める前に10回考えるほど十分です。 特に誰もが個別にコードを見ることができるので、コード全体を説明しません。 重要な部分のみを提供します。

CoffeeScript


Javascript


cubes = (math.cube num for num in list) 

 cubes = (function() { var i, len, results; results = []; for (i = 0, len = list.length; i < len; i++) { num = list[i]; results.push(math.cube(num)); } return results; })(); 


listは配列であり、math.cubeは、ご想像のとおり、キューブへの入力パラメーターを上げる関数です。

Javascriptコードは悪夢です


もちろん、彼の正しい心と明るい記憶の誰もそのようなコードを自分で書くことはありませんでした。 この複数文字の背後には、シンプルで有名なデザインがあります。

cubes = list.map(math.cube);

ちなみに、これはコーヒーマンオプションよりも明確で短くなっています。

そして問題は何ですか


はい、審美的な観点から、javascriptコードはひどいですが、仲間にこれをほのめかしたとき、彼らはこれが普通の人には読めないエキゾーストコンパイラであると合理的に反対しました。 それどころか、このコードを見て、自分でコードを書く必要がないことを喜んでいる必要があります。

視点は新しいものではなく、たとえばビョルン・ストラウストルプなどのモンスターによって実際に繰り返し確認されています。 コンパイラーが妨害を打たない場合は、それを信頼し、リラックスして楽しんでください。

ただし、上記のコードを一目見れば、砂糖を見るとコンパイラが気を失っていることに気付くのに十分です。 まず、ポストインクリメンタルオペレータが目を引きますが、もちろん、彼は天候をしません。

実際の問題は、コンパイラによって生成されたコードがcubes = list.map(math.cube);の約3倍遅いことです。 。 はい、まったくその通りです。砂糖を徹底的に投入したため、コードを3回完全にフリーズすることができます。

どうして起こった


その理由は単純であり、恥ずべき傾向があります。 JavaScriptで配列と呼ばれるものは、他のプログラミング言語ではハッシュと呼ばれ、ハッシュ要素へのキーによるアクセス時間は、インデックスによる配列要素へのアクセス時間と同じではありません。 一方、ハッシュ要素はリストにリンクされているため、すべての要素の順次列挙を迅速かつ簡単に行うことができます。 実際の配列の要素ほど高速でも単純でもありませんが、CoffeeScriptコンパイラによって生成されるコードよりも何倍も高速です。

たぶん、実際にさまざまなものを測定している


おそらくすでに気づいているように-cubes = list.map(math.cube); coffeeスクリプトコードと同じですが、実際には直接表示されません。 このコードは次のように正確に表示できます。

 cubes = list.reduce(function(prev, curr) { return prev.concat(math.cube(curr)); }, []); 

たぶん、新しい配列が毎回私たちに返されるということでしょうか? たぶん、すべてが.pushにあり、配列を成長させる必要があるのでしょうか? まあ、つまり、これが不可能であることは明らかですが、突然ですか? たぶんあなたはする必要がありますか?

 list.reduce(function(result, curr) { result.push(math.cube(curr)); return result; }, []); 

これは通常、1対1のマッピングであり、検索以外のすべてはオリジナルから取得されます。 ただし、そのようなコードでも、CoffeeScriptヘッダーページのコードよりも3倍高速です。

しかし、あなたはもっと真実になることができます


それとも、要素へのアクセスだけではありませんか? 配列の要素の値を要約するだけで、新しい配列にシフトしないようにしましょう。

このコードを比較してください:

 var sum = (function(list) { var i, len, sum = 0; for (i = 0, len = list.length; i < len; i++) { var num = list[i]; sum += num; } return sum; }(list)); 

これでこれ:

 var sum = list.reduce(function(prev, curr) { return curr + prev; }, 0); 

結果はそれほど明確ではありません。 しかし、javascriptの方が有利なのはまだ1.5倍です。

そのようなこと


私の観点からは、玄関先のテクノロジーがそのようなアプリケーションの作成に失敗した場合、これは使用を開始する前に真剣に考える機会です。 もちろん、CoffeeScriptに長い間ふけると、それがあなたを喜ばせたなら-ふけり続けます-コーヒー自体はまだ誰も殺していません。 特に、ラムダは問題なくCoffeeScriptで使用でき、コンパイラがラムダに変換することを考慮すると、ラムダは速度が問題にならないことがわかりました。

しかし、砂糖では、少なくともその種類のいくつかでは、結び付ける方が良いです-砂糖はyaにとって悪いです。

PS


こちらのテストコードをご覧ください

更新する


この記事に記載されている情報は、ノードバージョンv0.10.40に対して有効です。 ノードの最新バージョンとブラウザーの最新バージョンでは、図が異なります。 Chromeバージョン45では、CoffeeScriptで生成されたコードは遅くなりますが、fi foxでは高速になります。 より多くの統計を収集する必要がありますが。

Source: https://habr.com/ru/post/J268753/


All Articles