0

该代码存在性能问题。它循环运行 150 次。

该代码适用于投注,比赛在屏幕上有空的投注字段。然后该代码适用于通过查看和比较分数来填充获胜者赔率。

例如,如果比赛以 1-0 主队获胜,我必须在屏幕上写上“MS1”。为此,我必须使用 jQuery attr 选择器获取得分信息。

在周末,有很多比赛,它正在崩溃或运行太慢:/

你有什么想法可以更快地工作吗?

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

您可以使用 '#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 回答
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 构建两个 JQ 对象(参见“添加”方法),然后在循环完成后使用它们需要的功能来处理它们。

  • 这可能没有 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 回答