【发布时间】:2013-06-03 12:53:56
【问题描述】:
我正在用 Java 编写一个模拟器(目前在 6502 处理器上工作),并且我计划对一些原始类型使用我自己的包装器,仅仅是因为它使我能够更轻松地做一些事情。问题是,我打算模拟一个完整的 NES 控制台,并且 CPU 可以访问 65536 字节的内存。原始字节为 1 个字节,包装器至少为 8 个字节。创建一个 65536 字节(原始)与 65536 字节(包装器)的数组将导致至少 8 倍的内存使用量,不考虑寄存器等。不仅如此,我只能假设使用对象而不是原始类型会更慢。我现在想知道的是,既然现代处理器无论如何都有大量的 RAM,那么使用至少 8 倍的内存只是为了让自己更容易一点(并且可能会稍微减小模拟器的大小)是不是很糟糕?或者我应该保持高效并只使用原始类型?
【问题讨论】:
-
实际上,由于 OOP 压缩,对
Byte的引用至少(并且仍然通常)为 4 个字节。 -
是的,也许是标准的 Java Byte 包装类,但我使用的是我自己的。我怀疑这意味着它仍然是 8 个字节。
-
不,引用就是引用……这是低级 JVM 优化。它将普通对象指针存储在 4 个字节而不是 8 个字节中。无论如何,无论您使用哪个对象,您都将缓存所有 256 个可能的值,并且占用空间几乎完全与对象的大小无关。
-
这个问题是用 Java 标记的,所以只是一个评论:有一个 Scala 特性允许您扩展原始类型而不会造成任何性能损失。所以你不会“丢失”像“+”这样的普通运算符,它保持代码干净(不需要包装器),你可以添加自己的“运算符”。
-
为什么您考虑使用包装字节作为选项?您期望获得什么好处?
标签: java performance memory emulation wrapper