如何优化网页的内存使用
2013-01-24 20:20
399 查看
有时候设计的代码在实际运行中难免会遇到内存使用的问题,我们不可能在内存开始清理的时候才开始解决内存问题。内存的清理工作也是网站运行中比较烦人的东西,因为我们永远无法预知浏览器什么时候开始清理,清理时间有多长。
所以,既然直接无法解决问题,我们就应该重点考虑如何避免内存问题。《高性能网站建设进阶指南》(这本书很不错,读过的人评价很高,如果你有时间,我建议你浏览下,肯定会受益匪浅)讲到了两种比较好的方式。
一、使用delete从内存移除不再使用的js对象。
一般是我在使用的过程中可能用一些变量存储了比较大的数据,但是使用完后就不再使用了,但是我可能忘记了这些变量,我在后面的程序过程中可能永远都不会再使用了。所以,最好的方式就是,当我意识到有这种情况发生时,就主动delete掉它,释放内存空间。
如:delete tempVar;
其实,这个delete还有个比较值得你使用的地方。我可以使用它来删除一个对象中一个属性。
比如,我创建了一个存储用户阅读记录的对象,它里面包含了很多用户的阅读信息,但是记录条数应该是有限制的。那么,当总数达到最大值的时候,我就需要把最早阅读的记录删除掉,这时用delete viewHistory[itemID]就可以达到我的目的。
当然,如果你用数组来存储序列,也可以使用delete来删除指定的item,但是要注意的是,删除后的数组索引并不会自动更新,而是出现隔断现象。
如:var a=[1,2,3];
delete a[1];
a.join();
你会发现最后在控制台中输出的结果是“1,,3”,很郁闷吧,所以遇到数组需要删除某个值的时候就不能直接delete某个item了。
我的做法是:让后面(当然也可以使用前面的元素向后移动)的数组元素依次向前移动一个位置(后一个元素值“覆盖”前一个元素值),然后,pop数组(或者shift最前一个元素)最后一个元素。这样数组中的序列就被更新了。
二、DOM树中移除不再是必须的节点。
这个问题是我过去比较忽视的。
一般遇到删除节点元素时,都是直接查找节点的父节点,然后调用removeChild方法来删除相应的节点(如果你使用的是Qwrap框架,你可以直接使用removeNode(targetNode))。
如:targetNode.parent.removeChild(targetNode);
好吧,最好的办法是:
delete targetNode.parent.removeChild(targetNode);
我也是第一次看这本书才发现,原来可以这么写。哇!这是洁癖么?
如果你用得着,或者以后可能用得着,那么你就做个mark吧。
PS:我还是想推荐文章开头提到的这本书,就如豆瓣上对它的书评:“尽管只读了两章,你会发现这真是一部难得的好书”。
所以,既然直接无法解决问题,我们就应该重点考虑如何避免内存问题。《高性能网站建设进阶指南》(这本书很不错,读过的人评价很高,如果你有时间,我建议你浏览下,肯定会受益匪浅)讲到了两种比较好的方式。
一、使用delete从内存移除不再使用的js对象。
一般是我在使用的过程中可能用一些变量存储了比较大的数据,但是使用完后就不再使用了,但是我可能忘记了这些变量,我在后面的程序过程中可能永远都不会再使用了。所以,最好的方式就是,当我意识到有这种情况发生时,就主动delete掉它,释放内存空间。
如:delete tempVar;
其实,这个delete还有个比较值得你使用的地方。我可以使用它来删除一个对象中一个属性。
比如,我创建了一个存储用户阅读记录的对象,它里面包含了很多用户的阅读信息,但是记录条数应该是有限制的。那么,当总数达到最大值的时候,我就需要把最早阅读的记录删除掉,这时用delete viewHistory[itemID]就可以达到我的目的。
当然,如果你用数组来存储序列,也可以使用delete来删除指定的item,但是要注意的是,删除后的数组索引并不会自动更新,而是出现隔断现象。
如:var a=[1,2,3];
delete a[1];
a.join();
你会发现最后在控制台中输出的结果是“1,,3”,很郁闷吧,所以遇到数组需要删除某个值的时候就不能直接delete某个item了。
我的做法是:让后面(当然也可以使用前面的元素向后移动)的数组元素依次向前移动一个位置(后一个元素值“覆盖”前一个元素值),然后,pop数组(或者shift最前一个元素)最后一个元素。这样数组中的序列就被更新了。
二、DOM树中移除不再是必须的节点。
这个问题是我过去比较忽视的。
一般遇到删除节点元素时,都是直接查找节点的父节点,然后调用removeChild方法来删除相应的节点(如果你使用的是Qwrap框架,你可以直接使用removeNode(targetNode))。
如:targetNode.parent.removeChild(targetNode);
好吧,最好的办法是:
delete targetNode.parent.removeChild(targetNode);
我也是第一次看这本书才发现,原来可以这么写。哇!这是洁癖么?
如果你用得着,或者以后可能用得着,那么你就做个mark吧。
PS:我还是想推荐文章开头提到的这本书,就如豆瓣上对它的书评:“尽管只读了两章,你会发现这真是一部难得的好书”。
相关文章推荐
- 如何减少网页的内存使用与CPU占用
- 如何使用JVisualVM远程监控和优化Tomcat和Java程序的内存和CPU
- 如何优化cocos2d/x程序的内存使用和程序大小
- 如何使用js懒加载图片|如何使用jquery.lazyload.js|网页优化|如何提高网页加载速度
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- 如何优化cocos2d程序的内存使用和程序大小:第一部分
- 如何优化cocos2d/x程序的内存使用和程序大小
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- 如何优化cocos2d/x程序的内存使用和程序大小【第一部分】
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
- 如何使用Dreamweaver整理HTML代码和优化网页文档
- cocos2d-x 如何优化内存使用
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
- Cocos2d-x 如何优化内存使用
- 一、cocos2dx之如何优化内存使用(高级篇)
- 如何优化内存使用
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- 如何优化cocos2d/x程序的内存使用和程序大小