0

マップ全体をナビゲートする必要がある場合、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() で結果のタイミングを計り、1 つまたは 2 つの異なるマップを使用して、キャッシュの影響を回避しました...

しかし、意味のある結果を得ることができません...これはkotlinネイティブの完全なプログラムであり、(JVM上のkotlinとは異なり)予想とは逆の動作を示しています.2つの異なるマップとアルゴリズムごとに2つのテストを使用して、キャッシュの利点を除外します。

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