如何减少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中创建的对象数量? 的相关文章

  • scala play框架如何对异步控制器进行单元测试

    使用 Scala play 2 5 版并尝试遵循以下文档中的单元测试控制器指南 https www playframework com documentation 2 5 x ScalaTestingWithScalaTest https
  • 为什么在 Scala 中函数类型需要以单独的参数组传递到函数中

    我是 scala 新手 我用两种方式编写了相同的代码 但我对两种方式有点困惑 在第二种方式中 f 的参数类型是自动派生的 但在 type1 中 scala 编译器无法执行相同的操作 我只是想了解这背后的想法是什么 Type1 给出编译错误
  • 将 yaml 中的列表映射到 Scala 中的对象列表(Spring Boot)

    背景 我已经阅读了很多关于如何使用的示例ConfigurationProperties从配置中读取列表 见下文 https github com konrad garus so yaml https github com konrad ga
  • 并发访问且不受数据结构的影响

    问题是这样的 我有一个包含 500 个指针的数组 它们指向双向链表中的 500 个元素 有 10 个并行运行的线程 每个线程运行 50 个循环 并尝试释放列表中的某些元素 该列表已排序 包含简单整数 并且有 10 个其他线程并行运行 搜索包
  • ARC 禁止合成未指定所有权或存储的财产

    我创建了一个 property of UIColor property nonatomic UIColor color 然后我尝试合成它 synthesize color color 但我收到一个错误 ARC 禁止合成具有未指定所有权或存储
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 按字符分割字符串

    scala 有一个标准的分割字符串的方法StringOps split 但它的行为有点让我惊讶 演示一下 使用快捷便利功能 def sp str String str split toList 以下表达式全部计算结果为 true sp Li
  • Scala 交互式解释器 (REPL) - 如何将输出重定向到文本文件?

    是否可能 如果可能 是如何做到的 通常 gt and gt gt 在 Windows 或 Linux 命令行上工作的命令在这种情况下不起作用 您可以从控制台以编程方式执行此操作 import java io FileOutputStream
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • 如何在Slick 3.0.0中使用StaticQuery?

    在 Slick 2 1 中 我使用以下代码从文件执行 sql 查询 def fetchResult T sql String implicit getResult GetResult T List T val query Q queryNA
  • 在 DataFrame.withColumn 中,如何检查列的值是否为 null 作为第二个参数的条件?

    如果我有一个名为 df 的 DataFrame 如下所示 a1 a2 foo bar N A baz null etc 我可以有选择地替换值 如下所示 val df2 df withColumn a1 when a1 N A a2 这样 d
  • Spark 3 KryoSerializer 问题 - 无法找到类:org.apache.spark.util.collection.OpenHashMap

    我正在将 Spark 2 4 项目升级到 Spark 3 x 我们遇到了一些现有 Spark ml 代码的问题 var stringIndexers Array StringIndexer for featureColumn lt FEAT
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • Spark Scala 相当于 SKEW 连接提示

    Spark SQL 有一个可用的倾斜提示 请参阅here https docs databricks com spark latest spark sql skew join html relation columns and skew v
  • _bstr_t 内存泄漏

    我有一个 C 代码 但它没有正确释放内存 告诉我哪里错了 这是我的代码 1 void MyClass MyFunction void 2 3 for int i 0 i
  • 使用空/空字段值创建新的数据框

    我正在从现有数据帧创建一个新数据帧 但需要在这个新 DF 中添加新列 下面代码中的 field1 我该怎么做 工作示例代码示例将不胜感激 val edwDf omniDataFrame withColumn field1 callUDF v
  • 在 Play 上强制实施 SSL!框架

    我目前正在使用 Play 1 2 2 及其新的 Netty 客户端框架 尽管可以让 HTTP 和 HTTPS 异步服务 但我还没有找到一种简单的方法来强制执行 SSL 有没有人使用过 Play 有强制实施 SSL 的简单方法吗 不确定我是否
  • Maven SBT 依赖工件?

    我同时使用 Maven 和 SBT 管理我的项目 其原因有 Intellij IDEA无法导入SBT 项目 idea sbt 插件没有 工作得很好 我不知道如何获得来源和 来自 SBT 的 javadocs 我想看到有关此问题的任何答案 问
  • 如何在 Scala 中将 DataFrame 模式写入文件

    我有一个 DataFrame 它从一个巨大的 json 文件加载并从中获取架构 该架构基本上大约有 1000 列 我希望将 printSchema 的相同输出保存在文件中而不是控制台中 有任何想法吗 如果您在本地环境中工作 您可以执行以下操
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗

随机推荐