Kotlin и скорость навигации по полной карте
Я пытаюсь понять, как лучше всего перемещаться по картам в котлине (и быстро), когда вам нужно перемещаться по всей карте. Оба языка предлагают метод.values, который упрощает навигацию, но с фоном C++ я думал, что он не может работать должным образом, поскольку он должен создавать вектор значений с дополнительной навигацией по карте (и соответствующим выделением памяти).
В основном мой вопрос касается этого кода:
val map: MutableMap<Int, String> = mutableMapOf()
for (i in 1.. 1000000) {
map[i] = "Value of this element is $i"
}
for (v in map.values)
if (v[0] != 'V')
Log.e(TAG, "ERROR!")
for ((_, v) in map) // it should be faster!
if (v[0] != 'V')
Log.e(TAG, "ERROR!")
... Я провел несколько тестов этого кода, синхронизируя результаты с помощью System.currentTimeMillis() и используя одну или две разные карты, чтобы избежать эффектов кеширования...
Но я не могу получить значимых результатов... вот полная программа на kotlin native, которая показывает (в отличие от kotlin на JVM) поведение, противоположное тому, которое я ожидал, я использовал две разные карты и два теста на алгоритм, чтобы исключить преимущества кеширования.
import kotlin.system.*
fun main() {
val m1 : MutableMap<Int, String> = mutableMapOf()
val m2 : MutableMap<Int, String> = mutableMapOf()
println("Creating map...")
var st = getTimeMillis()
for (i in 1..2000000) {
m1[i] = "Test $i"
m2[i] = "Test $i"
}
var end = getTimeMillis()
println("Took: ${end - st} msecs, map size: ${m1.size},${m2.size} elements")
st = getTimeMillis()
for ((_, v) in m1)
if (v[0] != 'T')
println("ERROR!");
end = getTimeMillis()
println("Algorithm 1 (k,v): ${end - st} msecs")
st = getTimeMillis()
for (v in m2.values)
if (v[0] != 'T')
println("ERROR!");
end = getTimeMillis()
println("Algorithm 2 (values): ${end - st} msecs")
st = getTimeMillis()
for ((_, v) in m2)
if (v[0] != 'T')
println("ERROR!");
end = getTimeMillis()
println("Algorithm 1bis (k,v): ${end - st} msecs")
st = getTimeMillis()
for (v in m1.values)
if (v[0] != 'T')
println("ERROR!");
end = getTimeMillis()
println("Algorithm 2bis (values): ${end - st} msecs")
}