Thisは私の質問と重複していません。私はそれをチェックして、内部の匿名のクラスについてもっと詳しく説明します。ラムダパフォーマンスの違いは?
- が1万エントリの配列を考えると、何が特定のインデックスを削除するには、より速く、次のようになります:
は、私は次のラムダ式について興味があったし、テスト内の場合は、テストとラムダ式またはforループ?
最初の結果は、私は私が思い付くするつもりだったのか分からなかったという事実には驚くべきことではありませんでした:
final int NUMBER_OF_LIST_INDEXES = 10_000;
List<String> myList = new ArrayList<>();
String[] myWords = "Testing Lamba expressions with this String array".split(" ");
for (int i = 0 ; i < NUMBER_OF_LIST_INDEXES ; i++){
myList.add(myWords[i%6]);
}
long time = System.currentTimeMillis();
// BOTH TESTS WERE RUN SEPARATELY OF COURSE
// PUT THE UNUSED ONE IN COMMENTS WHEN THE OTHER WAS WORKING
// 250 milliseconds for the Lambda Expression
myList.removeIf(x -> x.contains("s"));
// 16 milliseconds for the traditional Loop
for (int i = NUMBER_OF_LIST_INDEXES - 1 ; i >= 0 ; i--){
if (myList.get(i).contains("s")) myList.remove(i);
}
System.out.println(System.currentTimeMillis() - time + " milliseconds");
しかし、その後、私は百万に一定のNUMBER_OF_LIST_INDEXES
を変更することを決めたと、ここで結果は次のとおりです。ここでは、読むために物事を簡単にするため
final int NUMBER_OF_LIST_INDEXES = 1_000_000;
List<String> myList = new ArrayList<>();
String[] myWords = "Testing Lamba expressions with this String array".split(" ");
for (int i = 0 ; i < NUMBER_OF_LIST_INDEXES ; i++){
myList.add(myWords[i%6]);
}
long time = System.currentTimeMillis();
// BOTH TESTS WERE RUN SEPARATELY OF COURSE
// PUT THE UNUSED ONE IN COMMENTS WHEN THE OTHER WAS WORKING
// 390 milliseconds for the Lambda Expression
myList.removeIf(x -> x.contains("s"));
// 32854 milliseconds for the traditional Loop
for (int i = NUMBER_OF_LIST_INDEXES - 1 ; i >= 0 ; i--){
if (myList.get(i).contains("s")) myList.remove(i);
}
System.out.println(System.currentTimeMillis() - time + " milliseconds");
結果は以下のとおりです。
| | 10.000 | 1.000.000 |
| LAMBDA | 250ms | 390ms | 156% evolution
|FORLOOP | 16ms | 32854ms | 205000+% evolution
私は、次のような質問があります。この背後にある魔法は何
を?どのようにインデックスを扱うかがラムダではなく、配列の大きな違いになるのはどうでしょうか?パフォーマンスの面で
、どのようにラムダを使用するときに我々は知っていますし、データを操作するための伝統的な方法に固執するとき?
これは
List
方法の具体的な行動ですか?他のラムダ式もこのようなランダムな演奏を生み出していますか?
あなたはおそらくマイクロベンチマーク異常によって誤解されています。これを読んでください:http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
ArrayList.removeIf(filter) – andy
のソースコードを確認することができますif IDEを設定してJDKソースを表示して、独自の調査を行うことができます。 [Eclipse](http://stackoverflow.com/a/426131/1362755)、[Netbeans](http://stackoverflow.com/a/11071313/1362755) – the8472