JScript下Array对象的性能问题(2)
作者:hax 来源:hax的技术部落格 发布时间:2009-02-15 12:28:00
标签:jscript,array,数组,性能,对象
之所以有这样的结果,是因为length减小时,引擎不仅仅是改变了length的值,而且要删除所有索引大于等于新的length的元素。
本来这件事情可以这样做(我相信大多数程序员的第一感觉也就是这样做):
function get_length() { return this._length }
function set_length(len) {
if (len < 0 || len > 0xffffffff) throw RangeError()
if (len > this._length) {
this._length = len; return
}
while (len < this._length) {
delete this[--this._length]
}
}
如果确实这样做的话,性能绝不会如此糟糕(不信你可以写个自己的MyArray来试验一下——用JS写出来的居然比built-in的C实现还要快)。
但是,JScript团队的程序员,据说认为JS的Array其实是稀疏数组,或者说就是一个hash——理论上也确实如此,所以采用了大概是这样的算法(以JS来示意):
function get_length() { return this._length }
function set_length(len) {
if (len < 0 || len > 0xffffffff) throw RangeError()
if (len < this._length) {
for (var k in this) {
var i = toUint32(k)
if (i >= len) delete(this[k])
}
}
this._length = len
}
其中toUint32(s)将一个32位无符号整数的十进制字符串表达转为数字,如果转换失败则返回-1。【注意,此toUint32与parseInt不同,传入'0123'、'123.00'、'+123'、'1e4'等都会转换失败。】
这段代码遍历所有的key(因为Array本质上是把数字索引转换为字符串索引来保存的),如果这个key可以被转回无符号整数(也就是数字索引),则看看它是否大于指定的长度,大于的话就删掉。
好了,现在我们就不难理解为什么性能会与元素个数成正比了。假如一个50000个元素的数组,pop()了一下之后,居然也要遍历50000个元素!如果是在一个循环中不断pop()可想而知会有多慢。


猜你喜欢
- queue模块简介queue模块是Python内置的标准模块,模块实现了三种类型的队列,它们的区别仅仅是条目取回的顺序,分别由3个类进行表示
- 示例:# -*- coding:utf-8 -*-import jsonstrtest = {"中故宫":"好
- Default.aspx<%@ Page Language="C#" AutoEventWireup="
- 一、首先我们来填个坑支付验签失败这个问题折磨了我两天,官方文档比较含糊不清。各种百度下来的方法试过之后也不尽人意,最后发现问题是没有二次签名
- 用了两种方法保存图片,opencv和Image,实践证明opencv非常快from PIL import Imageimport osimp
- 在LintCode上练习遇到这个问题,查阅资料找到多种方法,总结如下。输入输出123321第一种:整数方法取余取整实现class Solut
- MySQL超长字符截断又名"SQL-Column-Truncation",是安全研究者Stefan Esser在2008
- 今天重新研究了下VB里面的ScriptControl组件,发现asp里面也能调用。研究了下方法,后来和lcx讨论了下。得到了如下代码,在此感
- 基本思路:首先用开发者工具找到需要提取数据的标签列利用xpath定位需要提取数据的列表然后再逐个提取相应的数据:保存数据到csv:利用开发者
- eval()函数可以将字符串型的list、tuple、dict等等转换为原有的数据类型即使用eval可以实现从元组,列表,字典型的字符串到元
- 本文实例讲述了Python中函数及默认参数的定义与调用操作。分享给大家供大家参考,具体如下:#coding=utf8''
- 1. 使用默认的session, 在ini文件中:from pyramid.session import UnencryptedCookie
- 本文实例讲述了Python创建模块及模块导入的方法。分享给大家供大家参考。具体分析如下:python学习手册中写道:定义模块,只要使用文本编
- 直接给源代码了:$current_dir = 'E:/temp/';$dir = opendir($current_dir)
- 实例如下所示:import matplotlib.pyplot as pltplt.imshow(img)#控制台打印出图像对象的信息,而图
- 一、实验目的熟练掌握pandas中的groupby操作二、实验原理groupby(by=None, axis=0, level=None,
- 本文实例为大家分享了python实现图片批量压缩程序的具体代码,供大家参考,具体内容如下说明运行环境:Win10 Pycharm
- 一、前言听说python很流行,因为有很多模块资源,而且导入模块,操作和理解起来很简单。所以在这里记录一下学习python的过程,我相信最重
- 前言:NumPy 是 Python 语言的一个扩充程序库,支持大量高维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。同时NumP
- 本文实例讲述了Python单体模式的几种常见实现方法。分享给大家供大家参考,具体如下:这里python实现的单体模式,参考了:https:/