js最適化

6633 ワード


言語レベルの方面
ループ
サイクルはよく使われている制御構造で、ほとんどのものはそれによって完成されます.JavaScriptではfor(;;),while(),for(in)の3つのサイクルを使ってもいいです.実は、この3つのサイクルの中でfor(in)の効率は極めて悪いです.彼はハッシュキーを調べる必要があるので、できればできるだけ少なく使うべきです.for(;;)およびwhileサイクルの性能は、基本的に(通常使用される)等価であるべきである.
実は、この二つのサイクルをどう使うかには大きなこだわりがあります.テスト中に面白いことがあります.付録を見てください.最後に出した結論は:
  • 循環変数がインクリメントされたり、減少されたりする場合、単独で循環変数に値を与えないでください.最後の読み取りにネストされた++または--オペレータを使用するべきです.
  • 配列の長さと比較するには、事前に配列のlength属性を局所変数に入れてクエリの数を減らすべきである.
  • ローカル変数とグローバル変数
    局所変数の速度は大域変数のアクセス速度よりも速くなります.大域変数は大域オブジェクトのメンバであり、局所変数は関数のスタックに置かれています.
    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の運行性能を向上させるいくつかの方法をまとめました.これらの経験はいくつかの原則に基づいています.
  • 直接手持ちのものを持ったほうが早いです.局部変数は大域変数より速く、直接量は運転時よりオブジェクトを構築するのが早いです.
  • は、実行回数をできるだけ少なくして、例えば、先にキャッシュすると、複数のクエリが必要になります.
  • は、できるだけ言語内蔵の機能を使用して、例えば、シリアルリンクです.
  • は、できるだけシステムが提供するAPIを使用してください.これらのAPIは、良いバイナリコードをコンパイルしているので、実行効率が高い
  • です.
    同時に、いくつかの基本的なアルゴリズムの最適化は、JavaScriptのような演算構造の調整など、Java Scriptにおいても同様に使用できます.しかし、JavaScriptは解釈型なので、通常は実行時にバイトコードを最適化しないので、これらの最適化は依然として重要です.
     
    記事はネットワークから来ました.http://hi.baidu.com/zhouqiugang/blog/item/ef2b6839266605f83b87ce0f.html