微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript中的内存布局 – 面向对象的面向对象设计

从C/C++的背景出发,对象减少高速缓存未命中的内存布局尤为重要,特别是在使用控制台时.数据导向的设计往往比面向对象的设计更受青睐,以帮助保持相关对象在内存中彼此靠近(特别是在性能关键领域).

最近,我一直在做一些Javascript开发,我想知道Javascript社区的一般共识是什么.

由于我在Javascript方面的经验有限,我经常惊讶地发现,在分析时会发现完全意外的结果. JavaScript对象/结构的内部内存布局和实现从浏览器到浏览器都有很大的不同,我不知道尝试优化是否值得努力.

我在jsPerf上创建了一个简单的测试用例(http://jsperf.com/object-vs-data),以比较两种方法性能,而在Chrome上显示性能提升的同时,Safari没有明显的加速.

在Javascript中,我甚至应该关心对象的内存布局吗?或者更多的是“实现它的一种方式,然后优化如果需要”类型的东西?

第二个选项似乎是浪费(在开发时间方面),特别是如果有一些好的指导要遵循.

谢谢〜

补充信息:这基本上是如何在Javascript中实现两种方法的.上面的jsPerf测试用例是这样实现的.

var objectOriented = [
    { foo: 1,bar: 2 },{ foo: 3,bar: 4 }
];

var dataOriented = {
    foos: [1,3],bars: [2,4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];

解决方法

您正在从基本假设中工作,即JavaScript中的对象与C中的对象一样工作.他们不

在C中,一种类型的主要目的是在一块内存上作为“镜头”.类布局以明确的方式直接定义对象描述的内存的内容. C/C++阵列特别需要均匀类型的线性连续布局.

在JavaScript中,对象是名称/值对的集合.数组只是一个特殊的“length”属性的对象.请注意,这里没有内存布局的描述或定义.没有什么可以阻止Javascript解释器将数组实现为哈希表而不是线性内存块;事实上,我确信他们是这样做的JS实现.

JavaScript实现可以自由地布置内存,而他们想要的,并且您在源中做的任何事情与机器中实际结束之间没有任何对应关系.

此外,JavaScript数组是异构的,而不是均匀的.也就是说,假设它是在连续的内存中排列的,C中的等效类型将是JSObject **,而不是int **(或float **或者其他). JS数组是对其他地方存储的数据的引用的集合,因此即使引用位于缓存行中,您的数据也不会.

所以,总而言之,这种想法只会让你感到痛苦. JavaScript是比C更高级的语言,其中一部分是放弃你以前使用的控件.如果可能,这种低级优化将由解释器完成.专注于使用自然表达您的解决方案的高效算法编写代码;这是很难的,因为它是.

原文地址:https://www.jb51.cc/js/150933.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