Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的内存布局-面向数据与面向对象设计_Javascript_Oop_Memory Layout_Data Oriented Design - Fatal编程技术网

Javascript中的内存布局-面向数据与面向对象设计

Javascript中的内存布局-面向数据与面向对象设计,javascript,oop,memory-layout,data-oriented-design,Javascript,Oop,Memory Layout,Data Oriented Design,来自C/C++背景的对象内存布局对于减少缓存未命中是至关重要的,尤其是在控制台上工作时。面向数据的设计通常比面向对象的设计更受青睐,以帮助在内存中保持相关对象彼此接近(特别是在性能关键区域) 最近,我一直在做一些Javascript开发,我想知道Javascript社区的普遍共识是什么 由于我在Javascript方面的经验有限,我经常惊讶地看到在分析时出现完全出乎意料的结果。Javascript对象/结构的内部内存布局和实现因浏览器而异,我想知道是否值得尝试优化 我在jsPerf上创建了一个简

来自C/C++背景的对象内存布局对于减少缓存未命中是至关重要的,尤其是在控制台上工作时。面向数据的设计通常比面向对象的设计更受青睐,以帮助在内存中保持相关对象彼此接近(特别是在性能关键区域)

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

由于我在Javascript方面的经验有限,我经常惊讶地看到在分析时出现完全出乎意料的结果。Javascript对象/结构的内部内存布局和实现因浏览器而异,我想知道是否值得尝试优化

我在jsPerf上创建了一个简单的测试用例()来比较这两种方法的性能,虽然它显示了在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是一种高度开发的高性能语言,您不必担心这种微优化。您应该关注的是语义。你应该选择最能描述你意图的结构


在Windows NT 6.3

> P>中,Chrome 37.0.1985 5.125的测试是从基本假设出发,JavaScript中的对象像C++一样工作。他们没有

在C++中,一个类型的主要目的是在内存块上充当“透镜”。类布局以定义良好的方式直接定义对象描述的内存内容。C/C++数组特别需要同质类型的线性、连续布局

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

JavaScript实现可以自由地按照他们想要的方式布置内存,并且在源代码中执行的任何操作与在机器中实际完成的操作之间没有对应关系

此外,JavaScript数组是异构的,而不是同构的。也就是说,假设它被放置在连续内存中,那么C中的等效类型将是JSObject**,而不是int**(或float**)或其他类型。JS数组是对存储在别处的数据的引用的集合,因此即使这些引用在缓存线中,数据也不会被删除


所以,总而言之,这种想法只会给你带来痛苦。JavaScript是一种比C++更高级的语言,部分是放弃你习惯的控制。如果可能,这种低级优化将由解释器完成。专注于使用高效算法编写代码,自然地表达您的解决方案;这已经够难了。:-)

完美的问题+1但我担心,如果这主要是基于观点。我认为,如果foos和bars在某种程度上比bars和其他bars以及foos和其他foo有更多的联系,我会推荐第一种方法。而且节省的时间也很小。这个函数至少要运行600000000次,以弥补您5分钟的思考时间。JS是一种非常高级的语言,所以我很确定您不必担心数据结构的内存布局。如何构造对象也完全取决于您,最好为您的数据考虑一个更具体的用例,以找到一个好的表示形式。我不知道点击[Run Test]按钮有什么作用,因此如果firefox测试出现问题,我向您道歉:(除非您使用的是类型化数组)(并通过一个或多个数据库访问),您几乎无法管理内存布局。此外,所有内容都是对象,因此您无法真正创建OOP较少的纯数据对象。有趣的是,Firefox在创建
对象
数组
时具有相同的结果。对于登陆此处的新用户:他们现在并驾齐驱。只需在您的上下文中使用任何有意义的对象,就不应该这样做JoHouPuxon——这里的测试没有一个真正测试这个问题。对于大多数的Web开发者来说,数组不太可能足够大到足以证明内存布局优化。最好是看计算和网络。如果我们现在还需要控制内存,我们可以编译C++到Web汇编或ASM.JS。