【问题标题】:Can shared vals become a bottleneck for performance ? - Scala共享 vals 会成为性能瓶颈吗? - 斯卡拉
【发布时间】:2013-09-24 09:32:31
【问题描述】:

我们有一段带有静态字段val format = DateTimeFormatter.forPattern("yyyy-MM-dd")的代码 现在,并发线程将使用这个格式化程序实例来解析和打印日期format.parseDateTime("2013-09-24")format.print(instant)。 我了解到,在 Scala 中,您可以编写代码而无需关心并发性,前提是您只使用不可变字段,但性能如何?如果多个线程使用同一个实例会成为瓶颈吗?
谢谢,

【问题讨论】:

  • 我认为共享这个定义为 val 的文件没有问题。此外,它更喜欢将这样的静态事物放到 scala 对象中。

标签: performance scala concurrency


【解决方案1】:

您的问题与 Java 更相关。如果forPattern 方法的实现是线程安全的,那么您可以在多个线程之间共享它而不会出现任何瓶颈。

检查 javadoc 以查看实现是否是线程安全的。在您的具体情况下,我假设您使用的是 JodaTime 库:

DateTime Javadoc 中提取:

DateTimeFormat 是线程安全且不可变的,它返回的格式化程序也是如此。

有一个反例参见SimpleDateFormatjavadoc:

日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,则必须对外同步。

使用 val 只是意味着变量引用在他声明后不会改变。见What is the difference between a var and val definition in Scala?

【讨论】:

  • 我确实在使用 JodaTime,我忘了指定
  • 您能否在回复中添加关于性能问题的旁注,这是我问题的第二部分?
  • 很难回答性能问题,因为它取决于许多因素。性能是一个广泛的主题。
【解决方案2】:

看来您误解了它:Scala 中的并发与 Java(或任何其他语言)非常相似,并没有什么特别之处。只是它提供了替代库和语法糖,可以用更少的样板来完成它们,更重要的是可以安全地完成它们(例如:akka)。

但其他原则,例如:依赖于内核数量、线程池大小、上下文切换等,都必须得到处理和照顾。

现在的问题是,如果多个线程访问的不可变 val 会降低性能:我认为不应该有任何开销,也没有数据需要支持。但我认为性能可能很好,因为处理器可以缓存它,并且可以在另一个内核中更快地检索相同的对象。

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2015-07-27
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多