0

Groovy言語のトレーニング資料をいくつか書いていて、クロージャを説明する例を準備しています。この例は、「高価な」メソッドの単純なキャッシュクロージャです。withCache

def expensiveMethod( Long a ) {
    withCache (a) {
        sleep(rnd())
        a*5
    }
}

それで、今私の質問は、次の2つの実装のどちらが、Groovyで最も速く、より慣用的なものになるでしょうか?

 def withCache = {key, Closure operation ->

    if (!cacheMap.containsKey(key)) {
        cacheMap.put(key, operation())
    }
    cacheMap.get(key)
 }

また

def withCache = {key, Closure operation ->
    def cached = cacheMap.get(key)
    if (cached) return cached
    def res = operation()
    cacheMap.put(key, res)
    res
}

最初の例は変数を使用しないため、私は好みますが、のgetメソッドへのアクセスはMap、計算結果を含む変数を返すよりも遅いのではないかと思います。

答えは「大きさにもよるMap」ですが、好奇心からコミュニティの意見を伺いたいと思います。

ありがとう!

4

1 に答える 1

1

まず、OverZealousに同意します。つまり、2つのget操作について心配するのは時期尚早の最適化です。2番目の例も最初の例と同じではありません。1つ目はたとえばnullを許可し、2つ目はifでGroovy-Truthを使用します。これは、たとえば空のリスト/配列/マップと同様に、nullがfalseに評価されることを意味します。したがって、Closureの呼び出しを表示したい場合は、最初のものを使用します。もっと慣用的なものが必要な場合は、代わりに次のようにします。

def expensiveMethod( Long a ) {
    sleep(rnd())
    a*5
}
def cache = [:].withDefault this.&expensiveMethod
于 2013-02-11T09:40:04.837 に答える