タグ付けされた質問 「v8」

V8はGoogleのオープンソースJavaScriptエンジンです。

3
未処理のプロミス拒否のソースの検索:TypeError:プロミスの連鎖サイクルが検出されました
Node.jsでPromiseからの未処理の拒否の原因を見つけようとしています --async-stack-tracesオプションを使用してノードバージョン12にアップグレードして、次の方法でそれらをリッスンしてみました。 process.on("unhandledRejection",( reason, promise ) => { console.log(reason); console.log(promise); }); しかし、原因を見つけるのに役立つスタックトレースはまだ表示されません! UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise> at process._tickCallback (internal/process/next_tick.js:68:7) (node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was …

3
最適化をオフにできるので、クロージャーからのスコープ内変数は「最適化されません」。
最近のブラウザーで行われたコード最適化の副産物として、デバッグ中に、「実際に」スコープ内にあるすべての変数を「見る」ことはできません。これはよく知られており、SOに関する前の質問で対処されています。この機能は、確かに本番環境では便利ですが、開発中に私を悩ませますが、遅くなります(それは明らかです)。 今私の質問は、この動作をオフにする方法はありますか?構成ファイルを編集できますか、それともブラウザプラグインがありますか、それともブラウザ実行可能ファイルの「開発者向けの特別なビルドバージョン」がありますか?新しいコードを書いているとき、すぐにコードをコンソールに入力するのが好きなので、これは本当に私を悩ませています。 更新/編集 これは、部分的な解決策です。Paul1365972の功績です。 次のような特別なオプションを使用して、コマンドラインからChromeブラウザを起動する必要があります。 Chromeを完全に閉じます コンソールからChromeを実行します"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" 。これは、他のWindows OSと同様です。 開発者コンソールを開いて実行し"%GetHeapUsage()"ます。オプションを使用してChromeを適切に起動した場合、番号がコンソールに記録されます。それ以外の場合は、構文エラーが発生します。 このコマンドラインフラグを使用すると%、で始まるコマンドを使用して「V8エンジンと通信」できます。これは、プレーンJavaScriptの構文エラーです。この種の使用可能なV8コマンドのリストは、Paulの回答に記載されています。 あり%NeverOptimizeFunction()、私はちょうど呼び出すことと、それを使って行うことがあるだろうことのように見えたものですそのリスト、上。残念ながら、次のスクリーンショットに示すように、その関数は私が望んでいたことをしません。 (((Paulの回答からのもう1つのリンク(v8ネイティブノードモジュール)は、このコンテキストではここでは重要ではありません。コードがクラッシュしないように、「%」関数呼び出しを1行で囲むだけです。 v8ではないブラウザー))) (((これが機能したとき(この最適化がまだ発明/実装されていないとき)を覚えています。10年前、15年前、そのようなものです。Chromeの最新バージョンは何ですか(もしそして、あなたができる最後のFirefoxバージョンは何でしたか(もっと確かにここにあります)?それはあなたに賞金をもたらすことはありませんが、もしあなたがたまたま知っていてそれを回答として投稿した場合、あなたは賛成票を得るでしょう。 。))) ソリューション PETR SRNICEKに感謝 新しい質問 ペトルのソリューションは多くのことを助けますが、完璧ではありません。この質問は長くなりすぎているので、Petrのソリューションをどのように改善できるかについて新しい質問を投稿しました。(もちろん、ここでこの質問を編集することもできますが、私が何を意味するのかを知っていれば、それは「歴史的でない」と感じるでしょう。)

1
最適化せずに高性能のJavascriptコードを書く
大きな数値配列を操作するJavascriptでパフォーマンスに敏感なコードを書くとき(線形代数パッケージ、整数または浮動小数点数を操作することを考えてください)、JITができる限り役立つことを常に望んでいます。これはおおよその意味です。 整数計算と浮動小数点計算のどちらを実行するかに応じて、常に配列をパックSMI(短整数)またはパックDoubleにする必要があります。 私たちは常に同じタイプのものを関数に渡したいので、それらが「メガモーフィック」とラベル付けされて最適化されないようにします。たとえば、常にvec.add(x, y)両方xを呼び出しyてパックされたSMI配列、または両方をパックされたDouble配列で呼び出す必要があります。 関数をできるだけインライン化したい。 これらのケースから外れると、突然の大幅なパフォーマンス低下が発生します。これは、さまざまな無害な理由で発生する可能性があります。 のような一見無害な操作を介して、パックされたSMI配列をパックされたDouble配列に変換できmyArray.map(x => -x)ます。パックされたDouble配列は依然として非常に高速であるため、これは実際には「最良の」悪いケースです。 たとえば、(予期せず)返された、nullまたはを返した関数に配列をマッピングすることにより、パックされた配列を一般的なボックス配列に変換できundefinedます。この悪いケースはかなり簡単に回避できます。 あなたはvec.add()あまりにも多くのタイプの物を渡して、それをメガモーフィックに変えることによってなど、関数全体を最適化解除するかもしれません。これは、「ジェネリックプログラミング」を実行する場合に発生する可能性vec.add()があります。これは、タイプに注意していない場合(多くのタイプが入っていることがわかる)と、最大のパフォーマンスを引き出したい場合の両方で使用されます。 (たとえば、ボックス化されたdoubleのみを受け取る必要があります)。 私の質問は、上記の考慮事項に照らして高性能のJavascriptコードを記述しながら、コードを見やすく読みやすく保つ方法についての、やさしい質問です。私が目指している答えの種類がわかるように、いくつかの特定のサブ質問: (たとえば)パックされたSMI配列の世界にとどまりながらプログラミングする方法に関する一連のガイドラインはありますか? マクロシステムのようなものを使用せずにJavaScriptで汎用の高性能プログラミングvec.add()を呼び出しサイトにインライン化することは可能ですか? メガモーフィックな呼び出しサイトや最適化解除などの観点から、高性能のコードをライブラリにモジュール化する方法を教えてください。たとえば、線形代数パッケージAを高速で楽しく使用している場合B、に依存するパッケージをインポートしますがA、Bそれを他のタイプで呼び出して最適化を解除すると、突然(コードを変更せずに)コードの実行が遅くなります。 何か良いがある使いやすい JavaScriptエンジンがタイプで、内部でやっていることを確認するための測定ツールは?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.