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

pla*_*oom 3 performance scala playframework

我正在开发一个Scala应用程序,它可以在10分钟的间隔内扫描一些文件夹.在我的课程中,我创建了12个全局变量,它有点奇怪,因为有些变量在异常点上只使用了一次.

我想知道使用成本是多少:

configuration.getString( "值")

每次改为创建一个全局变量,如:

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

在性能方面,哪个更好?只在必要时调用或创建一个惰性全局变量?

预先感谢.

Mar*_*ing 7

configuration.getString("value")非常便宜.配置将在启动时读取并解析一次,然后将值存储在java中Map.所以基本上调用getStringboils到一个查找HashMap.这当然比共享变量更昂贵,但仍然具有恒定的复杂度O(1).它应该没问题,特别是当你getString每10分钟只打几次电话时.

可以在GitHub上的typesafe/config源代码中找到我所指的实现.第30行是存储值的映射.


更新:今天早上我想到了你的问题,它突然让我感到震惊,为什么打电话getString而不是用值初始化共享变量是一个坏主意.我没有立刻想到它,因为它与性能无关:

getString有副作用,即它可以在配置值不存在时抛出异常 - 例如,您的配置文件可能已损坏.由于通常没有针对此类异常的恢复策略,因此在没有人再观看的情况下,在启动时将这些潜在的失败而不是在几十分钟的时间内更好的做法会更好.

在您的问题中,您使用了lazy val一个替代方案,它将暴露于同样的问题,因为它只会在需要时进行评估.所以在我看来,你应该val在程序开始时将所有配置值读入s!

private val inputPath = configuration.getString("main.directory")
Run Code Online (Sandbox Code Playgroud)

如果您使用回退值并且100%肯定没有例外,这当然不适用.

  • "它应该没问题,特别是当你每隔10分钟调用一次`getString`时." 我会说"应该没问题,特别是因为你正在用I/O扫描目录_". (3认同)