JavaScriptエンジンの長時間スレッド独占によるラグの解決_JavaScriptスキル

WBOY
リリース: 2016-05-16 16:29:09
オリジナル
2201 人が閲覧しました

JavaScript エンジンのシングルスレッドの性質により、大規模なループのトラバーサルを処理するときにスレッドが長時間独占され、その結果、他のイベント (ユーザー操作など) にタイムリーに応答できなくなります。ひどい場合には、凍死や仮死状態に陥ることもあります。上記の問題を解決するための実現可能なメカニズムは、大きなループをいくつかの小さなループ セグメントに分割し、それらをスライスで実行することです。これにより、JavaScript エンジンは各セグメント間に他のものを挿入して実行できるようになり、それによって効果的にパフォーマンスを向上させることができます。パフォーマンス経験

Ansync.js

コードをコピー コードは次のとおりです:

function Ansync (totalCount、segmentCount、workCallback、returnCallback)
{
    var num_of_item_for_each_segment = セグメント数;
    var num_of_segment = Math.ceil(totalCount / num_of_item_for_each_segment);
    var count_of_segment = 0;
    var タイマー;
    var 開始、終了;
    this.process = function(スコープ, タイムアウト)
    {
        if (スコープ != 未定義)
        {
            workCallback = workCallback.bind(scope);
            returnCallback = returnCallback ? returnCallback.bind(スコープ) : 未定義;
        }
        if (セグメント数 == セグメント数)
        {
            clearTimeout(タイマー);
            if (returnCallback != 未定義)
                returnCallback();
        }
        それ以外
        {
            start = セグメント数 * 各セグメントの項目数;
            end = Math.min(totalCount, (セグメント数 1) * 各セグメントの項目数);
            if (num_of_segment == 1)//タイマーを作成する必要はありません
            {
                workCallback(start, end);
                セグメント数 = 1;
                this.process();
            }
            それ以外
            {
                timer = setTimeout(function ansyncTimeout(){
                    if (workCallback(start, end)) //関数がtrueを返したら処理を終了
                    {
                        セグメント数 = セグメント数;
                    }
                    それ以外
                    {
                        セグメント数 ;
                    }
                    this.scope.process();
                }.bind({scope: this}),timeout == 未定義 ? Ansync.TimeOut : タイムアウト);
            }
        }
    }
}
Ansync.TimeOut = 5;

方法は完全ですが、同じ目的の要件がある小さな協力者です。参考下吧

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート