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

# はじめに

[Object.prototype.hasOwnProperty()は変数に入れた方が速い？ - JavaScript](http://p774.blog.fc2.com/blog-entry-73.html)
というブログ記事が私のMastodonのTLに出ていました。

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

```js
(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 |