Bàn về performance stream trong java 8

java

(Ngoclong Pham) #1

Lại là tớ đây.
Theo như lý thuyết mình đọc được thì stream trong java 8 giúp tối ưu performance, nhưng khi mình test thử vòng lặp foreach và stream.foreach thì kết quả là vòng loopforeach nhanh gần gấp đôi.
Stream chỉ nhanh hơn khi mình thực hiện 1 số method khác vd: filter, map…Hơi khó hiểu nhỉ, anh em nào có thể chia sẻ được không
EDIT: Mình test thử và thấy với 1 danh sách số lượng element lớn thì stream tối ưu hơn, số lượng nhỏ thì cách truyền thống lại tối ưu hơn


(明玉) #2

Thật ra có lẽ chỉ là do bạn viết code không tốt như các kỹ sư làm JVM mà thôi. Stream tốn phí khởi tạo hệ thống của nó, rồi phí khởi tạo mấy cái lambda, rồi phí gọi hàm liên tục, v.v., không thể nhanh hơn tự viết được.
“Tự viết” ở đây thực ra là bạn đang viết cho trường hợp của bạn, nếu bạn cũng làm một hệ thống tổng quát như stream thì kiểu gì cũng chậm như stream.


(Ngoclong Pham) #3

nhưng vấn đề ở chỗ khi mình tăng số lượng phần tử lên khoảng 500 000 thì stream lại nhanh hơn rất nhiều lần.


(明玉) #4

Đưa code benchmark của bạn lên đây xem nào.


(Ngoclong Pham) #5

Code sai roài. :(:tired_face:
Vậy nếu stream không nhanh hơn so với cách truyền thống thì tại sao lại nên sử dụng nó, và khi nào thì nên sử dụng nhỉ, mình mới chỉ nhận thấy ưu điểm duy nhất là code ngắn gon hơn.:frowning:


(明玉) #6

Đúng rồi đấy, là ngắn gọn hơn, dễ bảo trì hơn, thể hiện “làm cái gì” thay vì “làm như thế nào”.
Bạn để ý mà xem, thiết kế một hệ thống cụ thể cho 1 trường hợp nhất định và thiết kế một hệ thống tổng quát cho tất cả các trường hợp dựa trên cái chung, hiển nhiên hệ thống tổng quát cùng lắm là nhanh bằng với hệ thống cụ thể chứ không có chuyện nhanh hơn.


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?