0

そのコードでパフォーマンスの問題が発生しています。150回ループで動作します。

そのコードは賭けに機能し、試合には画面上に空の賭けフィールドがあります。次に、そのコードは、スコアを見て比較することで勝者のオッズを埋めるために機能します。

たとえば、ホームチームが1-0で勝利して試合が終了した場合、画面に「MS1」と書き込む必要があります。そのためには、jQueryattrセレクターを使用してスコア情報を取得する必要があります。

週末にはたくさんの試合があり、クラッシュしているか、動作が遅すぎます:/

より速く作業するためのアイデアはありますか?

OddEngine = function(odd)
{
    $("#matchCode_" + odd.ID).html(odd.C);
    $("#match_" + odd.ID).attr("code",odd.C);
    var status = $("#match_" + odd.ID).attr("status");
    if (status == 1)
        return;

    var htscore = $("#othomeTeamScore_"+odd.ID).html();
    var atscore = $("#otawayTeamScore_"+odd.ID).html();
    var iy_htscore = $("#homeTeamHalfScore_"+odd.ID).html();
    var iy_atscore = $("#awayTeamHalfScore_"+odd.ID).html();



    for (var i = 0; i < odd.Odds.length; i++) {
        var bet = odd.Odds[i];

         var winnerMsOdd = 'F.X';
          var winnerMsTitle =  'X';
          if (htscore > atscore)
          {
            winnerMsOdd = 'F.1';
            winnerMsTitle = '1';
          }
          else if (htscore < atscore)
          {
            winnerMsOdd = 'F.2';
            winnerMsTitle = '2';
          }

          $("#match_"+odd.ID+" [oddcode='MS']").html(bet[winnerMsOdd]);
          $("#match_"+odd.ID+" [oddtag='MS']").fadeIn();
          $("#match_"+odd.ID+" [oddtag='MS']").html(winnerMsTitle);


          if (currentSportId != 3)
          {
                var winnerIyOdd = 'S.X';
                var winnerIyTitle =  'X';
                if (iy_htscore > iy_atscore)
                {
                    winnerIyOdd = 'S.1';
                    winnerIyTitle = '1';
                }
                else if (iy_htscore < iy_atscore)
                {
                    winnerIyOdd = 'S.2';
                    winnerIyTitle = '2';
                }

                if (bet[winnerIyOdd])
                {
                    $("#match_"+odd.ID+" [oddcode='IY']").html(bet[winnerIyOdd]);
                    $("#match_"+odd.ID+" [oddtag='IY']").fadeIn();
                    $("#match_"+odd.ID+" [oddtag='IY']").html(winnerIyTitle);
                }

          }

          if (currentSportId == 1)
          {
                var winnerAuOdd = 'UNDER';
                if (parseInt(htscore) + parseInt(atscore) > 2.5)
                {
                winnerAuOdd = 'OVER';
                }

                if (bet[winnerAuOdd])
                {
                    $("#match_"+odd.ID+" [oddcode='AU']").html(bet[winnerAuOdd]);
                    $("#match_"+odd.ID+" [oddtag='AU']").fadeIn();
                    $("#match_"+odd.ID+" [oddtag='AU']").html(winnerAuOdd == 'UNDER' ? 'ALT' : 'ÜST');

                }

                var winnerTGOdd = 'GS.01';
                var winnerTGtitle = "0-1";
                if (parseInt(htscore) + parseInt(atscore) > 1 && parseInt(htscore) + parseInt(atscore) < 4)
                {
                    winnerTGOdd = 'GS.23';
                    winnerTGtitle = "2-3";
                }
                else if (parseInt(htscore) + parseInt(atscore) > 3 && parseInt(htscore) + parseInt(atscore) < 7)
                {
                    winnerTGOdd = 'GS.46';
                    winnerTGtitle = "4-6";
                }
                else if (parseInt(htscore) + parseInt(atscore) >= 7)
                {
                    winnerTGOdd = 'GS.7P';
                    winnerTGtitle = "7+";
                }


                if (bet[winnerTGOdd])
                {
                    $("#match_"+odd.ID+" [oddcode='TG']").html(bet[winnerTGOdd]);
                    $("#match_"+odd.ID+" [oddtag='TG']").fadeIn();

                    $("#match_"+odd.ID+" [oddtag='TG']").html(winnerTGtitle);
                }
          }
    }

    $("#msOdd_" + odd.ID).html(odd.C);
    if (currentSportId == 1 || currentSportId == 2 || currentSportId == 7)
    {
        $("#htOdd_" + odd.ID).html(odd.Odds["F.1"]);
    }
    $("#uOdd_"  + odd.ID).html(odd.C);
    $("#tOdd_"  + odd.ID).html(odd.C);




}
4

2 に答える 2

0

そこにはたくさんの悪いものがあります:

問題:

  • あなたはDOMを繰り返し叩きのめしています。これは避けられませんが、あなたがしているほど多くのことをする必要はありません。残りのポイントの多くは、回避する方法についてのフォローアップです。

  • 属性セレクターを使用しています。これらは低速であり、ほとんどの非XMLシナリオでサポートするネイティブメソッドがないため、インタープリターからより多くの作業を強制されます。代わりにクラスとして試してください。他のクラスに干渉することなく、複数のクラスを作成し、jQueryのaddClass関数とremoveClass関数を使用して追加/削除できます。IE8をサポートしている場合は、最も近いIDに絞り込み、クラスでタグセレクターを使用します。

  • JQセレクターをキャッシュしていません。$('#someId')は少し作業を行います(ただし、他の何よりも高速です。再利用する場合は、varに割り当てます。規則はvar$someId = $('#someId');なので、jqObjectであることがわかります。これを繰り返します。$('#someId <other stuff>)おそらくこれよりも遅いです:$someId.find(<otherstuff>)繰り返し。あなたの場合、odd.idが一意であると仮定すると、少なくともvar $matchHtml = $("#matchCode_" + odd.ID)ループの先頭にある必要があります。

  • あなたは行くにつれてたくさんのUIのことをやっています。必要なコレクションを作成し、ループの後ですべてを一度に処理することを検討してください。たとえば、AUとTG用に2つのJQオブジェクトを作成し(「add」メソッドを参照)、ループが完了したら、必要な機能をそれらに適用します。

  • これはおそらくJQのものほど大したことではありませんが、多くの「。」を使用しています。不必要に演算子。毎日 '。' 実際にはいくつかの作業を表し、場合によっては、配列要素をカウントアップする必要があるため、かなり多くの作業を実行できる長さなどのゲッターを実際に表します。これは、より簡潔であるという素晴らしい副作用もあるハイパーアナルループです:

var myOdds = odd.Odds,
i=myOdds.length;

//if order matters, this goes backwards. Easy fix: myOdds.reverse

while(i--){
    thisOdds = myOdds[i];//if you're using thisOdds more than once
    //do stuff here
}
于 2012-08-07T16:17:54.820 に答える
0

'#match' + odd.IDノードを使用して、このノードからのループ内のすべてのノード検索にキーを設定できます。例えば。matchOdd.find('[oddcode = "MS"]')、これにより、DOMのクエリに対するパフォーマンスが向上するはずです。

ループのパフォーマンスを向上させることに関しては、setTimeoutに委任することでループを非同期にすることを検討できます。これは、このhttp://www.kryogenix.org/days/2009/07/03/not-blocking-the-ui-in-tight-javascript-loopsへのアプローチ方法を説明するリソースへのリンクです。

于 2012-08-07T15:44:31.127 に答える