访问配置属性的成本是多少?

3
我正在开发一个Scala应用程序,每10分钟扫描一些文件夹。在我的类内部,我创建了大约12个全局变量,这有点奇怪,因为有些变量只在异常点使用了一次。
我想知道使用以下语句的成本是多少:

configuration.getString("value")

每次都是这样,而不是像下面这样创建一个全局变量:

private lazy val inputPath = configuration.getString("main.directory")

从性能方面来看,什么更好?只有在必要时调用,还是创建一个延迟的全局变量?
提前感谢您。
1个回答

6

configuration.getString("value")非常便宜。配置将在启动时被读取和解析,然后该值将存储在Java Map中。因此,调用getString基本上归结为在HashMap中查找。当然,这比共享变量更昂贵,但仍具有恒定的复杂度O(1)。尤其是当您每隔10分钟只调用几次getString时,应该没问题。

我所提到的实现可以在GitHub上typesafe/config的源代码中找到。第30行是存储值的地方。


更新:今天早上我想起了你的问题,并突然想到为什么调用getString而不是使用共享变量初始化值是一个坏主意。它没有立即出现在我脑海中,因为它与性能无关:

getString具有副作用,即当配置值不存在时,它可能会引发异常-例如,您的配置文件可能已损坏。由于通常没有此类异常的恢复策略,因此最好将这些潜在故障放在启动时,而不是在程序运行了几十分钟后再发现。

在你的问题中,你使用了lazy val作为替代方案,但它将面临同样的问题,因为只有在需要时才会被评估。因此,在我的意见中,您应该在程序开始时读取所有配置值到val中!

private val inputPath = configuration.getString("main.directory")

当然,如果您使用回退值并且确信不会发生任何异常情况,则此规则不适用。


3
如果你每10分钟只调用getString几次,那应该没问题。我会说:“如果你需要 _进行I/O扫描目录_,那应该也没问题。” - user1804599
是的,我只获取目录路径并替换一部分以找到客户端目录...这是一个简单的操作。 - user866364

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接