JScript下Array对象的性能问题(5)
作者:hax 来源:hax的技术部落格 发布时间:2009-02-15 12:28:00
标签:jscript,array,数组,性能,对象
归根到底,既然是一个稀疏数组,则通常不会进行遍历,更没有理由执行 array.length = 0 之类的语句,如果要抛弃一个数组,直接 array = null 即可。
相反,普通(非稀疏)的数组,就是用来遍历的。因此很容易写出这样的代码:
while (array.length > 0) {
var e = array.pop()
// do sth for e
}
或者
while (array.length > 0) {
var e = array[array.length - 1]
// do sth for e
array.length--
}
所以我所能得出的结论是,JScript的Array.length的算法实现实在非常愚蠢。幼稚程度堪比我们诟病的白痴的垃圾回收策略。
当然,比起垃圾到极点的垃圾回收算法给我们造成的麻烦,这个length的问题还是可以有workaround的,不必干等IE8那样复杂到狂出bug(见第一篇blog下面的comments)的设计。比如IE8 beta1的platform performance improvements白皮书里就提到,有人自己造轮子:
//user defined array type called 'prototypeArray'
var prototypeArray = function() {
this._array = [];
this.length = 0;
this.start = 0;
this.end = 0;
}
//push method for user defined array type 'prototypeArray' prototypeArray.prototype.push = function() {
var l = arguments.length;
for (var i=0;i<l;i++){
this.length++;
this._array[this.end++] = arguments[i];
}
}
//pop method for user defined array type 'prototypeArray' prototypeArray.prototype.pop = function() {
var obj = null;
if (this.length>0){
this.length--;
obj = this._array[--this.end];
delete this._array[this.end];
}
return obj;
}
//creating an object of user defined array type 'prototypeArray' var myArray = new prototypeArray();
//accessing push and pop methods of user defined array type 'prototypeArray'
myArray.push("Test String")
myArray.pop();
一个用js代码自造的轮子,居然比c写的built-in函数跑的还要快,真是让人汗颜。
另外一个更简便的方式,就是记住这个简单的最佳实践:
少去改length!特别不要在循环中做pop()或length--之类的操作。如果要减,等到循环结束,一次性减到底就好了!
BTW,我们也要注意shift()、unshift()、splice()之类的操作,因为这些操作可能会改变大量数组元素的索引——按照稀疏数组的实现,显然会比单单改length更慢上许多!如果你真的需要shift()、unshift(),那还是自制一个类似上面的轮子吧(提示:上面代码的start属性就是为此准备的)。


猜你喜欢
- 钉钉SDK对接sdk还是遇到不少问题的钉钉python版SDK文档地址:https://dingtalk-sdk.readthe
- 很多时候,设计师们都会通过各种渠道去了解用户的需求,然而从这些渠道反馈回来的信息大部分只是用户的期望并不是真正的用户需求,但是很多时候这些期
- SQLyog是一款MySQL可视化工具,他可以将部分SQL操作通过图形化界面操作来完成,方便开发者更好的进行开发及数据库设计。在安装SQLy
- 目录实例031:字母识词实例032:反向输出II实例033:列表转字符串实例034:调用函数实例035:设置输出颜色实例036:算素数实例0
- 此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题。希望帮助
- 本文实例讲述了Python快速查找算法的应用,分享给大家供大家参考。具体实现方法如下:import randomdef partition(
- 不知道用ASP写代码的朋友是不是和我有一样的感受,ASP中最头疼的就是调试程序的时候不方便,我想可能很多朋友都会用这样的方法&ldq
- 问题:1. 访问 ASP 页面时,出现以下错误:Active Server Pages 错误 'ASP 0201'错误无效的
- (1) variable = a if exper else b(2)variable = (exper and [b] or [c])[0
- 效果如下图:当点击问题时显示下面的回复内容。script type="text/javascript"> onlo
- 一、事务 mysql事务是用于处理操作量大、复杂性高的数据1. 事务特性
- 一、Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页@RenderBody当创建基于_Layout
- 本文实例为大家分享了JavaScript缓动动画函数的封装代码,供大家参考,具体内容如下本文将从封装缓动动画的以下几个部分进行封装(1、单个
- 1、开始->运行,输入SERVICES.MSC到服务里,停止所有Oracle服务; 2、开始->程序->Oracle - OraHome81
- python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。如果你用的是python
- 本文实例讲述了php绘制圆形的方法。分享给大家供大家参考。具体实现方法如下:php绘图的基本步骤,有四步(php.ini里的 extensi
- 最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读
- AJAX:Asynchronous JavaScript And XML--------异步JavaScript和XML
- Tensorflow 提供了一种统一的格式来存储数据,这个格式就是TFRecord,上一篇文章中所提到的方法当数据的来源更复杂,每个样例中的
- 效果如图所示:测试sql语句如下:declare @tab table(Class varchar(20),Student varchar(