2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【202002追試】Object.prototype.hasOwnProperty()は変数に入れた方が速い?

Posted at

はじめに

Object.prototype.hasOwnProperty()は変数に入れた方が速い? - JavaScript
というブログ記事が私のMastodonのTLに出ていました。

趣旨としてはhasOwnPropertyをどう呼び出すかで4通りの検証が以下のコードでなされていたようです。

(function() {
    var myObj = {
        prop: 111
    };
 
    // テスト1: ユーザー定義の対象オブジェクトから呼び出す。
    function test1() {
        var i, startTime, stopTime;
 
        startTime = new Date();
 
        for (i = 0; i < 10000000; i++) {
            myObj.hasOwnProperty('prop');
        }
 
        stopTime = new Date();
        console.log(stopTime - startTime + 'ms');
    }
 
    // テスト2: ネイティブオブジェクトメソッドからcallを使って呼び出す(Object.prototype.hasOwnProperty.call())。
    function test2() {
        var i, startTime, stopTime;
 
        startTime = new Date();
 
        for (i = 0; i < 10000000; i++) {
            Object.prototype.hasOwnProperty.call(myObj, 'prop');
        }
 
        stopTime = new Date();
        console.log(stopTime - startTime + 'ms');
    }
 
    // テスト3: objProtoHasOwnというローカル変数に代入してキャッシュ化。
    function test3() {
        var i, startTime, stopTime, objProtoHasOwn;
 
        startTime = new Date();
        objProtoHasOwn = Object.prototype.hasOwnProperty;
 
        for (i = 0; i < 10000000; i++) {
            objProtoHasOwn.call(myObj, 'prop');
        }
 
        stopTime = new Date();
        console.log(stopTime - startTime + 'ms');
    }
 
    // テスト4: ローカル変数でキャッシュ化した上で、hasOwnという関数にして使用。
    function test4() {
        var i, startTime, stopTime, objProtoHasOwn, hasOwn;
 
        startTime = new Date();
        objProtoHasOwn = Object.prototype.hasOwnProperty;
 
        hasOwn = function(obj, prop) {
            return objProtoHasOwn.call(obj, prop);
        };
 
        for (i = 0; i < 10000000; i++) {
            hasOwn(myObj, 'prop');
        }
 
        stopTime = new Date();
        console.log(stopTime - startTime + 'ms');
    }
 
    test1();
    test2();
    test3();
    test4();
})();

元の記事の検証結果

テスト環境:
Chrome 60.0.3112.113(64bit)
Firefox 55.0.3(64bit)
IE 11.413.15063.0(32bit)
JScript Panel 1.2.3.2

PCは2600K, Memory8G, Windows10(64bit)

テスト種類 Chorome Firefox IE Microsoft Edge JScript Panel
テスト1 (myObj.hasOwnProperty) 105 26 2986 3306 781
テスト2 (Object.prototype.hasOwnProperty.call) 100 1298 6534 7758 907
テスト3 (Object.prototype.hasOwnPropertyを変数に) 122 21 4437 5097 893
テスト4 (Object.prototype.hasOwnPropertyを変数→関数) 125 47 4907 6332 923

今回の再検証結果

Chrome 79.0.3945.130(64bit)
Firefox 72.0.2(64bit)
IE 11.592.18362.0(32bit)
Microsoft Edge 44.18362.449.0(64bit)

PCはIntel Core i7-7500U, Memory16G, Windows10(64bit)

テスト種類 Chrome Firefox Internet Explorer Edge
テスト1 (myObj.hasOwnProperty) 99(87.4~110.6) 58.25(55.4~61.1) 3083.65(3025.5~3141.8) 3172.95(3125.4~3220.5)
テスト2 (Object.prototype.hasOwnProperty.call) 85(80.6~89.4) 55.9(51.7~60.1) 4567.1(4512.7~4621.5) 5660.65(5610.7~5710.6)
テスト3 (Object.prototype.hasOwnPropertyを変数に) 103.2(98.0~108.4) 49.45(45.2~53.7) 3612.75(3555.3~3670.2) 4316.85(4255.6~4378.1)
テスト4 (Object.prototype.hasOwnPropertyを変数→関数) 117.9(110.5~125.3) 46.25(45.5~47.0) 3752.75(3688.9~3816.6) 4836.55(4751.9~4921.2)

元記事とは違って20回計測で、95%信頼区間を括弧中に表示しています。TBのことを考え、測定の間には30秒~1分程度の間隔があります。

考察

今回と元記事の差

  • 元記事のようにFirefoxのテスト2だけ猛烈に遅いということは確認されなかった。
  • 全般にPCスペックなどの要因から速度が速いが、なぜかFirefoxのテスト2以外だけ遅い

