我正在开发一个Scala应用,可以在10分钟的间隔内扫描一些文件夹。在我的班级里面,我创建了12个全局变量,它有点奇怪,因为有些变量在异常点上只使用了一次。
我想知道使用成本是多少:
configuration.getString("值&#34)
每次都要创建一个全局变量,如:
private lazy val inputPath = configuration.getString(" main.directory")
在性能方面,哪个更好?只在必要时调用或创建一个惰性全局变量?
提前感谢。
答案 0 :(得分:7)
configuration.getString("value")
非常便宜。配置将在启动时读取并解析一次,然后将值存储在java Map
中。所以基本上调用getString
归结为HashMap
中的查找。这当然比共享变量更昂贵,但仍然具有恒定的复杂度O(1)。它应该没问题,尤其是当您每10分钟拨打getString
几次时。
可以在sources of typesafe/config on GitHub中找到我所指的实现。第30行是存储值的地图。
更新:今天早上我想到了你的问题,我突然想到为什么调用getString
而不是用值初始化共享变量是一个坏主意。我没有立即想到它,因为它与性能无关:
getString
有副作用,即当配置值不存在时它会抛出异常 - 例如,您的配置文件可能已损坏。由于通常没有针对此类异常的恢复策略,因此在没有人再观看的情况下,在启动时将这些潜在的失败而不是在几十分钟的时间内更好的做法会更好。
在你的问题中,你使用lazy val
作为替代方案,会遇到同样的问题,因为它只会在需要时进行评估。因此,在我看来,您应该在程序开头的val
s中读取所有配置值!
private val inputPath = configuration.getString("main.directory")
如果您使用后备值并且100%肯定没有例外,这当然不适用。