【发布时间】:2014-09-22 08:31:51
【问题描述】:
来自 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];
【问题讨论】:
-
完美的问题... +1,但我担心这主要是基于意见。
-
我认为如果 foos 和 bar 的连接比 bar 与其他 bar 以及 foos 与其他 foo 的连接更多,我会推荐第一种方法。而且节省的时间也很少。这个特定的功能必须运行至少 600,000,000 次才能弥补你 5 分钟的思考时间。
-
JS 是一种非常高级的语言,所以我很确定您不必担心数据结构的内存布局。您如何构建对象也几乎取决于您,最好为您的数据考虑一个更具体的用例以找到一个好的表示。
-
我不知道点击 [Run Test] 按钮有什么作用,所以如果这搞砸了,我为 firefox 测试道歉:(
-
除非您使用类型化数组(并通过DataView 左右访问它们),否则您几乎无法管理内存布局。此外,一切都是对象,因此您无法真正创建无 OOP 的纯数据对象。
标签: javascript oop memory-layout data-oriented-design