[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
疑問点
質問に続く
String.prototypeの性能を拡張する
私は本当に興味をそそられます。
"use strict"
に
String.prototype
メソッドに変更することで、パフォーマンスが10倍向上しました。その
説明
によって
ベルギ
は短いし、私には説明になっていない。ほとんど同じ手法でありながら、なぜこのような劇的な違いがあるのでしょうか。
"use strict"
が違うだけなのに、なぜこんなにも違うのでしょうか?もっと詳しく、その背景にある理論も含めて説明していただけませんか?
String.prototype.count = function(char) {
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
String.prototype.count_strict = function(char) {
"use strict";
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
// Here is how I measued speed, using Node.js 6.1.0
var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;
console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');
console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');
結果
proto: 101 ms
proto-strict: 7.5 ms
どのように解決するのですか?
ストリクトモードでは
this
コンテキストがオブジェクトであることは強制されません。
オブジェクトでない関数を呼び出すと
this
はその非オブジェクトになるだけです。
これに対して、非厳格モードでは
this
コンテキストは、まだオブジェクトでない場合は常に最初にオブジェクトにラップされます。例えば
(42).toString()
が最初にラップされます。
42
を
Number
オブジェクトを作成し、次に
Number.prototype.toString
を呼び出します。
Number
オブジェクトを
this
のコンテキストになります。ストリクトモードでは
this
コンテキストはそのままで、単に
Number.prototype.toString
を呼び出すだけです。
42
として
this
のコンテキストになります。
(function() {
console.log(typeof this);
}).call(42); // 'object'
(function() {
'use strict';
console.log(typeof this);
}).call(42); // 'number'
あなたの場合、非ストライクトモード版では、プリミティブのラップとアンラップに多くの時間を費やし
string
を
String
オブジェクトのラッパーに変換して返します。一方、ストリクトモード版は、直接プリミティブな
string
を直接扱うので、パフォーマンスが向上します。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] JSLintが突然レポートする。"use strict" の関数形式を使用する
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み】PyPyが6.3倍速いなら、CPythonよりPyPyを使うべきじゃないのか?
-
[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] Angular 2 パスが存在しない場合に404や他のパスにリダイレクトする方法 [重複]について
-
[解決済み] React Router v4 <NavLink>と<Link>の違いについて
-
[解決済み] Chrome DevToolsでソースマップを無効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] ボクシングとアンボクシング、そのトレードオフとは?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] selectタグのngModelの変更を検出する方法(Angular 2)?
-
[解決済み] node.js シェルコマンドの実行
-
[解決済み] バックボーンビュー。親からイベントを継承・拡張する
-
[解決済み] Firebase用Cloud Functionsのトリガーは時間通り?
-
[解決済み] jqueryで部分文字列を作成する方法