在Javascript中使用Typed Array存储对象

3

我一直在使用像Int32Array这样的JavaScript typed array。我想要用JavaScript实现一个循环队列,并且不想在性能上妥协。

问题在于,队列项是JavaScript对象类型,所以我不能将它们保存在简单的Array对象中。因此,我需要一个Typed Array,可以非常适合处理JS Object类型的对象。

谢谢。

更新: 从评论中看来,人们并不清楚具有Typed Array的性能优势,所以我创建了这个js Perf测试,以使其更加明显。

http://jsperf.com/typed-array-vs-normal-array


6
真的吗?JS 对象是普通数组储存最好的东西。 - Antti Haapala -- Слава Україні
如果我没记错的话,Array 在 JavaScript 中是一个对象。 - Jeff Noel
new Array(window,document,String); 运行得很好 - 你为什么认为对象不能放在数组中 - 这是关于特定实现的吗? - MDEV
1
@Tushar你处理的数据需要那样级别的优化吗?标准数组通常非常快。如果你遇到了明显的性能问题,我必须质疑你是如何达到这个要求的。 - MDEV
4
长话短说:这些类型化数组不存在。 - Felix Kling
显示剩余6条评论
1个回答

4

Typed arrays用于高效地存储原始值。它们不是通过神奇的机制来提高性能的。它之所以快,是因为它知道存储值的类型和长度。在JavaScript中,“Object”是基本“类型”。这类似于go语言中的interface{}。你对“object”了解得不多,无法有效地存储它。因此,按照定义,对象的typed array不存在。


@Tushar 这是错误的,除非您对数组进行了非常奇怪的操作,否则它将由类似于普通的“C数组”构造支持。 - Esailija
@Esailija,你能解释一下为什么我在问题中分享的jsperf链接中会有如此大的性能差异吗? - tusharmath
你需要一个数据合同来使用C数组。缺乏这样的合同的对象将需要使用一种效率远低于“C数组”的机制。必然会有浪费。请看:https://dev59.com/s2sz5IYBdhLWcg3wlY0n#7799543 。JIT编译器可以对代码进行静态分析以减少这些低效,但我认为它永远不可能像使用C数组那样高效。 - Ege Özcan
@Tushar 在测试循环中创建数组和方法。请参见此http://jsperf.com/typed-array-vs-normal-array/4。这些测试访问速度(在V8中大致相同,因为它可以优化纯int数组,即使它们没有类型)。您应该指定应用程序的数字及其功能。 - Esailija
@Esailija,您仅可以访问该数组3次。考虑一下我的情况,我需要对该数组进行10,000,000次访问。 - tusharmath
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接