はじめに
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 |