7

Googleの今後のDASH/DART言語に関する記事を読みましたが、これは非常に興味深いものでした。

私が偶然見つけたのは、JavaScriptに固有のパフォーマンスの問題を取り除くと彼らが言っていることです。しかし、これらのパフォーマンスの問題は正確には何ですか?本文には例はありません。これはそれが言うすべてです:

  • パフォーマンス-Dashは、パフォーマンス特性を念頭に置いて設計されているため、すべてのEcmaScriptVMに必要なパフォーマンスの問題がないVMを作成できます。

それらの固有のパフォーマンスの問題が何であるかについて何か考えがありますか?

4

3 に答える 3

8

このスレッドは、動的言語のジャスト イン タイム コンパイラに関心がある人は必読です: http://lambda-the-ultimate.org/node/3851

このスレッドの参加者は、luajit の作成者、pypy の人々、Mozilla の JavaScript 開発者などです。Mike Pall のコメント (luajit の作成者) と、特に javascript と python に関する彼の意見に特に注意してください。彼は、言語設計がパフォーマンスに影響を与えると言います。彼は単純さと直交性を重視し、たとえば JavaScript を悩ませているクレイジーなコーナー ケースを回避しています。

そこでは、さまざまなテクニックやアプローチが議論されています (トレース jit、メソッド jit、インタープリターなど)。見てみな!

ルイス

于 2011-09-26T22:13:47.617 に答える
6

この記事では、JavaScript などの非常に動的な言語に加えて、プロトタイプの継承に起因する最適化の問題について言及しています。

Ruby や JavaScript などの言語では、プログラムの構造が実行時に変化する可能性があります。クラスは新しいメソッドを取得でき、関数は eval() で存在することができます。これにより、構造が設定されることが保証されないため、ランタイムがコードを最適化することが難しくなります。

プロトタイプの継承は、従来のクラスベースの言語よりも最適化が困難です。これは、クラスベースの VM に関する長年の研究と実装の経験があるためだと思います。

興味深いことに、V8 (Chrome の JavaScript エンジン) は最適化戦略の一部として隠しクラスを使用します。もちろん、JS にはクラスがないため、V8 ではオブジェクトのレイアウトがより複雑になります。

V8 のオブジェクト レイアウトでは、ヘッダーに最低 3 語が必要です。対照的に、Dart VM はヘッダーに 1 語しか必要としません。Dart オブジェクトのサイズと構造は、コンパイル時に認識されます。これは、VM 設計者にとって非常に便利です。

別の例: Dart には、実際のリスト (別名配列) があります。固定長のリストを使用できます。これは、JavaScript の実際には配列ではなく、常に可変長であるよりも最適化が容易です。

このプレゼンテーションで Dart (および JavaScript) を効率的なコードにコンパイルする方法について詳しくは、http ://www.dartlang.org/slides/2013/04/compiling-dart-to-effective-machine-code.pdf をご覧ください。

もう 1 つのパフォーマンスの側面は、起動時間です。Web アプリが複雑になるにつれて、コードの行数が増えます。JavaScript の設計では、コードの解析と読み込みによってコードも実行されるため、起動の最適化が難しくなっています。Dart の言語は、解析が迅速に行えるように慎重に設計されています。Dart は、ファイルをロードして解析するときにコードを実行しません。

これは、Dart VM が解析済みファイルのバイナリ表現 (スナップショットと呼ばれる) をキャッシュして、起動をさらに高速化できることも意味します。

于 2013-04-27T03:27:40.410 に答える
5

1 つの例は、テール コールの削除です (高パフォーマンスの関数型プログラミングに必要であると考える人もいると思います)。GoogleのV8 Javascript VM に対して機能要求が提出されましたが、これが応答でした。

テール コールの除去は、実際に使用されている JavaScript と互換性がありません。

于 2011-09-25T15:24:01.120 に答える