12

これは興味深いものです...要素に設定されたsetAttributeと通常のプロパティセットのパフォーマンスをテストしているときに、奇妙な動作を見つけました。それを通常のオブジェクトでテストしたところ、...それでも奇妙です!

したがって、 object がA = {}あり、そのプロパティをA['abc_def'] = 1、 またはのように設定した場合A.abc_def = 1、それらは基本的に同じです。しかし、A['abc-def']= 1 またはA['123-def']= 1 を実行すると、問題が発生します。それはずっと遅くなります。ここでテストをセットアップしました: http://jsfiddle.net/naPYL/1/。それらはすべて、クロムを除くすべてのブラウザーで同じように機能します。おもしろいことに、「abc_def」プロパティの場合、予想どおり、chrome は実際には Firefox や IE よりもはるかに高速です。しかし、「abc-def」の場合は、少なくとも 2 倍遅くなります。

したがって、ここで基本的に(少なくとも私のテストから)何が起こるかは、プロパティに「正しい」構文(ドットプロパティで使用できる合法的なC構文)を使用する場合です-高速ですが、ブラケットを使用する必要がある構文を使用する場合(a [...]) では、困ったことになります。

2 つのモードをこのように区別する実装の詳細を想像しようとしましたが、できませんでした。私の考えでは、これらの非標準の名前をサポートする場合、おそらくすべての名前を同じメカニズムに変換することになり、残りはそのメカニズムにコンパイルされる構文にすぎません。そう 。syntax と [] は、コンパイル後にすべて同じになるはずです。しかし、明らかに何かがここで逆に進んでいます...

V8 のソース コードを見ずに、本当に満足のいく答えを思いつく人はいますか? (練習だと思ってください:-))

jsperf.com の簡単な例を次に示します。

jsperf の例を提供してくれた NDM に感謝します。

編集:

明確にするために、もちろん、実際のコード(すでに見つけたもの)からの具体的な回答も必要です。より正確には、その特定の実装の背後にある理由です。これが、「演習として」それを見て、技術的な実装の背後にある理由を見つけようとするように依頼した理由の 1 つです。

しかし、私はまた、このような場合に他の人の心がどのように機能するかを見たいと思っていました. これは「あいまい」に聞こえるかもしれませんが、時々他の人のように考えたり、彼らの視点を取ったりすることは非常に役に立ちます。それはあなた自身の考え方を高めます。

4

1 に答える 1

5

したがって、JS オブジェクトは、相反する 2 つの目的に使用できます。これらはオブジェクトとして使用できますが、ハッシュ テーブルとしても使用できます。ただし、オブジェクトにとって高速で意味のあることは、ハッシュ テーブルではそうではないため、V8 は特定のオブジェクトが何であるかを推測しようとします。

ユーザーがディクショナリを必要としている兆候として、プロパティを削除したり、ドット表記を使用してアクセスできない名前をプロパティに付けたりすることがあります

他のヒューリスティックもいくつか使用されています

ただし、ハッシュ テーブルの地獄からオブジェクトを引き換える、非常にクールなハックがあります。

function ensureFastProperties(obj) {
    function f() {}
    f.prototype = obj;
    return obj;
}

実際の動作をご覧ください: http://jsperf.com/property-dash-parformance/2

プロパティがオブジェクト内ではなく外部プロパティ配列に格納されるため、償還されたオブジェクトは元のオブジェクトほど高速ではありません。しかし、それでもハッシュ テーブルよりははるかに優れています。これはまだかなり壊れたベンチマークであることに注意してください。ハッシュ テーブルが inobject プロパティよりも 2 倍しか遅いとは考えないでください。

于 2013-09-27T10:19:21.623 に答える