【问题标题】:Improving performance with JS使用 JS 提高性能
【发布时间】:2012-05-08 21:29:48
【问题描述】:

在开发中使用 javascript 时,比如说一个照片博客,您可以在其中检索文件夹中的所有图像并以所有独特的方式显示它,或者进行 ajax 调用以从服务器检索数据并加载它并应用所有样式和逻辑fly(或任何涉及跨越数百行甚至数千行的 js 代码的重击),JS 开发人员专注于提高代码效率(在性能方面)的所有领域是什么。

例如,我们遇到了很多在线画廊。如果 js 开发人员必须从他的服务器加载大约 50 张图像到网站上,那么他首先关心的是什么。我提出这个只是为了让 JS 代码的实例必须处理大量数据。

我正在寻找的是,我目前正在参与 JS 开发,当我编写中型(或大型)js 应用程序时,我应该集中精力提高性能。

  1. 就使用的内存而言?
  2. 在提高循环效率方面?
  3. 在使用 Jquery 或 Dojo 等 3rd 方框架方面?
  4. 在设计和使用的算法方面(我想总是有这个选项打开)

任何关于编写更高效的 JS 代码的建议都会有很大帮助。

【问题讨论】:

    标签: javascript performance


    【解决方案1】:

    我的一位教授说 - “好的算法,不需要微优化”。

    有一个类似的question。 JavaScript 的问题在于它并不单独存在于网页中。有 HTML ( DOM ) 和 CSS。

    1. 关于使用的内存 - 这是一个基本问题。如果你想要更快的速度,你需要更多的内存,或者相反。这是一个权衡wikipedia。您必须定义某种平衡。在我个人看来(如here),您将获得更简洁的代码,更少的变量(对象)无需克隆,并且 HTML 将更简洁。限制持有 DOM 集合引用的变量。

    2. 关于循环 - 循环本身不是问题。问题在循环内部:不要一遍又一遍地检查某事。使用记忆化wikipedia。小心对 DOM 集合的迭代,如果随着时间的推移有很多动态添加的元素,它们可能会变慢。使用变量来缓存当前状态或位置(哦!在这里权衡)。

    3. 像 jQuery 这样的第三方库非常有用,因为它们提供了一种在每个浏览器上执行相同操作的统一方式。但是像 jQueryUI 一样寻找一些模块。很多时候,我只需要在另一个名为 sizzle 的库中包含在 jQuery 中的选择器,而不是整个库中的选择器。但尽管如此,我还是反对他们的统治地位。 HTML5 正在传播并呈现出一种原生功能,至少如果不是更好的话,它应该会更快。

    4. 关于算法 - 使用设计模式。它们是多年来发展起来的技术,经过测试和验证。比如使用闭包,防止全局变量的未命名的自执行函数等等......

    当然还有其他有用的技巧,例如:

    • 代码缩小
      • YUI compressorGoogle Closure compiler,节省带宽;
      • 还有混淆器和打包器 - 如果算法良好,它们可能会有所帮助,但有时它们可​​能会引入错误!!! ;
      • 在某些页面上,您可能会看到类似var doc = document; 的内容,这是document 的缩写;
    • 使用 CDN - 来自 GoogleASP 主机;
    • 图像优化 - JPG can be optimized 尺寸更小(关于画廊);
    • 在另一台主机上导出 JavaScript 和 CSS 等静态内容,以防止反复发送 cookie 数据。 (这里的另一个副作用是你不需要安装服务器端语言,只需要http服务器)

    作为您可能熟悉或不熟悉的工具:

    • JsLint - 检查 JavaScript 代码错误;
    • JsonLint - 检查 json 数据中的错误;
    • JsPerf - 用于测试和比较脚本的性能。还包含其他用户设计的测试列表;
    • regexpal - 正则表达式助手;
    • 有很多“粘贴和分享”网站 jsfiddle、pastebin 等;

    【讨论】:

    • 哇.. 这实际上回答了我的很多问题。非常感谢。
    【解决方案2】:

    性能调优是非常非常特定于应用程序的。作为唐纳德·克努斯says

    我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源

    一般来说,最好的办法是编写您的应用程序,然后找出需要优化的内容。应用程序加载时间过长?使用压缩器并延迟加载大量资源(例如图像)。 CPU使用率过高?也许您过于频繁地更新 DOM 而不是批量更新。直到你有一个工作样本,然后分析它,你才会知道。

    第三方库是构建原型并快速工作的绝佳工具。缺点通常是 1)它们的有效负载可能很大,增加了加载时间(尽管这可以通过使用 CDN/缓存来缓解),2)它们使执行 CPU 密集型的事情变得更容易,因为它隐藏了很多发生了什么。虽然这只是在您遇到 CPU 问题时才会出现的问题,但情况并非总是如此(如果不进行分析很难提前知道)。

    每次修改 DOM 时,浏览器都必须重排并确定页面应该如何随着您的更改而呈现。这就是为什么建议您使用 CSS 类来修改/更改样式的原因,因为它们可以一次性更改,而堆叠样式更改意味着您正在更改的每个属性都会重排。

    这些类型的 JS 性能提示有很多。归根结底,您的实际工作示例根据分析器(例如 Chrome 开发工具中可用的分析器)以及用户体验向您展示了什么。

    【讨论】:

    • 重复加载 DOM 是我迄今为止不知道的事情。谢谢马特。
    【解决方案3】:

    使用profiler 来衡量您的性能瓶颈在哪里,然后看看您能做些什么来解决它们。

    即使是优秀的程序员也非常擅长构建性能 最终错误的论点,所以最好的程序员更喜欢 探查器和测试用例进行推测。 ——马丁·福勒

    【讨论】:

    • 使用分析器已经有一段时间了。但我缺乏的是我可以在我的代码中做出的实际改进。无论是在设计方面还是在重构我的 js 代码之类的方面。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多