19

C/C++ のバックグラウンドから来て、キャッシュ ミスの削減に関するオブジェクトのメモリ レイアウトは、特にコンソールで作業する場合に重要です。データ指向の設計は、オブジェクト指向の設計よりも好まれることがよくあります。これは、関連するオブジェクトをメモリ内で (特にパフォーマンスが重要な領域で) 互いに近くに保つのに役立つためです。

最近、私はいくつかの Javascript 開発を行っていますが、Javascript コミュニティー内で一般的なコンセンサスがどのようなものか疑問に思っています。

Javascript の経験が限られているため、プロファイリング時にまったく予想外の結果が得られて驚くことがよくあります。Javascript オブジェクト/構造の内部メモリ レイアウトと実装は、ブラウザーによって大きく異なるため、最適化を試みる価値があるかどうか疑問に思います。

2 つのメソッドのパフォーマンスを比較するために jsPerfで簡単なテスト ケース ( http://jsperf.com/object-vs-data ) を作成しました。Chrome ではパフォーマンスの向上が示されていますが、Safari では顕著なスピードアップは見られませんでした。

Javascript では、オブジェクトのメモリ レイアウトにさえ気を配る必要がありますか? それとも、「ある方法で実装し、必要に応じて最適化する」タイプのものですか?

この 2 番目のオプションは、特に従うべき適切なガイドラインがある場合は、(開発時間の点で) 無駄に思えます。

ありがとう〜

補足情報: これは基本的に、Javascript で 2 つのアプローチを実装する方法です。上記の jsPerf テスト ケースは次のように実装されます。

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
4

2 に答える 2

5

Ok。いくつかの数字とテストケースをいじった..

最初に、このテストケースを作成しましたhttp://jsperf.com/object-vs-array-creation-for-soこの 場合、作成Objectは、Array

次に、このテストケースを作成しましたhttp://jsperf.com/accessing-speed これでは、それらの間にほとんど違いはありませんでした..

したがって、このプロファイルから私が推測することは、プロジェクトが本当に巨大な場合、配列よりも多くのオブジェクトを使用する方が高速になるということです..最初のケースから、オブジェクトの作成は配列の作成よりも高速であることは明らかです。

しかし..

Javascript は高度に開発されたパフォーマンスの高い言語であり、そのようなマイクロ最適化について心配する必要はありません。注目すべきはセマンティクスだけです。意図を最もよく表す構造を選択する必要があります。

Windows NT 6.3 上の Chrome 36.0.1985.125 でのテスト

于 2014-07-30T16:06:16.350 に答える