15. 埋点引入SPOF(单一故障点)带给合作网站稳定方面的侵扰 SPOF: A single point of failure (SPOF) is a part of a system which, if it fails, will stop the entire system from working. (一个会被反复提及的概念) 阻滞不仅仅是速度问题还涉及客户网站的稳定! 客户网站稳定依赖CDN上inf.js的稳定 还可能依赖doc.write("<script>")指向的动态广告服务的稳定 而当严重阻滞发生时,问题主要出现在HTTP建立连接,等待响应等阶段.往往和文件大小关系不大了. SLO-JS and how to speed up widgets 11
16. 第三方埋点代码优化思路 以及我们在优化时无法绕开的限制 思路一: 推倒!让用户修改发布代码! 寻找不依赖静态<script>节点和doc.write的解决方案.(案例: dojox.analytics.Urchin对GA的封装,GA自身的改变) 思路二: Fast By Default!尽最大可能提升每天数十亿已经加入了广告埋点网页的速度.(案例:Google Adsence在Velocity2010最近披露的优化方案) 待解决问题和业务限制: 脚本阻滞x2+文件大+缓存短+重复加载 需要解决! 位置明确+接口简单+速度+安全+客户端信息 不能牺牲! 12
18. 无阻脚本下载方案 Steve: Loading Scripts Without Blocking 14 脚本存在于不同域名下 无阻加载备选方案: Script Defer Script DOM Element Doc.write Script in Iframe Doc.write Script in Iframe
20. Script Dom Element 真异步!真无阻? 玉伯:Script 元素的异步加载属性 async-test.js: var g = 1; <script> function scriptDomElement(u) { var a = document.createElement('script'); a.src = u; document.getElementsByTagName('head')[0].appendChild(a); } scriptDomElement('async-test.js'); </script> <script> alert(typeof g); // 预期结果是 undefined, Firefox 3.6 弹出 number </script> 16 a.async = true; 阻滞并不仅仅是平行下载的问题,还要区分下载阻滞和运行阻滞. 上面的场景,如果async-test.js比较慢,会在下一个script节点处导致运行阻滞. 上面代码在给script增加了async属性后,除了Opera浏览器都做到了真无阻.
21. Script Dom Element 是否稳定?展现速度是否有延迟? 17 Script Dom Element技术代替静态script埋点的另一个关键是其稳定性和速度如何? 在复杂的网页上下文环境中,浏览器是否会及时的启动异步脚本的加载和执行? 我们在inf.js内选取部分流量做了一些测试:
22. 在CND上准备1.js, 2.js, 3.js (Gzip后7k)主要运行一句话: alimama_test.callback("1"); 方法一:模拟静态script埋点加载脚本 document.write("<script src='1.js'></script>"); 方法二:直接通过Script Dom Element 加载脚本 scriptDomElement("2.js"); 方法三:用setTimeout包裹,(同YUI2中内部调用了Y.later的Y.Get.script方法) window.setTimeout((function(){scriptDomElement("3.js");}),0); 在随机选中的PV中让这三个方法按照随机顺序执行分别执行 Script Dom Element 稳定和速度测试 18
23. Script Dom Element 稳定测试结论 19 综述:两天的测试中doc.write,scriptdom,timeout0+scriptdom三种方法收到PV基本一致,说明Script Dom Element基本可靠 紫色区域提示:在非IE浏览器中doc.write表现不佳,请求丢失率较高 蓝色区域提示:settimeout0+scriptdom在IE下表现不佳,请求丢失率稍高
24. Script Dom Element 速度测试结论 20 速度测试关注两种script dom方法与doc.write的载入js后执行callback的时间差 综述:script dom相比doc.write有近8%的请求慢300ms以上,待定. timeout0+script dom则有35%左右的请求慢300ms以上.淘汰之. 蓝色区域提示:有很多时候domscript是快于doc.write的,这和我们让参与测试的三种方法按随机顺序执行相关. btw:在性能要求高的情况时考虑优化YUI2的Y.Get.script()?
25. Doc.write Script in Iframe无阻滞脚本下载的又一个方案 21 function dwScriptInIframe(s){ document.write("<iframe id= 'testiframe '></iframe>"); var d = document.getElementById("testiframe").contentWindow.document; d.write('<!doctype html><html><body><scr' + 'iptsrc="'+s+'"></scr' + 'ipt></body></html>'); window.setTimeout((function(){d.close();}),0); } dwScriptInIframe("4.js"); 没有src的iframe的location和父页面相同,所以不存在跨域问题. iframe内的脚本下载对父页面其他内容而言是无阻滞的.
26. Doc.write Script in Iframe速度测试结论 22 综述:doc.write script in iframe相比doc.write同样有9%的请求慢300ms以上,也加入备选方案 蓝色区域提示:速度差超过300ms的基本请求均分在1000ms左右. 紫色区域提示:非IE浏览器中,Doc.write Script in Iframe比IE好,也比Script Dom Element要好.
28. Doc.write Script in Iframevs. Script Dom Element 两种技术都能做到无阻滞. 都能够做到无侵扰,不引入SPOF(单一故障点). 都略有延迟,8%左右的反馈慢于直接doc.write引入的JS300ms. 在直接较量中,测试收到的25013次反馈中,有14404次Doc.write Script in Iframe先返回.略占优. 如何选择?期待您的建议! 24
33. 页面Loading过程中的Dom安全操作(避免IE进程崩溃) 29 小马:“无法打开 Internet 站点 已终止操作”前因后果 这种错误很可能直接枪毙掉上面的使用anchor解决位置问题的方案. 而可能的解决方案类似YUI针对节点的onContentReady事件 YUI2YUI3 : Executes the callback as soon as the specified element is detected in the DOM with a nextSibling property (indicating that the element's children are available, determine if the content of the available element is safe to modify. ) 但这会延缓广告展现速度,如果有更好的方案还请不吝赐教!
43. 扯远点:本地存储 + eval可行? 36 velocity2010:TCP and the Lower Bound of Web Performance 数据在美国东西海岸走一圈要90ms (侧面说明不是传10k要90ms 那么1k就只要9ms.) 理论上读取本地数据一定是快的 但客户端缓存很小经常被冲刷掉 本地存储+eval是否会有帮助? (BannerMaker会在Flash中首先做一些类似尝试.) eval性能问题:GoogleMap中测试结论是eval对性能的影响可以忽略. Diffable: only download the deltas eval安全问题:本地文件容易被篡改,我们没有完全安全的沙箱保证eval出的代码不对外产生干扰.