【发布时间】:2012-11-18 17:37:27
【问题描述】:
我正在用 Scala 编写一个计算机图形应用程序,它使用 RGB 类返回图像中某个点的颜色。可以想象,返回颜色 RGB 对象的函数被调用了很多次。
class RGB(val red: Int, val green: Int, val blue: Int) { }
有一个函数getPixelRGB,常用如下
val color:RGB = getPixelRGB(image, x, y)
问题是我可能会调用这个函数一百万次,然后我相信会生成一百万个唯一的 RGB 对象实例,这是一个非常没有吸引力的情况。我对此有一些想法:
如果 getPixelRGB 被调用无数次,它可能会创建无限数量的对象,但它不一定是无限数量的对象,因为最多只有 255 * 255 * 255 种可能的组合可以生产RGB。所以创建的对象数量“应该”是有限的。可以调整此函数以使用对象池,如果它要返回与某个时间相同的颜色,则它可以返回该颜色的相同池对象实例。
我可以将此 RGB 编码为 Int。 Int 的内存开销比普通的 Scala/Java 对象少,Java 对象有额外的内存开销。由于 Scala Int 类型是 4 个字节宽,前 3 个字节可以存储 RGB 值。我假设只从 getPixelRGB 方法返回 Int 而不是 RGB 会减少内存开销。但是,如何在仍然具有 RGB 类的说服力的同时做到这一点?
据推测,它们是短命的对象,我已经读过垃圾收集器应该迅速重新声明它们。不过我还是很担心。 GC 怎么知道我很快就把它扔掉了?太混乱了。
所以总的来说,我的问题是如何让这个 getPixelRGB 对内存更友好?我也应该担心吗?
【问题讨论】:
-
在性能关键型应用程序中,将值编码为整数是一种标准方法。使用对象不是一种选择,因为来回转换值。在这里,Bitshifts 是你的朋友(也许是噩梦)。
标签: scala memory memory-management garbage-collection jvm