首先牢骚几句。。。
这一次性能优化针对的模块,初次开发阶段客户给的时间就非常少,俩月时间跳过设计一边需求分析一边编码,最后干出6000+的代码行。
最终结果嘛,呵呵,除开一堆bug不说,性能就是个非常大的问题。
这次客户想让我们给它优化了,给的工时仍然是少少少。。。
常规方法都备齐之后性能没有太多改善,因为主要问题是出在业务逻辑结构上,在没有时间对整体结构动大手术的前提下,想出了这么几个偏方。

偏方一:
我们的开发只针对IE浏览器,这一偏方对于其他浏览器可能不适用。
要优化的主页面,完全是由JS动态加载数据并生成元素再添到页面上的,虽然各个元素都是构造好以后就append到了页面上,但是跑JS的时候整个页面就是白花花的。
究其原因,猜测是因为画面渲染和JS执行走的是同一线程,JS一直在跑,画面渲染就没法进行了。
于是我写了这么个方法:

 function asyncInvoke() {
var idx = 0;
var funcs = arguments;
var invoker = function () {
if (funcs[idx] != undefined) {
if (funcs[idx] instanceof Function) {
funcs[idx++]();
}
// 关键点
setTimeout(invoker, 1);
}
};
invoker();
}

把最顶层的几个方法都扔这个方法来调,初始化的效果就不再是整个页面在卡了半天之后duang一下都显示出来了。虽然整体用时没变,但是感官上会好很多。
原理嘛,就是setTimeout的那一毫秒,把线程的控制权交给了画面渲染,之后的JS代码就得先等一等了。

偏方二:
后来通过调查发现,在进行某一个操作的时候,某一些耗时较长的方法被反复调用了,而最终的效果其实又是最后一次运行单独决定的。
这些方法是分布在不同的几个事件里,从单一的事件来看这个方法又是必须执行的,某一操作触发了多个事件就出现了性能问题。
于是我又拜托了setTimeout,写了这么个方法:

 var InvokeCtrl = function () {
if (!(this instanceof InvokeCtrl)) return; InvokeCtrl.prototype.invokeMap = {}; InvokeCtrl.prototype.invoke = function (caller, func, args, delay) {
if (delay == undefined) delay = 10; if (this.invokeMap[func]) {
// 关键点
clearTimeout(this.invokeMap[func]);
}
this.invokeMap[func] = setTimeout(function () {
func.apply(caller, args);
}, delay);
};
};

通过InvokeCtrl.invoke来调用方法的话,就避免了无谓的多次执行。不过,只有一次执行的时候也会延迟10毫秒,这点时间对于客户来说是感觉不出来的。
原理呢,就是用Map来记录每一个要执行的方法,以及对应的setTimeout返回的ID,间隔内的再一次执行就会清除掉上一次的timeout,再把这一次要执行的内容延迟执行。
这个方法对于window.onresize的问题也是适用的,至于delay长度就要看具体方法来定了。

偏方三:
我们的画面上用了大量的HTML模板,之前的做法是AJAX请求并缓存这些模板内容,但是大量的请求显然会导致性能下降。
借鉴于doT.js的玩法,我写了这么个方法:

 function getTemplate(templateId) {
return document.getElementById(templateId).innerHTML;
}

关键是这里:

 <script id="someTemplate" type="template">
这里是模板内容
</script>

当然实际情况的模板比这个复杂得多,非常简单的模板直接用字面量形式写在JS里可能会更好。
把包含模板的script标签写到主画面的JSP上,这样就实现了一次加载,不用每次都去请求了。不过,这种写法显然会让JSP变得臃肿,一些不一定会用到的模板还是使用AJAX会更好。另外还要注意的是script标签加载前调用getTemplate方法会出错的。

最后想说的是,一切不给够时间做设计的客户都是大土鳖!

