6

巷では、scala の for ループは while ループよりも遅いということです。

遅い:

for (i <- 0 until 10000) {
  f(i)
}

速い:

var i = 0
while (i < 10000) {
   f(i)
   i += 1
} 

hprof を使用して for ループがコードのボトルネックかどうかを判断するにはどうすればよいですか? を使用してコードをプロファイリングしています-agentlib:hprof=cpu=samplesが、「CPU サンプル」セクションのメソッドは何ですか?

最適化の取り組みをどこに集中すべきか知りたいです。for ループがボトルネックですか?

4

2 に答える 2

3

yourkitvisualvmなどのプロファイリングに特化したツールを使用すると、よりうまくいくと思います。

通常は、CPU サンプルをキャプチャし、ドリルダウンしてどの呼び出しが最も多くの CPU サイクルを消費したかを確認するためのインターフェイスを備えています。

あらゆる種類のボトルネック (CPU 時間の 95% を占めるなど) が発生した場合は、それらのホット スポットのコール スタックにあるメソッド (またはライブラリ) を確認するまで掘り下げることができます。次に、for ループが含まれているかどうかを確認できます。

于 2011-10-17T00:02:36.097 に答える
2

各ループを独自のメソッドに入れ、メソッドにかかった時間を比較します。そして、実際に時間がかかるのに十分な反復を使用します(またはそれらを別のループにラップします)。10000 回の反復にはマイクロ秒かかります。プロファイラーが測定するのは困難です。10 億 (または 10,000 回の反復の 100,000 回の反復) を試してください。

また、f(i)コストが高い場合は、ループよりもはるかに時間がかかります。また、f(i)実際に何もしない場合は、完全に最適化されてしまう可能性があります。したがって、それが行われることを確認してください (たとえば、どこかでカウンターを更新する、合計を計算するなど)。

于 2011-10-17T02:07:12.173 に答える