与JavaScript(特别是Google V8)中的数组和对象相关的性能非常有趣。我在Internet上的任何地方都找不到有关此主题的详尽文章。
我了解某些对象使用类作为其基础数据结构。如果有很多属性,有时会将其视为哈希表?
我也了解有时将数组像C ++数组一样对待(即快速随机索引,缓慢删除和调整大小)。而且,有时将它们更像对象(快速索引,快速插入/删除,更多内存)。而且,也许有时它们被存储为链接列表(例如,慢速随机索引,开始/结尾处的快速删除/插入)
JavaScript中数组/对象检索和操作的精确性能是什么?(特别是对于Google V8)
更具体地说,它对性能的影响:
向对象添加属性 从对象删除属性 索引对象中的属性 将项目添加到数组 从阵列中删除项目 索引数组中的项目 调用Array.pop() 调用Array.push() 调用Array.shift() 调用Array.unshift() 调用Array.slice() 任何文章或更多细节的链接也将不胜感激。:) 问题来源于stack overflow
在JavaScript范围内的基本层次上,对象的属性是更为复杂的实体。您可以使用setters / getters创建具有不同可枚举性,可写性和可配置性的属性。数组中的项目无法通过这种方式进行自定义:它存在或不存在。在底层引擎级别,这可以在组织表示结构的内存方面进行更多优化。
在从对象(字典)中识别数组方面,JS引擎始终在两者之间做出明确的区分。这就是为什么有很多文章尝试创建类似半伪数组的对象的方法,这些对象的行为类似于一个但允许其他功能。甚至存在这种分离的原因是因为JS引擎本身将两者存储的方式不同。
属性可以存储在数组对象上,但这仅说明了JavaScript如何坚持将所有内容制作为对象。数组中的索引值与您决定在代表基础数组数据的数组对象上设置的所有属性的存储方式不同。
每当您使用合法的数组对象并使用处理该数组的标准方法之一时,您都将访问基础数组数据。特别是在V8中,这些基本上与C ++数组相同,因此将应用这些规则。如果由于某种原因您正在使用一个引擎无法确定其是否为数组的数组,那么您将处于更加不稳定的境地。在最新版本的V8中,还有更多的工作空间。例如,可以创建一个以Array.prototype作为原型的类,并且仍然可以有效地访问各种本机数组操作方法。但这是最近的变化。
指向最近对数组操作所做的更改的特定链接可能会派上用场:
http://code.google.com/p/v8/source/detail?r=10024 http://code.google.com/p/v8/source/detail?r=9849 http://code.google.com/p/v8/source/detail?r=9747 另外,这里是直接从V8来源获取的Array Pop和Array Push,它们均在JS本身中实现:
function ArrayPop() { if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { throw MakeTypeError("called_on_null_or_undefined", ["Array.prototype.pop"]); }
var n = TO_UINT32(this.length); if (n == 0) { this.length = n; return; } n--; var value = this[n]; this.length = n; delete this[n]; return value; }
function ArrayPush() { if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) { throw MakeTypeError("called_on_null_or_undefined", ["Array.prototype.push"]); }
var n = TO_UINT32(this.length); var m = %_ArgumentsLength(); for (var i = 0; i < m; i++) { this[i+n] = %_Arguments(i); } this.length = n + m; return this.length; }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。