Joã*_*aas 6 javascript memory arrays
因此,我在考虑如何在JavaScript中将数组存储在内存中。
我已经读过JavaScript数组如何在物理内存中表示?,但找不到答案。
我在想的更多是关于阵列单元的内存位置。例如,在C语言中,定义数组时需要定义数组的大小。这样,C定义了整个内存块,并且它可以查找每个单元的确切位置。
例如:
int array[10]; // C knows the memory location of the 1st item of the array
array[3] = 1 // C can do that, because it can calculate the location
// of array[3] by doing &array + 3 * (int size)
Run Code Online (Sandbox Code Playgroud)
在JS中,可以在将内存分配给其他对象之后增加数组的大小,这意味着JS不适用于“块”类型的数组。
但是,如果数组不是单个内存块,那么JS如何计算每个单元在哪里?JS数组遵循链接列表类型的结构吗?
我向大家推荐的一件事是,node.js 最近成为了 Chrome V8 的一等公民,因此我建议学习 V8,不仅了解它如何处理这些实现细节,还了解其原因。
\n\n首先,本文应该对读者有益,因为它专注于编写优化的同构 JavaScript:
\n\n\n\n上面的文章详细介绍了 JIT(Just In Time)编译器的工作原理,因此您在阅读完本文后应该能够得出您所遇到的确切问题。
\n\n这是摘录:
\n\n\n\n\n数组:避免使用键不是增量数字的稀疏数组。稀疏数组中没有\xe2\x80\x99 的每个元素都是哈希表。访问此类数组中的元素的成本更高。另外,尽量避免预分配大型数组。最好是边走边成长。最后,不要删除数组中的元素。它使键变得稀疏。
\n
其次,我还建议阅读本文,然后针对 V8 进行扩展:\n http://www.jayconrod.com/posts/52/a-tour-of-v8-object-representation
\n\n第三,作为一个重要的额外事实,我不久前读过这个答案,并且时不时地在心里重新审视它。我现在才发现它,我感到非常惊讶。我在谷歌上搜索了“堆栈溢出优化火车轨道”并找到了它。感谢 Google:为什么处理排序数组比处理未排序数组更快?
\n\n是的,这个答案确实有 27,000 票赞成。
\n\n那篇文章讨论了分支预测,我希望您能够意识到这一点,因为它可能会对您如何处理一般数据而不仅仅是数组产生一些影响。再次注意我链接的第一篇文章,并在描述时注意order of keys on an Object.
通过了解实现细节并了解为什么以这种方式解决问题,可以优化性能。
\n\n最后,在 JavaScript 中,一切都是对象,除非它是标量值,我们称之为原语——字符串、数字、布尔值等。
\n\n这是一个发人深省的例子:
\n\nconst arr = [\'one\', \'two\', \'three\']\n\nconst sameArr = {\n 0: \'one\',\n 1: \'two\',\n 2: \'three\',\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我们可以像解构一个对象一样解构我们的数组:
\n\nconst arr = [\'one\', \'two\', \'three\']\n\nconst sameArr = {\n 0: \'one\',\n 1: \'two\',\n 2: \'three\',\n}\nRun Code Online (Sandbox Code Playgroud)\r\n您可以从该示例中得到一些提示,了解为什么更改键的顺序可能会对底层哈希表造成严重破坏。仅仅因为您看不到密钥并不意味着它们不存在并且受到影响。
\n\n在上面的例子中,如果它是一张地图,你可以这样做sameArr.get(\'0\'),并且 JavaScript 会合理地知道它在数字表中的确切位置。
由于 ES6 的彻底修改,我还建议仔细阅读旧的 JavaScript 材料。我觉得引导您使用 V8 材料是最舒服的。
\n| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |