Java缓冲区类型与本机数组:哪个更快?

2020-12-01 06:15:14

用C语言编程时,必须手动分配和取消分配内存。这是一个容易出错的过程。相反,像Java这样的较新语言通常会自动管理其内存。 Java依赖于垃圾回收。实际上,内存是根据程序员的需要分配的,然后Java指出不再需要某些数据,并检索相应的内存。垃圾回收过程既快速又安全,但是它不是免费的:尽管进行了数十年的优化,但它仍然可能给开发人员带来很多麻烦。

Java具有本机数组(例如int []类型)。这些数组通常在“ Java堆”上分配。也就是说,它们由Java作为动态数据进行分配和管理,并进行垃圾回收。

Java还具有Buffer类型,例如IntBuffer。这些是高级抽象,可以由本机Java数组支持,也可以由其他数据源(包括Java堆外部的数据)支持。因此,可以使用Buffer类型来避免过多地依赖Java堆。

但是我的经验是,与本机阵列相比,它会带来一些性能损失。我不会说缓冲区很慢。实际上,给定Buffer和流(DataInputStream)之间的选择,您应该强烈赞成Buffer类型。但是,根据我的经验,它们不如本地数组快。

我可以使用“ new int [50000]”或“ IntBuffer.allocate(50000)”创建50,000个整数的数组。后者本质上应该创建一个数组(在Java堆上),但是使用IntBuffer“接口”包装。

可能的直觉是,使用高层接口包装数组应该是免费的。尽管高水平的抽象确实不会带来性能损失(有时甚至会提高性能),这是事实,但是否这样做是一个凭经验的问题。您永远不应仅仅假设您的抽象是免费提供的。

因为我在做经验陈述,所以让我们用我能想象的最简单的检验对它进行经验检验。我要向array / IntBuffer中的每个元素添加一个。

我的期望是,Java适用于数组的许多优化都不适用于Buffer类型。

当然,这几乎不告诉我们使用缓冲区从Java堆外部映射值时会发生什么。我的经验表明,情况可能更糟。

缓冲区类型并未使本机数组过时,至少在性能方面没有。