簡體   English   中英

是創建一個新的 Map 還是清除它並再次使用更快?

[英]Is it faster to create a new Map or clear it and use again?

我需要在我的項目中使用許多地圖,所以我想知道哪種方式更有效:

val map = mutable.Map[Int, Int] = mutable.Map.empty
for (_ <- 0 until big_number)
  {
    // do something with map
    map.clear()
  }

或者

for (_ <- 0 until big_number)
  {
    val map = mutable.Map[Int, Int] = mutable.Map.empty
    // do something with map
  }

使用時間和memory?

好吧,我的正式回答總是取決於。 因為您需要對自己的方案進行基准測試,並查看更適合您的方案的方案。 我將提供一個示例,您可以如何嘗試對自己的代碼進行基准測試。 讓我們從編寫測量方法開始:

def measure(name: String, f: () => Unit): Unit = {
  val l = System.currentTimeMillis()
  println(name + ": " + (System.currentTimeMillis() - l))
  f()
  println(name + ": " + (System.currentTimeMillis() - l))
}

假設在每次迭代中,我們需要在 map 中插入一個鍵值對,然后打印出來:

Await.result(Future.sequence(Seq(Future {
  measure("inner", () => {
    for (i <- 0 until 10) {
      val map2 = mutable.Map.empty[Int, Int]
      map2(i) = i
      println(map2)
    }
  })
},
Future {
  measure("outer", () => {
    val map1 = mutable.Map.empty[Int, Int]
    for (i <- 0 until 10) {
      map1(i) = i
      println(map1)
      map1.clear()
    }
  })
})), 10.seconds)

在這種情況下,output 在innerouter之間幾乎總是相等的。 請注意,在這種情況下,我並行運行這兩個選項,就好像我不會第一個總是花費更多的時間,無論哪個是第一個。

因此,我們可以得出結論,在這種情況下,它們幾乎相同。

但是,例如,如果我添加一個不可變的選項:

Future {
  measure("immutable", () => {
    for (i <- 0 until 10) {
      val map1 = Map[Int, Int](i -> i)
      println(map1)
    }
  })
}

它總是首先結束。 這是有道理的,因為不可變的 collections 比可變的性能要好得多。

為了獲得更好的性能測試,您可能需要使用一些第三方,例如scalameter或其他存在的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM