js最適化
6633 ワード
言語レベルの方面
ループ
サイクルはよく使われている制御構造で、ほとんどのものはそれによって完成されます.JavaScriptでは
for(;;),while(),for(in)
の3つのサイクルを使ってもいいです.実は、この3つのサイクルの中でfor(in)
の効率は極めて悪いです.彼はハッシュキーを調べる必要があるので、できればできるだけ少なく使うべきです.for(;;)
およびwhile
サイクルの性能は、基本的に(通常使用される)等価であるべきである.実は、この二つのサイクルをどう使うかには大きなこだわりがあります.テスト中に面白いことがあります.付録を見てください.最後に出した結論は:
++
または--
オペレータを使用するべきです.局所変数の速度は大域変数のアクセス速度よりも速くなります.大域変数は大域オブジェクトのメンバであり、局所変数は関数のスタックに置かれています.
Evalを使わない
eval
を使用すると、運転中に説明エンジンを再起動してコンテンツを実行するのに相当し、時間がかかります.この時はJavaScriptでサポートされているクローズドを使って関数モデルを実現できます.(クローズドの内容については関数式プログラミングの関連内容を参照してください.)オブジェクトの検索を減らす
JavaScriptの解釈性のため、
a.b.c.d.e
は少なくとも4回の照会操作が必要であり、aを確認してからaのbを検査し、bのcを確認し、このようにして下に進む.このような表現が重複している場合は、できるだけこのような表現が少ないようにしてください.ローカル変数を利用して、一時的な場所に入れて検索します.この点はループと結合することができます.文字列、配列の長さによって循環することが多いので、通常はこの長さは不変です.例えば、クエリー
a.length
のたびに、追加的な操作が必要です.var
len=a.length
を予め保持しておくと、クエリが少なくなります.文字列接続
追加文字列であれば、
s+=anotherStr
を使用する代わりに、s=s+anotherStr
を使用した方がいいです.複数の文字列を接続する場合は、+==は少なめに使うべきです.
s+=a;
s+=b;
s+=c;
書きあげるべきですs+=a + b + c;
文字列を収集する場合、たとえば何度も同じ文字列を+=操作する場合は、キャッシュを使用したほうがいいです.どう使いますか?JavaScript配列を使って収集して、最後にjoin方法で接続します.var buf = new Array();
for(var i = 0; i < 100; i++){
buf.push(i.toString());
}
var all = buf.join("");
タイプ変換変換は、JavaScriptはダイナミックタイプの言語なので、変数のタイプを指定することはできません.
1.数字を文字列に変換し、
"" + 1
を適用し、醜そうに見えるが、実はこの効率が一番高く、性能的には:("" + ) > String() > .toString() > new String()
これは下の「直接量」と似ています.できるだけコンパイルを使っても使える内部操作は、運転時に使ったユーザー操作よりも速いです.String()
は内部関数に属しているので、速度が速く、.toString()
はプロトタイプの関数を調べたいので、速度が劣る部分があります.new String()
は正確なコピーを返します.2.浮動小数点数を型全体に変換すると、これは間違いやすいです.多くの人は
parseInt()
を使うのが好きです.実はparseInt()
は文字列を数字に変換するためのものです.浮動小数点と型の間の変換ではなく、Math.floor()
またはMath.round()
を使うべきです.また、第二節のオブジェクト検索における問題とは異なり、
Math
は内部オブジェクトであるため、Math.floor()
は、実際にはクエリ方法と呼び出し時間があまりなく、最も速い速度である.3.カスタムオブジェクトに対して、
toString()
方法を定義してタイプ変換を行うと、明示的な呼び出しtoString()
が推奨されている.内部の動作はあらゆる可能性を試した後、対象のString()方法がStringに転化するかどうかを試みるので、この方法を直接起動するのが効率的である.直接量を使う
実はこの影響は小さいです.無視できます.直接使用量とは何ですか?例えば、JavaScriptは
[param,param,param,...]
を使って直接的に配列を表現するのをサポートしています.以前はnew Array(param,param,...)
を使っていました.前者を使ってエンジンで直接説明しています.同様に、
Array
の方式もvar foo = {}
より速いです.var foo = new Object();
はvar reg = /../;
より速いです.文字列を巡回します.
文字列を循環的に操作します.例えば、置換、検索は正規表現を使うべきです.それ自体はJavaScriptの循環速度が遅いため、正規表現の操作はCで書かれた言語のAPIで、性能がいいです.
高度なオブジェクト
カスタム高級オブジェクトおよび
var reg=new RegExp()
、Date
オブジェクトは、構造時に多くの時間を消費する.多重化が可能であれば、キャッシュ方式を採用するべきである.DOM関連
HTMLを挿入
多くの人は、JavaScriptで
RegExp
を使ってページにコンテンツを生成することが好きです.実はこのような効率が低いです.直接HTMLを挿入する必要があれば、divまたはspanを指定するなどのコンテナ要素を探して、自分のHTMLコードをページに挿入するために彼らのdocument.write
を設定します.オブジェクトのクエリー
innerHTML
を使用して照会するのは[""]
よりも速く、これは前の減少対象検索の考え方と同じで、.items()
を呼び出してクエリーと関数の呼び出しを増加させた.DOMノードを作成
普通は文字列を使って直接HTMLを書いてノードを作るかもしれません.
.items()
方法を使用した後、複数の要素の属性を設定する必要があり、document.createElement()
を使用して属性の設定回数を減らすことができる.同じように多くの要素を作成する必要があるなら、まずサンプルノードを準備すべきである.タイマー
継続的に実行されるコードに対しては、
cloneNode()
を使用すべきではなく、createElement()
を使用すべきである.cloneNode()
は毎回タイマーを再設定します.その他
スクリプトエンジン
MicrosoftのJScriptをテストしたところ、MozilaのSpidearmonkeyと比較して効率が悪くなりました.実行速度もメモリ管理上もJScriptはほとんど更新していません.ただしSpider Monkeyは
setTimeout
を使用できません.ファイルの最適化
ファイルの最適化も有効な手段であり、すべてのスペースとコメントを削除し、コードを一行に入れると、ダウンロードのスピードが速くなります.注意してください.
締め括りをつける
本論文では、JavaScriptプログラミングにおいて見つけたJavaScriptの運行性能を向上させるいくつかの方法をまとめました.これらの経験はいくつかの原則に基づいています.
同時に、いくつかの基本的なアルゴリズムの最適化は、JavaScriptのような演算構造の調整など、Java Scriptにおいても同様に使用できます.しかし、JavaScriptは解釈型なので、通常は実行時にバイトコードを最適化しないので、これらの最適化は依然として重要です.
記事はネットワークから来ました.http://hi.baidu.com/zhouqiugang/blog/item/ef2b6839266605f83b87ce0f.html