【问题标题】:Does object overhead matter when emulating a 6502 processor in Java? (using wrappers instead of primitive types)在 Java 中模拟 6502 处理器时,对象开销是否重要? (使用包装器而不是原始类型)
【发布时间】: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


【解决方案1】:

我怀疑 JVM 本身的内存占用会缩小您为 6502 仿真分配的任何内存。

正如这类问题经常被引用的那样,

过早的优化是万恶之源

我会先让您的实现正确,然后才能确定您可以/应该进行的任何优化。

【讨论】:

  • 这个“drawf”是什么意思?我认为它与压缩/缩小某些东西有关,但你的意思是什么?
  • 这是简单的英语语言 :) "A dwarfs B" == "B 与 A 相比看起来像个侏儒"。
  • 啊,就这样。反正我很少听说矮人这个词用作动词,所以我很困惑。
【解决方案2】:

与此 CPU 的速度相比,您当前的机器要快得多,因此您真的不需要担心性能。您可能会不顾一切地编写非常糟糕的代码来解决这样的问题。 :)

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2016-06-03
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多