【问题标题】:What is the cost of access to a configuration property?访问配置属性的成本是多少?
【发布时间】:2014-10-15 11:14:14
【问题描述】:

我正在开发一个每隔 10 分钟扫描一些文件夹的 Scala 应用程序。在我的班级中,我创建了 12 个全局变量,这有点奇怪,因为有些变量在异常点上只使用了一次。

我想知道使用费用是多少:

configuration.getString("value")

每次都创建一个全局变量,例如:

私有惰性 val inputPath = configuration.getString("main.directory")

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

提前致谢。

【问题讨论】:

    标签: performance scala playframework


    【解决方案1】:

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

    我所指的实现可以在sources of typesafe/config on GitHub 中找到。第 30 行是存储值的映射。


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

    getString 有副作用,即当配置值不存在时它可能会引发异常 - 例如,您的配置文件可能已损坏。由于通常没有针对此类异常的恢复策略,因此最好在启动时出现这些潜在故障,而不是在没有人再看的情况下进入程序几十分钟。

    在您的问题中,您使用了lazy val 作为替代方案,这将面临同样的问题,因为它只会在需要时进行评估。所以我认为你应该在程序开始时将所有配置值读入vals!

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

    如果您使用后备值并且 100% 肯定不会有例外,这当然不适用。

    【讨论】:

    • "应该没问题,尤其是当您每 10 分钟只调用几次 getString 时。"我会说“这应该没问题,尤其是因为您正在 执行 I/O 以扫描目录。”
    • 是的,我只获取目录路径并替换一部分找到客户端目录..这是一个简单的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多