Do điện thoại di động có một số hạn chế: bộ nhớ heap thấp, kích thước file jar có giới hạn, tốc độ xử lý CPU chậm nên việc tối ưu code nhằm tăng tốc quá trình thực thi cho ứng dụng là rất quan trọng.

Sau đây là một số kỹ thuật nhằm tối ưu mã nguồn nhằm giảm kích thước file jar và bộ nhớ sử dụng:

  • Sử dụng các chương trình obfuscator như: Proguard hay Retroguard. Chúng có thể xóa các đoạn code không sử dụng và đặt lại tên các biến, phương thức, lớp một cách ngắn nhất nhằm giảm kích thước file jar.
  • Hạn chế tạo ra các lớp không cần thiết.
  • Tránh tạo ra các đối tượng không cần thiết.
  • Sử dụng lại các đối tượng nếu có thể.
  • Để tiết kiệm bộ nhớ, nên gán các đối tượng không còn sử dụng bằng null.
  • Khi gọi System.gc để gọi Garbage Collection để giải phóng bộ nhớ có thể làm chậm tốc độ thực thi ứng dụng bở nó là một block statement.
  • Sử dụng tối thiểu số lượng image để tiết kiệm không gian bộ nhớ.
  • Tránh việc tạo ra quá nhiều Thread và phải sử dụng lại các đối tượng Thread một cách có hiệu quả.

1.Tránh xa việc tạo ra các đối tượng không cần thiết

Để tránh tạo ra các đối tượng không cần thiết, ta cần định nghĩa các lớp theo cách có thể sử dụng lại các đối tượng của chúng. Tránh tạo ra các loại đối tượng không cho phép sửa đổi nội dung(như String), ép buộc tạo ra các thể hiện đối của đối tượng mới để xử lý các giá trị mới. Mục đích nhằm giảm thiểu cấp phát bộ nhớ bằng cách tái sử dụng các đối tượng đã tạo ra.

Ví dụ:

public class MyObject {

public int plus(int a, int b) {
return a+b;
}

}

//Not reusing objects
int[] values = new int[]{… … ..};
for (int i=0; … …) {
obj = new MyObject();
int value = obj.plus(i, i+1);
System.out.println(value);
}

//Reusing objects
int[] values = new int[]{… … ..};
obj = new MyObject();
int value;
for (int i=0; … …) {
value = obj.plus(i, i+1);
System.out.println(value);
}
2.Cấp phát bộ nhớ khi thật sự cần thiết

Tránh tạo ra đối tượng(hay các biến nguyên thủy) nếu trong quá trình thực hiện không sử dụng chúng.

Ví dụ:

public class MyObject {
    private Image photo;
 
    public Image getPhoto(String file) {
        if(photo == null)
           photo = Image.createImage(file); //Create object only when needed.
 
        return photo;
    }
}

3.Sử dụng mẫu thiết kế Singleton

Các mẫu thiết kế Singleton có thể là một trong những tính năng quan trọng để tối ưu hóa code, tránh tạo ra đối tượng không cần thiết. Lớp mà xử lý các yêu cầu như log message, cấu hình, persistence… rất thích hợp để sử dụng Singleton.

4.Định nghĩa vòng lặp

Cần cẩn thận khi định nghĩa vòng lặp, như for và while.

Ví dụ:

//array.size() will be called in every loop from i=0 to size.
for (int i=0; i<array.size(); i++) {
   ...
}
 
//On the other hand, keep the length of the array object, and use it
int size = array.size();
for (int i=0; i<size; i++) {
   ...
}

Link tham khảo: http://wiki.forum.nokia.com/index.php/Code_Optimization_-_Java_ME