Một số kĩ thuật tối ưu hoá mã nguồn Java - Phần 1
11:23
Trong Java việc tối ưu hoá mã nguồn Java là công việc rất quan trọng, nó không chỉ giúp mã nguồn thông thoáng hơn, giúp tiêu tốn ít tài nguyên hệ thống hơn, mà các kĩ thuật được trình bày dưới đây sẽ giúp nâng cao hiệu suất (performance) làm việc của Java khi chạy chương trình!
Một LTV Java có kinh nghiệm luôn coi việc tối ưu hoá mã nguồn như là 1 phần quan trọng của công việc lập trình, trang bị những kĩ thuật, thủ thuật tối ưu sẽ thể hiện một LTV có trình độ, và coi nó như 1 kĩ năng không thể thiếu khi làm việc với Java.
Các kĩ thuật dưới đây không phải là những giải thuật toán học cao siêu, cũng không phải triển khai 1 cách phức tạp, đôi khi chúng rất dễ để thực hiện nhưng rất nhiều LTV không để ý hoặc chưa biết cách để triển khai nó.
I. Các vòng lặp
1. Tránh việc gọi phương thức trong vòng lặp
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Nếu có thể hãy tránh sử dụng cuộc gọi tới các phương thức như length(), size() ... trong vòng lặp, nó sẽ giúp cải thiện hiệu suất
- Lý do: Việc sử dụng các phương thức trên trong vòng lặp sẽ gây ra rất nhiều cuộc gọi giống nhau và không cần thiết làm tăng xử lý cho chương trình
Ví dụ:
Java
Nên được viết thành:
Java
2. Đưa các tính tóan bất biến ra ngoài vòng lặp
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Các mã nguồn luôn cho ra một kết quả giống nhau qua từng lần lặp nên được di chuyển ra ngoài vòng lặp
- Lý do: Các tính tóan cho ra kết quả giống nhau, bất biến là không cần thiết phải gọi lại nhiều lần gây ra sự chậm trễ cho chương trình
Ví dụ 1:
Java
Nên được viết thành:
Java
Ví dụ 2:
Java
Nên viết thành:
Java
Tham khảo:
- Java Performance Tunning by Jack Shirazi
- The Art of Java Performance Tuning by Ed Merks (Page 20)
3. Tránh nối chuỗi (String) trong vòng lặp
- Mức độ nghiêm trọng: Rất nghiêm trọng
- Nguyên tắc: Sử dụng StringBuffer hoặc StringBuilder thay vì sử dụng nối chuỗi String trong vòng lặp
- Lý do: String là 1 đối tượng bất biến, mỗi khi nối chuỗi gây ra tạo mới đối tượng String, số lần lặp càng lớn càng gây chậm trễ chương trình, tốn tài nguyên xử lý
Ví dụ:
Java
Nên được viết thành:
Java
4. Sử dụng biến tạm thay cho truy cập giá trị của phần tử trong mảng
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Sử dụng biến tạm để lưu trữ dữ liệu và tính toán thay vì truy cập tới giá trị của phần tử trong mảng
- Lý do: Việc truy cập tới 1 phần tử trong mảng luôn làm tốn chi phí hơn là truy cập tới 1 biến tạm bởi vì máy ảo Java (VM) phải kiểm tra các ràng buộc truy cập tới phần tử đó cũng như phải kiểm tra độ dài của mảng
Ví dụ:
Java
Nên viết thành:
Java
Tham khảo:
- Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - Page: 194)
5. Sử dụng Int
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Sử dụng kiểu dữ liệu int cho các chỉ số thay vì sử dụng các kiểu dữ liệu khác
- Lý do: Sử dụng kiểu dữ liệu Int cho các chỉ số là nhanh nhất so với việc sử dụng bất kì kiểu dữ liệu nào khác. VM được tối ưu để sử dụng kiểu Int.
Ví dụ:
Sử dụng int :
Java
là nhanh hơn so với sử dụng bất kì kiểu dữ liệu nào khác
Java
Tham khảo:
- Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - 7.1.4)
6. Đặt Try Catch ra ngoài vòng lặp
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Đặt các khối Try/Catch/Finally bên trong vòng lặp có thể làm chậm quá trình thực thi của chương trình
Ví dụ:
Java
Nên viết thành:
Java
II/ Làm việc với chuỗi
1. Sử dụng String.length() để kiểm tra chuỗi rỗng (empty)
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Sử dụng String.length() để kiểm tra chuỗi rỗng thay vì sử dụng String.equal()
- Lý do: Phương thức String.equals () là quá mức cần thiết để kiểm tra một chuỗi rỗng. Kiểm tra độ dài của chuỗi là 0 sử dụng String.length() sẽ nhanh hơn.
Ví dụ:
Java
Nên viết thành:
Java
Tham khảo:
- http://www.onjava.com/pub/a/onjava/2002/03/20/optimization.html?page=4
- http://www.javaperformancetuning.com/tips/rawtips.shtml
2. Sử dụng StringBuffer hoặc StringBuilder (Tham khảo 3. Tránh nối chuỗi (String) trong vòng lặp)
3. Sử dụng equalsIgnoreCase
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Sử dụng phương thức equalsIgnoreCase() để so sánh chuỗi mà không phân biệt hoa thường
Ví dụ:
Java
Nên được viết thành:
Java
4. Tránh sử dụng startsWith()
- Mức độ nghiêm trọng: Rất Cao
- Nguyên tắc: Tránh gọi String.startsWith () vì lý do hiệu suất
- Lý do: Trong native mã nguồn Java String.startsWith () xử lý khá nhiều thứ truớc khi cho ra kết quả, vì vậy giới hạn vùng kiểm tra bằng cách kiểm tra ký tự ở vị trí đầu tiên
Ví dụ:
Java
Nên được viết thành
Java
III/ Các trường hợp khác
1. Sử dụng System.arraycopy()
- Nguyên tắc: Sử dụng System.arraycopy() cho việc sao chép mảng
- Lý do: Sử dụng System.arraycopy() là nhanh hơn so với việc sử dụng vòng lặp để sao chép 1 mảng
Ví dụ:
Java
Nên viết thành:
Java
Tham khảo: http://www.cs.cmu.edu/~jch/java/speed.html
2. Tránh lặp lại việc Casting (ép kiểu)
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Chỉ ép kiểu 1 lần sau đó giữ tham chiếu của nó
- Lý do: Việc lặp đi lặp lại nhiều lần việc ép kiểu khiến việc xử lý chậm trễ hơn
Ví dụ:
Java
Nên viết thành:
Java
Tham khảo: Java Performance tunning by Jack Shirazi
3. Hủy các cấu trúc if else không cần thiết
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Đơn giản hóa để nâng cao hiệu quả của mã và giảm kích thước của nó.
Ví dụ:
Java
Nên viết thành:
Java
4. Luôn sử dụng static với hằng số
- Mức độ nghiêm trọng: Bình thường
- Nguyên tắc: Nên khai báo static với các biến là hằng số
Ví dụ:
Java
Nên viết thành:
Java
5. Tránh check null truớc khi sử dụng so sánh InstanceOf
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Không nên check NULL truớc khi so sánh InstanceOf
- Lý do: Không cần thiết phải check NULL trong truờwng hợp này, InstanceOf chỉ được so sánh khi đối tượng != NULL, nên việc so sánh là không cần thiết
Ví dụ:
Java
Nên viết thành:
Java
6. Sử dụng mảng dữ liệu nguyên thủy
- Mức độ nghiêm trọng: Trung Bình
- Nguyên tắc: Sử dụng mảng dữ liệu nguyên thủy thay vì sử dụng Collection
- Lý do: Collection có thể chứa trong nó nhiều kiểu dữ liệu (kiểu object, nguyên thủy ...), vì vậy sử dụng mảng nguyên thủy giúp nâng cao hiệu suất chương trình
Ví dụ:
Java
Nên viết thành:
Java
7. Tránh show Debug code
- Mức độ nghiêm trọng: Thấp
- Nguyên tắc: Nên check Debug truớc khi show Log
- Lý do: Việc Debugger vốn bản chất chỉ dành cho nhà phát triển, vì vậy hãy loại bỏ hoặc kiểm tra chúng truớc khi thực thi
Ví dụ:
Java
Nên viết thành:
Java
8. Tránh việc sử dụng Thread.sleep()
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Không nên sử dụng Thread.sleep vì lý do hiệu suất
Ví dụ:
Java
Nên viết thành:
Java
8. Tránh sử dụng String.charAt()
- Mức độ nghiêm trọng: Cao
- Nguyên tắc: Sử dụng mảng char[] thay vì sử dụng String.charAt();
Ví dụ:
Java
Nên viết thành:
Java
Tham khảo:
- ftp://ftp.glenmccl.com/pub/free/jperf.pdf
- http://www.javaperformancetuning.com/tips/rawtips.shtml
Trong bài này có sử dụng tài liệu tham khảo:
- http://www.appperfect.com/support/java-coding-rules/optimization.html
- http://www.javaperformancetuning.com/tips/rawtips.shtml
- Ebook: Java Performance Tunning by Jack Shirazi
- Ebook: The Art of Java Performance Tuning by Ed Merks
0 nhận xét