当前位置: 首页 > 面试题库 >

在IE和FF中执行js的速度很慢

靳涵亮
2023-03-14
问题内容

我有运行返回的json数据的此功能。在chrome中速度确实很高,但是在IE和FF中却很慢。有关如何改善此问题的建议?返回的数据约为15个对象。这将在顶部创建一堆锚点,并在每个标题下列出。

function list_response(jsonData) {
    "use strict";
    var lists = document.getElementById("lists"), anchors = document.getElementById("anchors"), jItems = jsonData.items;
    jItems.sort(function (a, b) {
            return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
            });
    for (var i = 0; i < jItems.length; i++) {
        var pList = jItems[i], str = "", ank = "";
        str += '<span class="backtotop">[ <a href="#">Back to top</a> ]</span><br /><br /><br /><li class="title nodot"><a class="pHeader" name="' + pList.name + '"><h2>' + pList.name + '</h2></a></li>';
        ank += '<a class="pHeader" href="#' + pList.name + '">' + pList.name + '</a>&nbsp; ';
        lists.innerHTML += str;
        anchors.innerHTML += ank;

        for (var j = 0; j < jsonData.items[i]["videos"].length; j++) {
            var vList = jsonData.items[i]["videos"][j];
            var strs = "";
            strs += '<li class="nodot"><a href="https://www.site.org/videos/Video_Player.page?bctid=' + vList.id + '">' + vList.name + '</a></li>';
            lists.innerHTML += strs;
        }
    }
}

问题答案:

这是结合以下性能增强功能的代码版本:

  1. 在循环结束时仅将一次添加到innerHTML中。您希望尽可能避免这样做,因为每次添加到该项目时,它都会导致该项目中所有HTML的完整重新解析。这样可以最大程度地减少与DOM的事务数量,而DOM可能是整个例程中最慢的部分。这个改进的版本大大减少了DOM事务的数量。如果jItems.length是,20并且视频的平均数量为5,则这会将DOM事务数减少到DOM事务数的1/50。
  2. 将字符串数据累积到一个数组中,.push().join()在最后执行a ,而不是每次都添加到字符串的末尾。JS引擎通常可以一次连接多个字符串,而不是逐段连接。
  3. 将字符串数据累积到数组中时,不再需要在每个循环或子循环上初始化临时变量。
  4. 与其获取pList然后具有四个引用pList.name,不如获取一次名称值并直接使用它。
  5. jItems[i]在循环中进行缓存是因为它引用了多个位置,而不是每次都重新计算它。
  6. for只需为每个循环计算len变量一次,然后与之比较,而不是在每次迭代时都重新计算它。
  7. jItems[i]["videos"]在外部循环中缓存一次,而不是在内部循环中每次都重做一次。
  8. 如果中的项目很多jsonData.items,则排序算法效率不高,因为它必须为每个比较重新计算每个名称的小写形式。您可以一次性构建所有小写版本(每个项目一次),然后仅在排序算法中使用它们,而不必在每次比较两个项目时都重做它们。

这些更改产生以下代码:

function list_response(jsonData) {
    "use strict";
    var lists = document.getElementById("lists"), anchors = document.getElementById("anchors"), jItems = jsonData.items;
    var results = [], anks = [], vList, pListName, item, videoItem;
    // precache all lower case versions to make sorting faster
    var i, iLen = jItems.length, j, jLen;
    for (var i = 0; i < iLen; i++) {
        jItems[i].nameLower = jItems[i].name.toLowerCase();
    }
    jItems.sort(function (a, b) {
        return a.nameLower.localeCompare(b.nameLower);
    });
    for (i = 0; i < iLen; i++) {
        item = jItems[i];                   // cache for use in loops
        videoItem = item["videos"];      // cache for use in loops
        pListName = item.name;            // cache for use in multiple places
        results.push('<span class="backtotop">[ <a href="#">Back to top</a> ]</span><br /><br /><br /><li class="title nodot"><a class="pHeader" name="' + pListName + '"><h2>' + pListName + '</h2></a></li>');
        anks.push('<a class="pHeader" href="#' + pListName + '">' + pListName + '</a>&nbsp; ');

        for (j = 0, jLen = videoItem.length; j < jLen; j++) {
            vList = videoItem[j];
            results.push('<li class="nodot"><a href="https://www.site.org/videos/Video_Player.page?bctid=' + vList.id + '">' + vList.name + '</a></li>');
        }
    }
    lists.innerHTML += results.join("");
    anchors.innerHTML += anks.join("");
}


 类似资料:
  • 本文向大家介绍js实现兼容IE和FF的上下层的移动,包括了js实现兼容IE和FF的上下层的移动的使用技巧和注意事项,需要的朋友参考一下 这里给大家分享的是项目中的一个小需求,本来很简单,可是整了好久才把FF的兼容性搞定。 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我在程序(计时器类)中使用scheduleAtFixedRate方法。它每秒钟运行一次,但有时这种方法会变得非常快(每秒执行3-4次)。 然而,我在网上做了一些研究,发现了这个: 复制自android开发者页面: 对于固定速率执行,任务每次连续运行的开始时间都是计划的,而不考虑上一次运行的时间。如果延迟阻止计时器按时启动任务,则这可能会导致一系列串接运行(一个接一个地启动)。 我需要固定的计时器。

  • 问题内容: (重要)编辑3: 单独运行testajax2.php而 _不是_Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询用时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。

  • 本文向大家介绍你是如何比较js函数的执行速度的?相关面试题,主要包含被问及你是如何比较js函数的执行速度的?时的应答技巧和注意事项,需要的朋友参考一下 console.time(flag); console.timeEnd(flag);

  • 问题内容: 我一直在使用HTMLUnit。非常适合我的要求。但这似乎非常缓慢。例如:我已经使用HTMLUnit自动化了以下场景 代码: 它运作良好100%。但是需要3分41秒 我想执行缓慢的原因是要验证页面上的每个元素。 我的问题是如何减少HTMLUnit的执行时间?有什么方法可以禁用网页上的验证。 提前致谢! 问题答案: 对于当前的htmlUnit 2.13,设置选项与maxmax提供的设置略有

  • 使用xarray的open_mfdataset打开一系列大约90个netCDF文件,每个文件大约27MB,加载一个小的时空选择需要很长时间。 分块维度产生边际收益。decode_cf=True在函数内部或单独都没有区别。这里还有一个建议https://groups.google.com/forum/#!topic/xarray/11lDGSeza78让我将所选内容另存为一个单独的netCdf并重新