0

当您需要导航整个地图时,我试图了解在 kotlin(和 swift)中导航地图的最佳方式是什么。两种语言都提供了一个 .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 程序,它显示(与 JVM 上的 kotlin 不同)一种与我预期相反的行为,我使用了两个不同的映射和每个算法的两个测试来排除缓存优势。

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")
}
4

0 回答 0