- Chỉ nên tập trung tối ưu các thao tác có số lượng chu kỳ xử lý lớn.
- Hầu hết các hàm trong thư viện đồ họa cấp thấp ví dụ như các hàm vẽđối tượng đồ họa cơ sở (đường thẳng, hình chữ nhật, cung, ellipse…), các hàm tô màu
đều sử dụng rất nhiều chu kỳ máy, vì vậy, cần hạn chế số lần gọi các hàm này. - Sử dụng hàm setClip(…) để hạn chế vùng cần vẽ.
- Đem các tính toán ra bên ngoài vòng lặp nếu có thể.
- Nếu không làm ảnh hưởng đến thiết kế chương trình, cài đặt các phương thức dạng static final sẽ giúp phương thức được thực hiện nhanh hơn. Tránh sử
dụng phương thức synchronized, phương thức này chậm do phải lock những đối tượng cần thiết. Dạng phương thức Tốc độ synchronized chậm nhất interface chậm instance final nhanh static nhanh nhất
- Việc khởi tạo một đối tượng inner class mất gấp đôi thời gian so với việc khởi tạo một đối tượng của lớp thường.
- Đối với các hàm thường xuyên được sử dụng, cài đặt sao cho việc truyền tham số cho hàm càng ít càng tốt.
- Hạn chế việc tách một hàm lớn thành nhiều hàm nhỏ vì khi chia thành nhiều hàm nhỏ sẽ khiến cho lớp tăng kích thước, đồng thời sẽ phải mất thời gian cho việc truyền tham số giữa các hàm mặc dù cách làm này giúp chúng ta dễ dàng hơn trong công tác bảo trì.
- CPU của máy tính cũng như của các thiết bị di động thực hiện việc so sánh một số với số 0 nhanh hơn so với các số khác 0. Trong các vòng lặp nên tận dụng
điều này bằng các đếm ngược các biến đếm. Thông thường, chúng ta cài đặt vòng lặp như sau :
for (int i=0; i<n; i++) {
……. }
Nhưng, sẽ nhanh hơn nếu chúng ta cài đặt ngược lại :
for (int i=n; --i>=0; ) {
……. }
- Các phép toán trên bit có tốc độ rất cao, vì vậy, nên sử dụng các phép toán dịch bit (shift left, shift right) thay cho phép toán nhân, chia với các số là lũy thừa của 2.
- Trong ngôn ngữ Java, việc truy xuất một phần tử của mảng chậm hơn rất nhiều so với ngôn ngữ C. Mỗi khi chúng ta truy xuất một phần tử, Java đều kiểm tra chỉ sốđưa vào có hợp lệ hay không. Nếu chỉ số này nhỏ hơn 0 hoặc lớn hơn chỉ số
Như vậy, một phần tử trong mảng nếu được truy xuất nhiều lần thì chúng ta nên gán giá trị của phần tửđó vào một biến trung gian để sử dụng cho những lần tiếp theo.
- Khi cần sao chép mảng, nên sử dụng hàm sao chép do J2ME cung cấp sẵn sẽ
nhanh hơn rất nhiều so với việc sử dụng vòng lặp. Cú pháp như sau : System.arraycopy(Object, int, Object, int, int)
- Biến cục bộ khai báo trong thân hàm được truy xuất nhanh hơn biến được khai báo ở mức instance. Nếu chúng ta cần thực hiện nhiều phép toán với các biến
được khai báo ở mức instance như ví dụ sau : public class Foo
{
private int[] array; ...
public void foo() {
for (int i=array.length; --i ; ) {
array[i] = i*2; }
} }
Đoạn chương trình như trên khi thực hiện sẽ không nhanh bằng đoạn chương trình sau :
public class Foo {
private int[] array; ...
public void foo() {
int[] myArray = array;
for (int i = myArray .length; --i ; ) {
myArray [i] = i*2; }
} }
- Việc khởi tạo một đối tượng cũng mất nhiều thời gian. Do vậy, nếu có thể được, chúng ta nên tận dụng một đối tượng sẵn có rồi cập nhật lại các giá trị, các thuộc tính của chúng thay vì tạo một đối tượng mới.
- Phép toán chia thực hiện chậm hơn so với phép toán nhân, vì thế, nếu cần phải chia nhiều lần cho cùng một số, chúng ta có thể tính nghịch đảo của số chia rồi dùng kết quả tìm được nhân với số bị chia.
- Những đoạn chương trình có khai báo try/catch để xử lý các Exception cũng có tốc độ rất chậm. Do đó, nếu không bị bắt buộc phải khai báo như vậy, chúng ta không nên sử dụng chúng trong chương trình.
5.4. Tối ưu hóa việc sử dụng bộ nhớ :