gpt4 book ai didi

java - 为什么我的 Scala 命令式 map 创建片段比 Java 慢?

转载 作者:行者123 更新时间:2023-11-30 07:56:41 26 4
gpt4 key购买 nike

我是 Scala 的新手,我正在尝试从 IndexedSeq 创建一个大 map ,我在 SO 上发现了一个提及,即函数式 map 创建比命令式 Java map 创建慢得多,我决定自己测试一下。到目前为止,我发现不仅 Scala 函数式代码速度较慢,而且命令式代码也很慢。我做错了什么,为什么我的 Scala 代码慢了好几倍?在我的家用电脑上,它运行 220 毫秒(Java)和 460 毫秒(Scala)

斯卡拉 version

  private val testSize: Int = 1000000

val seq: IndexedSeq[Int] = for (i <- 0 until testSize) yield Random.nextInt()

val warmupMapt0 = System.nanoTime()

var warmupMap: mutable.HashMap[Int, Int] = new mutable.HashMap[Int, Int]
warmupMap.sizeHint(testSize)
for (i <- 0 until testSize) warmupMap.put(i, seq(i))

val t0 = System.nanoTime()
var map: mutable.HashMap[Int, Int] = new mutable.HashMap[Int, Int]
map.sizeHint(testSize)
for (i <- 0 until testSize) map.put(i, seq(i))
println((System.nanoTime() - t0)/ 1000000 + " ms.")

Java version

private static final int TEST_SIZE = 1_000_000;

public static void main(String[] args) {

int[] ar = new int[TEST_SIZE];
Random random = new Random();
for (int i = 0; i < TEST_SIZE; i++) {
ar[i] = random.nextInt();
}

Map<Integer, Integer> warmupMap = new HashMap<>(TEST_SIZE);
for (int i = 0; i < TEST_SIZE; i++) {
warmupMap.put(i, ar[i]);
}

Map<Integer, Integer> map = new HashMap<>(TEST_SIZE);
long t0 = System.nanoTime();
for (int i = 0; i < TEST_SIZE; i++) {
map.put(i, ar[i]);
}
System.out.println((System.nanoTime() - t0) / 1_000_000 + " ms.");
}

最佳答案

我认为问题的根源之一是 IndexedSeq 的使用。它默认由 Vector 实现,它通常是一个智能集合,但在您的情况下,它为创建数字“数组”而不是通过索引访问它们添加了相当大的常数因子。如果您希望您的代码更等同于 java 对应代码,那么以下代码就是答案:

val ar = new Array(TestSize)
for (i <- 0 until TestSize) ar(i) = Random.next()

我在某处读到有关 foreach 循环优化的信息,找不到哪里,基本上只要足够的预热运行,foreach 循环的效率应该与 while 循环相似,给定传递给它的函数可以内联。

编辑

代码可以进一步简化:

val ar = Array.fill(TestSize)(Random.next())

由 Alexey Romanov 在评论中提出。

关于java - 为什么我的 Scala 命令式 map 创建片段比 Java 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com