数组 – 为什么Array.slice如此(令人震惊!)慢?
发布时间:2020-12-16 09:43:37 所属栏目:安全 来源:网络整理
导读:这是我的基准代码: def bm(duration: Long)(f: = Unit)={ val end = System.currentTimeMillis + duration var count = 0 while(System.currentTimeMillis end) { f; count += 1 } count}val array = new scala.util.Random().alphanumeric.take(1000).toAr
这是我的基准代码:
def bm(duration: Long)(f: => Unit)={ val end = System.currentTimeMillis + duration var count = 0 while(System.currentTimeMillis < end) { f; count += 1 } count } val array = new scala.util.Random().alphanumeric.take(1000).toArray (1 to 20).map { _ => bm(1000) { array.slice(100,200) } }.sum / 20 运行这几次,我一直得到每秒大约150万片的球场数量。 1.4和1.6之间。 现在,我这样做: implicit class FastSlicing(val a: Array[Char]) extends AnyVal { def fastSlice(from: Int,until: Int) = Arrays.copyOfRange(a,from,until) } (1 to 20).map { _ => bm(1000) { array.fastSlice(100,200) } }.sum / 20 我得到的结果是每秒16到1800万片。 现在,我知道所有关于scala为提供功能性成语和类型安全的权衡的常见推理,有时以牺牲性能为代价… .slice只是一个例子,大多数其他数组操作似乎也遭受同样的问题。为什么要这样呢? 现在更新,这里是我觉得更令人震惊的事情: val seq = new scala.util.Random().alphanumeric.take(1000).toIndexedSeq (1 to 20).map { _ => bm(1000) { seq.slice(100,200) } }.sum / 20 这对我来说每秒大约有5-6万片。但是这个: import scala.collections.JavaConversions._ (1 to 20).map { _ => bm(1000) { seq.subList(100,200) } }.sum / 20 确实在12到1500万! 解决方法
已在
scala 2.12修复。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |