- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 JavaScript(尤其是 Google V8)中与数组和对象相关的性能记录起来会非常有趣。我在 Internet 上找不到任何关于此主题的综合文章。
我知道有些对象使用类作为它们的底层数据结构。如果有很多属性,有时会被当作哈希表处理吗?
我还了解到数组有时被视为 C++ 数组(即快速随机索引、缓慢删除和调整大小)。而且,其他时候,它们更像是对象(快速索引、快速插入/删除、更多内存)。而且,也许有时它们被存储为链表(即缓慢的随机索引,在开始/结束时快速删除/插入)
JavaScript 中数组/对象检索和操作的精确性能如何?(专门针对 Google V8)
更具体地说,它对性能的影响是什么:
任何有关更多详细信息的文章或链接也将不胜感激。 :)
编辑:我真的很想知道 JavaScript 数组和对象在幕后是如何工作的。此外,在什么上下文中,V8 引擎“知道”“切换”到另一个数据结构?
例如,假设我用...创建了一个数组
var arr = [];
arr[10000000] = 20;
arr.push(21);
这里到底发生了什么?
或者……这个……呢???
var arr = [];
//Add lots of items
for(var i = 0; i < 1000000; i++)
arr[i] = Math.random();
//Now I use it like a queue...
for(var i = 0; i < arr.length; i++)
{
var item = arr[i].shift();
//Do something with item...
}
对于常规数组,性能会很糟糕;然而,如果使用了 LinkedList……还不错。
最佳答案
我创建了 a test suite, precisely to explore these issues (and more) (archived copy)。
从这个意义上说,您可以看到这个 50 多个测试用例测试器中的性能问题(这需要很长时间)。
顾名思义,它探索了使用 DOM 结构的原生链表特性的用法。
(Currently down, rebuilt in progress) More details on my blog regarding this .
总结如下
Array.shift()
速度比数组弹出慢约 6 倍,但比对象属性删除快约 100 倍。Array.push( data );
比 Array[nextIndex] = data
快将近 20(动态数组)到 10(固定数组)倍.Array.unshift(data)
如预期的那样慢,并且比添加新属性慢约 5 倍。array[index] = null
置空比删除它 delete array[index]
(undefined) 在数组中快约 4x++。<obj[attr] = null
~比仅删除属性慢大约 2 倍 delete obj[attr]
Array.splice(index,0,data)
很慢,非常慢。 Array.splice(index,1,data)
已经过优化(长度没有变化)并且比 splice Array.splice(index,0,data) 快 100 倍
dll.splice(index,1)
删除(破坏测试系统的地方)外,divLinkedList 在所有扇区上都不如数组。注意:这些指标仅适用于 v8 未“完全优化”的大型数组/对象。对于小于任意大小(24?)的数组/对象大小,可能存在非常孤立的优化性能案例。可以在多个谷歌 IO 视频中广泛看到更多详细信息。
注2:这些美妙的性能结果不会跨浏览器共享,尤其是*咳咳*
IE。此外,测试量很大,因此我还没有完全分析和评估结果:请在 =) 中编辑它
更新说明(2012 年 12 月):Google 代表在 youtube 上有视频描述了 chrome 本身的内部工作原理(比如当它从链表数组切换到固定数组时,等等),以及如何优化它们。参见 GDC 2012: From Console to Chrome了解更多。
关于javascript - JavaScript 中对象/数组的性能如何? (专门针对 Google V8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423493/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!