如何减少Scala中创建的对象数量?

2024-04-29

我正在 Scala 中编写一个计算机图形应用程序,它使用 RGB 类返回图像中某个点的颜色。正如你可以想象的,返回颜色 RGB 对象的函数被调用了很多次。

class RGB(val red: Int, val green: Int, val blue: Int) { }

有一个函数 getPixelRGB 经常使用,如下

val color:RGB = getPixelRGB(image, x, y)

问题是我可能会调用这个函数一百万次,然后我相信会生成一百万个唯一的 RGB 对象实例,这是一种非常没有吸引力的情况。对此我有一些想法:

  1. 如果调用 getPixelRGB 无数次,它可能会创建无限数量的对象,但它不一定是无限数量的对象,因为最多只能为 RGB 生成 255 * 255 * 255 种可能的组合。因此创建的对象数量“应该”是有限的。可以调整此函数以使用对象池,如果要返回与之前某个时间相同的颜色,则可以返回该颜色的相同池对象实例。

  2. 我可以将此 RGB 编码为 Int。 Int 的内存开销比普通的 Scala/Java 对象要少,Java 对象有额外的内存开销。由于 Scala Int 类型有 4 个字节宽,因此前 3 个字节可以存储 RGB 值。我认为,仅从 getPixelRGB 方法返回 Int 而不是 RGB 会减少内存开销。然而,如何在保持 RGB 类的说服力的同时做到这一点呢?

  3. 据说,它们是短暂的对象,我读到垃圾收集器应该快速回收它们。不过我还是很担心。 GC 如何知道我要快速丢弃它?太令人困惑了。

所以总的来说,我的问题是如何使这个 getPixelRGB 更加内存友好?我还应该担心吗?


You can 用单个长整型编码 RGB http://www.pbdr.com/pbtips/ps/rgblong.htm or int https://stackoverflow.com/a/13646533/298389。此外,在 scala 2.10 中你可以定义价值等级 http://docs.scala-lang.org/sips/pending/value-classes.html对于原始值,比如说

class RGB private(val underlying: Long) extends AnyVal {
  def toTriple = /*decoding to (red, green, blue)*/
} 
object RGB {
  def apply(red: Int, green: Int, blue: Int) = /* encode and create class with new RGB(longvalue)*/
}

使用值类,您仍然可以拥有类型信息并享受 JVM 中的无类内存布局。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何减少Scala中创建的对象数量? 的相关文章

随机推荐