This không trùng lặp với câu hỏi của tôi. Tôi đã kiểm tra nó và nó là nhiều hơn về các lớp ẩn danh bên trong.Sự khác biệt trong các buổi biểu diễn lambda?
tôi rất tò mò về các biểu thức Lambda và thử nghiệm như sau:
- Với một mảng của vạn mục, những gì sẽ là nhanh hơn để xóa các chỉ số nhất định: Lamba biểu hiện hoặc cho-loop với nếu kiểm tra bên trong ?
Kết quả đầu tiên là không đáng ngạc nhiên trong thực tế là tôi không biết những gì tôi đã đi để đến với:
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");
Nhưng sau đó, tôi quyết định thay đổi liên tục NUMBER_OF_LIST_INDEXES
đến một triệu và ở đây là kết quả:
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");
để làm cho mọi việc đơn giản hơn để đọc, sau đây là kết quả:
| | 10.000 | 1.000.000 |
| LAMBDA | 250ms | 390ms | 156% evolution
|FORLOOP | 16ms | 32854ms | 205000+% evolution
Tôi có câu hỏi sau:
kỳ diệu là gì đằng sau này? Làm thế nào để chúng tôi đến một sự khác biệt lớn cho mảng và không cho lambda khi các chỉ số để làm việc với là * 100.
Về mặt hiệu suất, làm thế nào để chúng tôi biết khi nào nên sử dụng Lambdas và khi nào phải tuân theo các cách truyền thống để làm việc với dữ liệu?
Đây có phải là hành vi cụ thể của phương pháp
List
không? Có phải biểu thức Lambda khác cũng tạo ra những màn trình diễn ngẫu nhiên như thế này không?
Bạn có thể bị đánh lừa bởi các bất thường vi điểm chuẩn. Đọc này: http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
bạn có thể kiểm tra mã nguồn của ArrayList.removeIf (bộ lọc) – andy
nếu bạn đã không, thiết lập IDE của bạn để hiển thị các nguồn JDK để bạn có thể làm nghiên cứu của riêng bạn. [Eclipse] (http://stackoverflow.com/a/426131/1362755), [Netbeans] (http://stackoverflow.com/a/11071313/1362755) – the8472