3

Bing や Google の JavaScript マップ コントロールを使用しており、動的に変更可能なオーバーレイが多数含まれている場合があります。

http://support.microsoft.com/kb/175500/en-usを読み、MaxScriptStatments レジストリ キーの設定方法を知っています。

問題は、このレジストリ キーやその他のレジストリ キーをユーザーのコンピュータにプログラムで設定するのではなく、別の方法で同じ効果を実現したいということです。

別の方法はありますか?

4

2 に答える 2

5

スクリプトを「軽く」する以外にできることはほとんどありません。それをプロファイリングして、最も重いクランチが発生する場所を特定してから、それらの部分を最適化し、小さなコンポーネントに分割し、前のコンポーネントが終了した後にタイムアウトを指定して次のコンポーネントを呼び出します。基本的には、時々コントロールをブラウザに戻します。一度の関数呼び出しですべてを処理しないでください。

于 2009-08-06T00:07:04.247 に答える
1

通常、長時間実行されるスクリプトは、ループしているコードで発生します。

大量のデータ コレクションをループする必要があり、非同期で実行できる場合 (別のスレッドと同様)、処理を webworker ( http://www.w3schools.com/HTML/html5_webworkers.asp ) に移動します。

Webworker を使用できない場合、または使用したくない場合は、実行時間の長いスクリプトの原因となっているメイン ループを見つけて、ループの最大数を指定し、setTimeout を使用してクライアントに返すことができます。

悪い例: (thingToProcess が大きすぎる可能性があり、スクリプトの実行時間が長くなる可能性があります)

function Process(thingToProcess){     
    var i;
    for(i=0; i < thingToProcess.length; i++){
        //process here
    }
}

良い: (譲歩する前に 100 回の反復しか許可しない)

function Process(thingToProcess, start){    
    var i;
    if(!start) start = 0;
    for(i=start; i < thingToProcess.length && i - start < 100; i++){
        //process here
    }
    if(i < thingToProcess.length) //still more to process
        setTimeout(function(){Process(thingToProcess, i);}, 0);
}

どちらも同じ方法で呼び出すことができます:

Process(myCollectionToProcess);
于 2014-07-17T15:05:16.190 に答える