Web前端性能优化的三个偏方的更多相关文章

  1. web前端性能优化指南(转)

    web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...

  2. Web前端性能优化教程05:网站样式和脚本

    本文是Web前端性能优化系列文章中的第五篇,主要讲述内容:网站样式和脚本代码的放置位置.使用外部javascript和css.完整教程可查看:Web前端性能优化 一.将样式表放在顶部 可视性回馈的重要 ...

  3. Web前端性能优化教程03:添加Expires头

    本文是Web前端性能优化系列文章中的第三篇,主要讲述添内容:加Expires头.完整教程可查看:Web前端性能优化 什么是Expires头? Expires存储的是一个用来控制缓存失效的日期.当浏览器 ...

  4. Web前端性能优化的9大问题

    1.请减少HTTP请求基本原理:在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出.一个正常HTTP请求的流程简述:如在浏览器中输入&qu ...

  5. 阿里巴巴 web前端性能优化进阶路

    Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过一定的技术实践.可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化 ...

  6. web前端性能优化指南

    web前端性能优化指南 web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loadin ...

  7. Web前端性能优化全攻略

    网页制作poluoluo文章简介:Web 前端性能优化是个大话题,是个值得运维人员持续跟踪的话题,是被很多网站无情忽视的技术. Web 前端性能优化是个大话题,是个值得运维人员持续跟踪的话题,是被很多 ...

  8. Web前端性能优化全攻略[转载]

    1. 尽量减少 HTTP 请求 (Make Fewer HTTP Requests) 作为第一条,可能也是最重要的一条.根据 Yahoo! 研究团队的数据分析,有很大一部分用户访问会因为这一条而取得最 ...

  9. Web前端性能优化进阶——完结篇

    前言 在之前的文章 如何优化网站性能,提高页面加载速度 中,我们简单介绍了网站性能优化的重要性以及几种网站性能优化的方法(没有看过的可以狂戳 链接 移步过去看一下),那么今天我们深入讨论如何进一步优化 ...

随机推荐

  1. 【Oracle 12c】最新CUUG OCP-071考试题库(56题)

    56.(14-14) choose the best answer: You need to create a table with the following column specificatio ...

  2. “全栈2019”Java第一百一十三章:什么是回调?回调应用场景详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. MongoDB健壮集群——用副本集做分片

    1.    MongoDB分片+副本集 健壮的集群方案 多个配置服务器 多个mongos服务器  每个片都是副本集 正确设置w 架构图 说明: 1.   此实验环境在一台机器上通过不同port和dbp ...

  4. IE 8-不支持 placeholder 解决方法

    ;!function fixPlaceholder() { var hasPlaceholder = 'placeholder' in document.createElement('input'); ...

  5. [Objective-C语言教程]指针(15)

    Objective-C中的指针简单易学.使用指针可以更轻松地执行某些Objective-C编程任务,并且在不使用指针的情况下无法执行其他任务(如动态内存分配). 所以有必要学习指向成为一个完美的Obj ...

  6. null、 is_null() 、empty() 、isset() PHP 判断变量是否为空

    PHP中,在判断变量是否为空的时候,总会纠结应该选用哪个函数,下面列取常用的多种情况,其中1/3经过我的验证,其它来自网络,验证后使用... 使用 PHP 函数对变量 $x 进行比较 表达式 gett ...

  7. Tomcat启动和请求处理解析

    tomcat是我们经常使用的组件,但是内部是如何运行的呢,我们去一探究竟. 1.tomcat架构 tomcat的整体架构图如下: Tomcat中只有一个Server,一个Server可以有多个Serv ...

  8. CSS02--四种样式、背景、文本、链接状态、表格样式

    接上面的“CSS01”,我们接着来说一下样式.很多人不知道的是一个HTML元素有四种样式,分别是浏览器默认样式.外部样式.内部样式.内联样式,而它们的优先级是越来越高的,后面的样式会覆盖前面的样式.多 ...

  9. fd与FILE结构体

    文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...

  10. Exponentiation POJ-1001

    http://poj.org/problem?id=1001 //10000000 100000 #include<iostream> #include<cstring> us ...