配列初期化による toArray のパフォーマンスへの影響
myList.toArray(new MyClass[myList.size()]) かどうかの問題myList.toArray(new MyClass[0]) はより優れたパフォーマンスを提供するため、Java 開発者の好奇心を刺激しています。 2 番目のアプローチはより簡潔に見えますが、空の配列が作成時に省略されるという仮定が常に当てはまるとは限りません。
ベンチマーク結果
この問題を明らかにするにはでは、Java HotSpot 8 を使用してマイクロベンチマークが実施されました。以下に示す結果から、直感に反する toArray(new MyClass[0]) メソッドが使用されていることがわかります。 toArray(new MyClass[myList.size()]) の対応物:
Benchmark (n) Mode Samples Score Error Units c.a.p.SO29378922.preSize 1 avgt 30 0.025 ▒ 0.001 us/op c.a.p.SO29378922.preSize 100 avgt 30 0.155 ▒ 0.004 us/op c.a.p.SO29378922.preSize 1000 avgt 30 1.512 ▒ 0.031 us/op c.a.p.SO29378922.preSize 5000 avgt 30 6.884 ▒ 0.130 us/op c.a.p.SO29378922.preSize 10000 avgt 30 13.147 ▒ 0.199 us/op c.a.p.SO29378922.preSize 100000 avgt 30 159.977 ▒ 5.292 us/op c.a.p.SO29378922.resize 1 avgt 30 0.019 ▒ 0.000 us/op c.a.p.SO29378922.resize 100 avgt 30 0.133 ▒ 0.003 us/op c.a.p.SO29378922.resize 1000 avgt 30 1.075 ▒ 0.022 us/op c.a.p.SO29378922.resize 5000 avgt 30 5.318 ▒ 0.121 us/op c.a.p.SO29378922.resize 10000 avgt 30 10.652 ▒ 0.227 us/op c.a.p.SO29378922.resize 100000 avgt 30 139.692 ▒ 8.957 us/op
説明
Java 仮想マシン (JVM) と JIT コンパイラーは一貫して優れています。最適化により、適切なサイズの配列を効率的に作成および初期化できるようになります。これらの最適化は、配列が手動で作成された場合には利用できません。
結論
ブログ投稿 Arrays of Wisdom of Ancients では、myList.toArray(new MyClass[0]) が次のような状況で推奨されるアプローチであることは明らかです。パフォーマンスが懸念されます。空の配列作成のオーバーヘッドは JVM の最適化によって効果的に排除され、パフォーマンスが向上します。
以上が「myList.toArray(new MyClass[myList.size()]) と myList.toArray(new MyClass[0]): どちらが Java でより良いパフォーマンスを提供しますか?」の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。