いずれの検証にも言えること

  • 全般にFirefoxとChromeが速いのはなんか最適化がかかって処理が飛んでいるのではないか?(検証方法がわからず断念
  • IRよりEdgeのほうが遅い。いっちょんわからん

結論

まあIEとかもう誰も使ってないし(ぇ)、Edgeは中身Chromeになるので、ぶっちゃけどれ使ってもいいんじゃないですかね。

データ

Chrome

測定回数 1 2 3 4
1 202 106 122 118
2 98 95 102 178
3 85 96 101 120
4 91 89 102 118
5 137 98 131 118
6 101 77 96 106
7 94 79 89 110
8 90 96 96 120
9 100 80 103 119
10 95 85 129 114
11 80 70 96 113
12 102 79 90 102
13 94 77 89 102
14 82 87 98 96
15 76 77 101 118
16 88 99 111 112
17 87 82 108 111
18 91 71 99 144
19 95 81 91 114
20 92 76 110 125
平均 99 85 103.2 117.9
標準偏差 26.50283004 9.959919678 11.96076921 16.85200285
標準誤差 5.926212956 2.227105745 2.674509301 3.768222393
95%信頼区間 11.61516405 4.365047085 5.241941947 7.385580233
95%信頼区間最大 110.6151641 89.36504708 108.4419419 125.2855802
95%信頼区間最小 87.38483595 80.63495292 97.95805805 110.5144198

Firefox

測定回数 1 2 3 4
1 44 41 41 44
2 59 42 44 47
3 61 40 42 49
4 56 55 48 48
5 65 58 54 46
6 65 58 54 46
7 55 56 63 47
8 60 60 43 46
9 59 67 71 44
10 66 57 45 46
11 58 57 44 46
12 51 64 44 47
13 53 49 42 45
14 65 55 44 46
15 46 49 62 51
16 68 45 45 45
17 65 72 43 47
18 60 55 42 44
19 59 60 45 45
20 50 78 73 46
平均 58.25 55.9 49.45 46.25
標準偏差 6.594505288 9.658674857 9.754358 1.669580786
標準誤差 1.47457621 2.159745355 2.181140757 0.373329613
95%信頼区間 2.890116287 4.233023146 4.274957362 0.731712602
95%信頼区間最大 61.14011629 60.13302315 53.72495736 46.9817126
95%信頼区間最小 55.35988371 51.66697685 45.17504264 45.5182874

IE

測定回数 1 2 3 4
1 3464 5035 4125 4225
2 2928 4499 3556 3667
3 3059 4371 3567 4052
4 3091 4469 3680 3804
5 3107 4548 3616 3756
6 3019 4510 3565 3692
7 3266 4627 3652 3704
8 2804 4511 3518 3574
9 3079 4544 3562 3652
10 2942 4646 3458 3625
11 3031 4522 3532 3679
12 3019 4610 3540 3728
13 3108 4497 3576 3677
14 3122 4585 3603 3789
15 3192 4576 3551 3709
16 3217 4632 3691 3852
17 3041 4539 3596 3670
18 3091 4540 3681 3785
19 3088 4577 3635 3707
20 3005 4504 3551 3708
平均 3083.65 4567.1 3612.75 3752.75
標準偏差 132.7472316 124.0503527 131.150629 145.5853272
標準誤差 29.68318337 27.73850212 29.32617218 32.55386882
95%信頼区間 58.17797081 54.36646557 57.47824174 63.80441094
95%信頼区間最大 3141.827971 4621.466466 3670.228242 3816.554411
95%信頼区間最小 3025.472029 4512.733534 3555.271758 3688.945589

Edge

測定回数 1 2 3 4
1 3116 5658 4239 4682
2 3116 5658 4239 4682
3 3118 5641 4390 4910
4 3071 5583 4205 4662
5 3170 5816 4466 5031
6 3352 5714 4523 4899
7 3352 5714 4523 4899
8 3053 5521 4175 4569
9 3059 5462 4043 4514
10 3093 5606 4225 4965
11 3323 5674 4490 4967
12 2978 5443 4190 4623
13 3167 5532 4264 4876
14 3191 5684 4379 4746
15 3174 5779 4306 4799
16 3300 5762 4238 5262
17 3244 5754 4439 4876
18 3058 5569 4113 4618
19 3205 5776 4420 5021
20 3319 5867 4470 5130
平均 3172.95 5660.65 4316.85 4836.55
標準偏差 108.4976843 114.0461639 139.7155235 193.0822299
標準誤差 24.26081975 25.50149751 31.2413408 43.17449913
95%信頼区間 47.55033332 49.98201706 61.23190328 84.62046401
95%信頼区間最大 3220.500333 5710.632017 4378.081903 4921.170464
95%信頼区間最小 3125.399667 5610.667983 4255.618097 4751.929536
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?