`
yy_web
  • 浏览: 11721 次
  • 性别: Icon_minigender_1
  • 来自: 岳阳
社区版块
存档分类
最新评论

高性能的Ajax应用-Julien Lecomte

阅读更多

高性能的Ajax应用-Julien Lecomte


第1部分 高性能的开发

1.为高性能计划和设计
-从每一天开始就要计划高性能
-跟产品经理和设计师紧密的合作
-理解设计的基本原理
-设计和性能之前做解释和权衡
-提供选择和展示各种可能(原型)
-挑战自己,实现有挑战性的设计(不要只说“不”)
-为了简化设计和交互,有时候需要妥协

2.高性能工程开发:一些基本规则
-少就是多。不要做任何不必要的事。直到变得绝对重要,否则不要做。
-打破规则。只能在迫不得以的情况下,才能妥协并打破最佳做法。
-在提升可以感觉到的性能上下功夫。

3.衡量性能
-使用用户真实环境测试
-在开发中,profile你的代码
-使用自动的profiling/性能测试
-保持功能执行的历史数据
-在产品中考虑保留一些(少量的)profiling代码

第2部分 高性能的页面下载

1.Yahoo!的14条性能原则
一个页面工作于3(有时是重叠的)个阶段-下载,渲染,运行。14条原则大部分作用于第1个阶段。

2.资源优化
-最小化CSS和Javascript文件。推荐使用YUI Compressor(http://developer.yahoo.com/yui/compressor)压缩。远离那些所谓的先进的压缩方案,如Packer。
-合并CSS和Javascript文件。在发布的时候合并(http://www.julienlecomte.net/blog/2007/09/16)或在运行的时候合并。
-优化图片资源。如:PngCrush(http://pmt.sourceforge.net/pngcrush)、PngOptimizer(http://psydk.org/PngOptimizer.php)等。

3.减小非压缩代码的大小
-下载和解析HTML、CSS、Javascript代码的成本是很高的。
-用简练写法和写更少的代码
-用好Javascript库
-在考虑将大的Javascript文件拆成小的文件(bundle)时,解析和编译脚本时要花费大量额外的时间
-按需下载代码(HTML、CSS、Javascript),如,Lazy Loading
* 参见,http://ajaxpatterns.org/On-Demand_Javascript
* 使用 YUI Loader
* Dojo的package system
* JSAN的Import System

4.优化初始渲染(1):综合技巧
-Consider rendering the first view on the server
-关闭你的HTML标签提高解析速度。参见http://msdn2.microsoft.com/en-us/library/ms533020.aspx#Close_Your_Tags
-考虑尽早缓存。
-下载基本的资源,延迟或按需下载其他资源。使用YUI ImageLoader。

5.优化初始渲染(2):不要一直等onload
-大部分DOM操作可以在onload事件触发前完成
-如果你需要控制你的初始化代码,可以直接写在<script>里,并把它放在靠近</body>的位置
-否则,使用YUI事件组件中的onDOMReady方法
YAHOO.util.Event.onDOMReady(function () {
// Do something here...
// e.g., attach event handlers.
});

6.优化初始渲染(3):在页面下载后,再下载脚本。
-一个好的网站应该在Javascript失效下功能也应该是完整的
-因此,你可以延迟下载脚本
-这样做对下载其他资源(样式表、图片等)是有好处的
-这样做使网站下载更快

7.优化初始渲染(4):有条件的预下载
-预下载潜在的资源(Javascript、CSS、图片等)真的可以增强用户体验。
-可是,在什么时候进行功妙的预下载是关键,否则,预下载会影响用户体验。
-参见http://www.sitepoint.com/article/web-site-optimization-steps/3
-参见http://search.yahoo.com


第3部分 高性能的Javascript

1.减少符号查寻(1):范围链
-每次访问变量时都会执行查寻
-变量从当前范围向上执行查寻
-因此,无论何时都在相同范围中声明和使用变量
-完全不要使用with,它会阻止编译器生成代码时访问本地变量的速度(因为首先要遍历原型链,然后是范围链等)
-缓存外部变量到本地变量。
不好的写法:
var arr = ...;
var globalVar = 0;
(function () {
var i;
for (i = 0; i < arr.length; i++) {
globalVar++;
}
})();

好的写法:
var arr = ...;
var globalVar = 0;
(function () {
var i, l, localVar;
l = arr.length;
localVar = globalVar;
for (i = 0; i < l; i++) {
localVar++;
}
globalVar = localVar;
})();


2.减少符号查寻(2):原型链
-访问主对象上的成员的速度比访问原型链上的成员的速度快25%
-原型链越长查寻越慢
function A () {}
A.prototype.prop1 = ...;

function B () {
this.prop2 = ...;
}

B.prototype = new A();
var b = new B();//(译者:prop2为b的主对象成员,而prop1是原型链上的成员)

3.优化对象实例化
-如果你需要创建很多对象,可以考虑添加成员到原型中,而不添加到单个对象的构造器中。
-这样会减少内存的消耗
-然而会拖慢查寻查寻对象成员的速度

4.不要使用eval
-传字符串到eval中,需要编译和解释,相当的慢!
-完全不要传一个字符串到setTimeout和setInterval中。可以使用匿名函数代替。
setTimeout(function () {
// Code to execute on a timeout
}, 50);
-完全不要eval做为方法的构造器。

5.优化字符串连接
-在IE(JScript)中,连接两个字符串会导致一个新的字符串被重新分配资源,同时两个原字符串被复制:
var s = "xxx" + "yyy";
s += "zzz";
-因此在IE中,添加字符串到数组中然后再用Array.join连接比直接用+连接快很多(不要用在简单的连接中)
-其他Javascript引擎(WebKit、SpiderMonkey)已经对字符串连接做了优化
-使用YUI Compressor!

6.优化正则表达式
-尽量不要用RegExp构造,除非你的正则表达式需要实时创建。
-使用test方法测试一个pattern(exec方法会有小的性能问题)
-使用非捕获组(?:)
-保持pattern的简单

7.缓存
-在下面情况下应用缓存是合理的:
* 更低成本的获取一个值
* 值会被经常读取
* 值不经常改变
-会增加内存消耗(权衡)
-Memoization:
Module Pattern:

var fn = (function () {
var b = false, v;
return function () {
if (!b) {
v = ...;
b = true;
}
return v;
};
})();

 Store value in function object:


function fn () {
if (!fn.b) {
fn.v = ...;
fn.b = true;
}
return fn.v;
}

Lazy function definition:
var fn = function () {
var v = ...;
return (fn = function () {
return v;
})();
};

8.如何控制长时间运行处理的Javascript
-在Javascrit的长时间运行处理过程中,整个浏览器会被冻结
-因此为了维持好的用户体验,确保Javascript一个线程在约300兆秒内完成
-你可以通过用setTimeout将长运行处理拆成的更小处理单元串起来执行
-更多见http://www.julienlecomte.net/blog/2007/10/28/
-例子http://www.julienlecomte.net/blogfiles/javascript/long-running-js-process.html
function doSomething (callbackFn) {
// Initialize a few things here...
(function () {
// Do a little bit of work here...
if (termination condition) {
// We are done
callbackFn();
} else {
// Process next chunk
setTimeout(arguments.callee, 0);
}
})();
}

9.综合技巧
-简单的操作符往往比相应的方法要快
c = Math.min(a, b);
c = a < b ? a : b;//更快

myArray.push(value);
myArray[myArray.length] = value;//比上面快
myArray[idx++] = value;//比上面快

-避免使用try...catch在影响性能的部分:
不好的写法:
var i;
for (i = 0; i < 100000; i++) {
try {
...
} catch (e) {
...
}
}
好的写法:
var i;
try {
for (i = 0; i < 100000; i++) {
...
}
} catch (e) {
...
}
-If possible, avoid for...in in performance-critical sections
-无论何时分支条件都不改变的情况下,分支应该在外面,不要在里面:
不好的写法:
function fn () {
if (...) {
...
} else {
...
}
}

好的写法:
var fn;
if (...) {
fn = function () {...};
} else {
fn = function () {...};
}


第4部分 高性能的动态HTML

1.文档树的修改:使用innerHTML
注意事项http://www.julienlecomte.net/blog/2007/12/38

2.文档树的修改:使用cloneNode
注意:expando属性或附加的事件会丢失

3.文档树的修改:使用DocumentFragment
-DocumentFragment(DOM Level 1 Core)是一个轻量级的文档对象
var i, j, el, table, tbody, row, cell, docFragment;
docFragment = document.createDocumentFragment();
el = document.createElement("div");
docFragment.appendChild(el);
table = document.createElement("table");
el.appendChild(table);
tbody = document.createElement("tbody");
table.appendChild(tbody);
for (i = 0; i < 1000; i++) {
...
}
document.body.appendChild(docFragment);
-它仅仅支持常规DOM方法和属性的子集
-IE实现DocumentFragment不服从W3C规范

4.限制事件柄的个数
-附加事件到上百个元素上的成本很高
-多个事件柄会增加潜在的内存漏洞
-解决方案:使用事件委托机制,一种依靠事件冒泡的机制

5.限制回流(Reflow)


第5部分 高性能的布局和CSS

综合技巧
-使用CSS Sprites
-避免使用Javascript布局
-避免使用IE表达式
-避免使用IE滤镜(或尽可能少用)
-优化Table布局
-优化CSS选择器http://developer.mozilla.org/en/docs/Writing_Efficient_CSS


第6部分 高性能的Ajax

1.综合技巧
-完全不要使用同步的XMLHttpRequest。参见http://yuiblog.com/blog/2006/04/04/synchronous-v-asynchronous
-编程处理网络超时
-解决方案:使用YUI Connection Manager
var callback = {
success: function () { },
failure: function () { },
timeout: 5000
};
YAHOO.util.Connect.asyncRequest("GET", url, callback);

2.提升可以感觉到的网络延迟体验
-如果数据在提交到服务器端之前经过本地校验,通常请求的成功率达99.9%
-因此,为了优化用户体验,我们可以采用下面的Pattern:
* 当请求发出时要更新UI
* Lock the UI/data structures with the finest possible granularity.
* 让用户知道发生了什么事
* 让用户知道为什么UI被锁定
* 当成功返回结果后要及时解除锁定
* 要用优雅的方式处理错误

3.综合技巧
-知道并发HTTP/1.1连接的最大数量
-如果后端支持,支持多元的Ajax请求
-Piggyback unsollicited notifications in a response to an Ajax request.
-用JSON代替XML做为数据交换格式
-推送,不要轮询。使用COMET向浏览器发送实时的通知
-考虑使用本地存储器缓存数据。
* IE的userData
* Flash本地存储
* DOM:Storage(WHATWG持久存储API, 已在Firefox2中实现)
* Google Gears
* 其它


第7部分 性能工具

-YSlow? http://developer.yahoo.com/yslow
-Task Manager
-IE Leak Detector a.k.a Drip [ http://www.outofhanwell.com/ieleak/ ]
-Stopwatch profiling
* AjaxView [ http://research.microsoft.com/projects/ajaxview/ ]
* JsLex [ http://rockstarapps.com/pmwiki/pmwiki.php?n=JsLex.JsLex ]
* YUI profiler [ http://developer.yahoo.com/yui/profiler/ ]
-Venkman or Firebug Profiler [ http://www.getfirebug.com/ ]

(原文:http://yuiblog.com/blog/2007/12/20/video-lecomte/)

 

 

 

分享到:
评论

相关推荐

    Marchal: Insight XVI - Julien Marchal - 单曲 - 网易云音乐.mp3

    Marchal: Insight XVI - Julien Marchal - 单曲 - 网易云音乐.mp3

    Serious Python_Julien Danjou

    Julien Danjou在他的书中很可能会提供关于如何使用最佳实践来部署Python应用的建议。这可能包括了容器化技术,比如Docker的使用,以及如何与Kubernetes等编排工具协作,确保应用的高效运行。除此之外,还可能讨论了...

    c04-s07-exercices-julien-milosz:GitHub Classroom创建的c04-s07-exercices-julien-milosz

    HéritageMultiple,Ordre de Construction et vtableFichier Animal.hpp 举例说明了多个滑梯,滑梯和滑梯。Fichier MyClass.hpp 班级合唱团的字体qu'afficher dans cout les appels de建造者/破坏者/方法论蒙特·...

    aurelia-et-julien.github.io

    Aurelia是一个现代JavaScript前端框架,用于构建高性能、可扩展的单页应用程序(SPA)。Julien可能是项目的创建者或主要贡献者。描述中的内容为空,所以我们主要依赖标签和文件名来理解这个压缩包的内容。 标签 ...

    matlab换手率代码-Final-Project-Julien-Pascal:最终项目-朱利安-帕斯卡

    它解释了为什么低工资和高工资比中间工资更能循环使用。 程式化的事实美国劳动力市场 本节以直观的方式展示了模型旨在说明的事实。 ###每月失业率1951年-2015年资料来源:作者根据美国劳工统计局的数据计算。 系列...

    Python高手之路 - [法] 朱利安·丹乔(Julien Danjou)

    kindle可以直接打开,可以改后缀,变成upub格式,Python高手之路 - [法] 朱利安·丹乔(Julien Danjou)

    从HTTP性能基准测试谈Vert.x高性能的秘密:从JIT编译到网络优化_英文.pdf

    它建立在Netty之上,Netty是一个高效的异步事件驱动的网络应用程序框架,为高性能、低延迟的网络应用提供了基础。 Techempower Framework Benchmark是文中提及的一个关键测试平台,它评估了实际生产环境中应用框架...

    Julien Lenoir - Implementing Your Own Generic Unpacker.pdf

    Julien Lenoir - Implementing Your Own Generic Unpacker.pdf

    Julien Lenoir - Implementing Your Own Generic Unpacker.zip

    《Julien Lenoir - 实现你自己的通用解包器》是关于计算机编程领域中一个技术专题的资源,主要探讨如何构建一个能够处理多种不同压缩格式的通用解包器。这个话题涉及到计算机科学中的文件格式解析、数据压缩算法以及...

    react-dotlet:完整的 JS 版本 Dotlet

    原始应用程序: : 存档 Java 源文件: : 出版物: Vital-IT,2016 年 - Julien Delafontaine ( )技术从: React - 还原Webpack - babel - browsersync - 热加载器材料设计CSS 模块从源代码构建安装 node.js 和 npm...

    The Hacker's Guide to Scaling Python_Julien Danjou

    这本书在Python社区内被广泛认为是一本经典之作,尤其适合那些希望提高他们Python应用性能和扩展性的开发者。 本书的标题即直接指出其核心内容是关于如何规模化地使用Python。"Scalability"在计算机科学中指的是...

    scikit-rf 开源库微波分析

    - Julien Hillairet,来自法国CEA,IRFM。 - Jackson Anderson,来自美国Purdue University。 - Henrik Forstén,来自芬兰VTT Technical Research Centre of Finland。 - Vincent Rieß,来自德国AES GmbH。 - ...

    High Performance JavaScript

    Zakas and five other JavaScript experts — Ross Harmes, Julien Lecomte, Steven Levithan, Stoyan Stefanov, and Matt Sweeney — demonstrate optimal ways to load code onto a page, and offer programming ...

    Julien Arcamone - Leti

    3D 顺序集成技术是近年来半导体领域内一个备受关注的研究方向,它允许在垂直方向上堆叠多层集成电路,从而实现更高的密度和更短的互连距离,这对于提升芯片性能和降低能耗具有重要意义。 - **教程**:P. Batude 在...

    Python库 | django-simple-bulma-2.0.2.tar.gz

    Bulma是由Julien Lecomte创建的一个现代CSS框架,它基于Flexbox布局模型,提供了多种预定义的CSS类,用于快速构建响应式布局。Bulma的核心特点是简洁的代码、易于定制以及对现代浏览器的良好支持。通过使用Bulma,...

    julienguittard.com-php:Julien Guittard网站源代码-Website source code php

    8. **安全措施**:考虑到Web应用的安全性,源代码可能包含预防SQL注入、XSS攻击等的安全实践。 9. **配置文件**:可能包含服务器配置、数据库连接信息、应用设置等。 10. **自动化工具**:如Composer(PHP的依赖...

    附录里的matlab代码-linearFW:具有线性收敛速度的Frank-Wolfe优化变体

    Lacoste-Julien and Martin Jaggi NIPS 2015 它涵盖了针对方程式中描述的问题的Frank-Wolfe优化变量的全局线性收敛速度。 (1)在论文中。 它包含Frank-Wolfe的实现,在两个应用程序上分别执行Frank-Wolfe和成对的...

    wolfe函数MATLAB代码-gapBCFW:注意结构化SVM块Frank-Wolfe优化的差距,ICML2016

    wolfe函数MATLAB代码注意结构化 SVM 块 Frank-Wolfe 优化的差距 这是 ICML-2016 论文中提出的结构化 SVM (SSVM) ...此代码基于库,并以类似的方式组织: ...applications包含依赖于应用程序的代码...Lacoste-Julien、Simon},

    The Hacker's Guide to Python

    - **Sphinx与reStructuredText**:介绍了使用Sphinx工具结合reStructuredText语法来编写高质量文档的方法。 - **Sphinx模块扩展**:讨论如何利用Sphinx插件系统来增强文档功能,提高效率。 - **扩展Sphinx**:提供了...

Global site tag (gtag.js) - Google Analytics