- 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ớ :
5.4.1. Công cụ theo dõi việc sử dụng bộ nhớ :
Các chức năng chính :
Bộ công cụ lập trình J2ME của Sun (J2ME Wireless Toolkit) cung cấp cho
chúng ta một tiện ích nhằm theo dõi việc sử dụng bộ nhớ của chương trình, bao gồm các tính năng cơ bản sau :
Theo dõi quá trình cấp phát bộ nhớ khi chương trình gọi thực hiện một phương thức.
Cho biết tổng sốđối tượng được cấp bộ nhớ, lượng bộ nhớđang được sử dụng và dung lượng bộ nhớ còn trống.
Cho biết lượng bộ nhớđược cấp cho từng kiểu dữ liệu.
Hỗ trợ theo dõi việc thu hồi bộ nhớ từ các đối tượng không còn được sử dụng (garbage collector).
...
Sử dụng công cụ theo dõi việc sử dụng bộ nhớ :
Từ menu Edit Æ Preferences, chọn bảng Monitor, sau đó, đánh dấu chọn vào ô “Enable Memory Monitor” trong khung “Memory Monitor”.
Khi ứng dụng được gọi thực thi, màn hình “Memory Monitor Extension”
Hình 5-4 : Màn hình giao diện công cụ theo dõi việc sử dụng bộ nhớ
5.4.2. Các nguyên tắc tối ưu hóa việc sử dụng bộ nhớ :
- Sử dụng càng ít đối tượng càng tốt và chỉ cấp phát bộ nhớ khi cần thiết.
- Đối với các đối tượng không còn cần được sử dụng nữa, nên gán cho chúng giá trị null để giúp garbage collector nhận diện được vùng nhớ không còn được sử
dụng nữa để thu hồi.
- Bộ nhớ của các thiết bị di động rất hạn chế, do vậy, trong thiết kế chương trình, chúng ta nên tránh việc xây dựng các hàm có nhu cầu được cấp phát khối lượng bộ nhớ lớn.
- Trong J2ME, việc thu hồi bộ nhớ không còn được sử dụng được thực hiện thông qua garbage collector. Tuy nhiên, khi nào việc thu dọn này được thực hiện là do người lập trình tự quyết định. Mặt khác, việc thực thi hàm thu hồi bộ nhớ
giải phóng bộ nhớ nếu không cần sử dụng nữa và chỉ nên gọi chức năng thu hồi bộ
nhớ khi cần thiết.
- Trong ngôn ngữ Java, chúng ta có thể nối nhiều chuỗi ký tự chỉ đơn giản bằng cách thực hiện toán tử “+” như ví dụ sau :
public String indent (String line, int spaces) {
String strOut = “”;
for (int i=0;i<spaces;i++) { strOut += “ ”; } return strOut; }
Tuy nhiên, xét về hiệu suất hoạt động, cách làm như vậy sẽ không tốt bởi vì mỗi khi thực hiện việc nối 2 chuỗi ký tự (kiểu String), Java sẽ tạo một đối tượng kiểu StringBuffer, sau đó gọi thực hiện phương thức append của đối tượng này 2 lần để nối 2 chuỗi ký tự lại và cuối cùng, thực hiện phương thức toString() để tạo
đối tượng kiểu String rồi trả về kết quả. Nếu việc nối chuỗi được thực hiện nhiều lần, đặc biệt là trong một vòng lặp sẽ dẫn đến việc tạo rất nhiều đối tượng kiểu String và StringBuffer. Kết quả là khiến cho chương trình sử dụng và tạo nhiều rác trong bộ nhớ, mặt khác sẽ làm tăng thời gian xử lý của chương trình do phải mất nhiều thời gian khởi tạo các đối tượng. Cải tiến đoạn chương trình trên như sau :
public String indent (String line, int spaces) {
StringBuffer out = new StringBuffer(); for (int i=0;i<spaces;i++)
{
out.append(‘ ’); }
return out.toString(); }
Chương 6 : THỬ NGHIỆM – HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG
6.1. Cách cài đặt chương trình trên máy ảo :
Quá trình thử nghiệm được thực hiện trên 4 loại máy ảo : máy ảo chuẩn của
Sun, máy ảo Nokia, Sony Ericsson, Samsung và Siemens (xem giới thiệu về các
máy ảo này trong phần phụ lục B).
6.1.1. Trình giả lập Sony Ericsson :
Phiên bản mới nhất được hãng Sony Ericsson cung cấp miễn phí hiện nay là
bản 2.2.0. Tập tin cài đặt semc_j2me_sdk_2_2_0.exe có dung lượng là 53,4 MB.
Việc cài đặt được tiến hành như các chương trình bình thường. Sau khi cài đặt xong, gọi thực thi chương trình như sau :
Start Menu\Sony Ericsson\WTK2\Run MIDP Application
Trên hộp thoại hiện ra, chọn đường dẫn đến tập tin HoChiMinhCity_Map.jad
Hình 6-1 : Thử nghiệm ứng dụng trên trình giả lập Sony Ericsson
Hình 6-2 : Màn hình giao diện trình giả lập Sony Ericsson
6.1.2. Trình giả lập Nokia :
Bộ công cụ phát triển ứng dụng cho Nokia mới nhất hiện nay có tên là Nokia Developer’s Suite for Java™ 2 Platform, Micro Edition, Version 2.2 for Windows. Tập tin cài đặt có kích thước 49 MB, việc cài đặt cũng tương tự như các chương trình bình thường.
Sau khi cài đặt, thực thi bằng cách chọn trên Start Menu, mục Nokia
Hình 6-3 : Thử nghiệm ứng dụng trên trình giả lập Nokia
Chọn tab Start Emulators, sau đó chọn đường dẫn đến tập tin
HoChiMinhCity_Map.jad, chọn loại điện thoại cần giả lập, sau đó nhấn Emulate. Kết quả như sau :
Hình 6-4 : Kết quả thử nghiệm trên trình giả lập Nokia
6.1.3. Trình giả lập Siemens :
Để phát triển và thử nghiệm ứng dụng cho điện thoại di động Siemens, chúng ta phải cài đặt 2 modules : Siemens Mobility Toolkit (phiên bản mới nhất là 3.0) và ít nhất là 1 điện thoại ảo. Hiện nay Siemens cho phép download miễn phí 4 máy ảo là SL 65, SK 65, CX 65.
Sau khi cài đặt bộ công cụ và trình giả lập vào máy tính, chúng ta có 2 cách
để chạy thử nghiệm chương trình. Dưới đây mô tả việc cài đặt trên điện thoại Siemens SK 65 :
Cách 1 :
Bước 1 :
Các ứng dụng cũng như các tập tin tài nguyên (skin, theme, hình ảnh, âm thanh) được chứa trong thư mục “filesystem\0\” của mỗi trình giả lập. Chúng ta tạo trong thư mục này một thư mục con chứa 2 tập tin HoChiMinhCity_Map.jad, HoChiMinhCity_Map.jar (tên thư mục không yêu cầu trùng với tên ứng dụng). Ví dụ : c:\Siemens\SMTK_3.X\emulators\SK65\Filesystem\0\HCMCMM\HoChiMinh City_Map.jad c:\Siemens\SMTK_3.X\emulators\SK65\Filesystem\0\HCMCMM\HoChiMinh City_Map.jar Bước 2 :
Gọi trình giả lập từ bằng cách chọn Start Menu Æ Siemens Mobility Toolkit
3.00 Æ SMTK 3.0 Emulator Launcher
Chọn trình giả lập Siemens SK65
Bước 3 :
Chọn mục Extras trong menu chính, sau đó chọn File system. Chọn thư mục vừa tạo.
Hình 6-5 : Cài đặt ứng dụng trên điện thoại Siemens SK 65
Trong thư mục được chọn sẽ xuất hiện 2 tập tin JAR và JAD của chương trình. Chọn tập tin có kích thước nhỏ hơn (file JAD). Chương trình sẽ yêu cầu chúng ta chọn vị trí để đặt ứng dụng. Có 2 thư mục có thể chuyển đến, đó là Games và Applications. Chúng ta chọn Applications.
Hình 6-6 : Khởi động ứng dụng trên Siemens SK 65
Bước 4 :
Chương trình đã được cài đặt vào mục Applications của máy. Kết quả thực hiện tương tự như sau :
Cách 2 : Sử dụng dòng lệnh :
Chạy ứng dụng trên trình giả lập bằng dòng lệnh rất đơn giải chỉ bằng cách thực hiện dòng lệnh sau trong Command Prompt :
C:\siemens\SMTK_3.X\bin\emulator.exe -Xdevice:SK65 -Xdescriptor:"C:\ HCMCMM\HoChiMinhCity_Map.jad"
6.1.4. Trình giả lập Samsung :
Cài đặt bộ Samsung Wireless Toolkit vào máy tính bằng tập tin
Samsung_wtk_2-0-0.exe. Việc cài đặt tương tự như các ứng dụng khác. Sau khi cài
đặt xong, thực thi chương trình bằng cách chọn Start Menu Æ Samsung Æ Run MIDP Application.
Trong hộp thoại hiện ra, chọn đường dẫn đến file JAD, kết quả thực hiện tương tự như sau :
Hình 6-8 : Kết quả thử nghiệm trên trình giả lập Samsung
6.1.5. Trình giả lập chuẩn (Sun Microsystems) :
Cách cài đặt và sử dụng trình giả lập này tương tự như đối với trình giả lập Samsung.
C:\j2mewtk2.0\bin\emulator.exe -Xdevice:UnicodeColorPhone -Xdescriptor:"C:\ HoChiMinhCity_Map\HoChiMinhCity_Map.jad"
Hình 6-9 : Kết quả thử nghiệm trên J2ME SDK Lưu ý :
Xin xem phần tiếp theo để cấu hình cho trình giả lập hiển thị được font chữ
6.2. Vấn đề hỗ trợ tiếng Việt có dấu :
6.2.1. Hiển thị tiếng Việt trên máy ảo :
Đa số các trình giả lập điện thoại di động hiện nay không hỗ trợ hiển thị
tiếng Việt có dấu (bảng mã Unicode). Cụ thể, trong các trình giả lập được đề tài thử
nghiệm như trên, chỉ có trình giả lập của hãng Siemens là hiển thị tốt Unicode còn các trình giả lập khác (Nokia, Sony Ericsson, Samsung) không hỗ trợ.
Đối với trình giả lập chuẩn của Sun Microsystems (Sun Wireless Toolkit), các điện thoại ảo được cung cấp mặc định không hỗ trợ Unicode. Tuy nhiên, chúng ta có thể cấu hình để tạo một điện thoại ảo khác hiển thị đúng font chữ tiếng Việt nhằm sử dụng cho quá trình phát triển ứng dụng bằng cách sau :
1. Vào thư mục cài đặt bộ công cụ, di chuyển đến thư mục j2mewtk2.0\ wtklib \devices\
2. Chép thư mục DefaultColorPhone và đổi tên thành UnicodeColorPhone.
3. Trong thư mục UnicodeColorPhone vừa tạo, đổi tên tập tin
DefaultColorPhone.properties thành UnicodeColorPhone.properties. 4. Dùng trình soạn thảo văn bản (Notepad) mở tập tin
UnicodeColorPhone.properties, thay thế từ “SansSerif” thành “Arial” trong
tất cả các dòng định nghĩa font chữ.
6.2.2. Hiển thị tiếng Việt trên thiết bị thật :
Việc có hiển thị được tiếng Việt trên điện thoại di động hay không là do nhà sản xuất quyết định. May mắn là đa số các điện thoại di động trên thị trường Việt Nam hiện nay đều hiển thị tốt tiếng Việt Unicode (mặc dù trên thiết bị giả lập không hiển thịđúng).
Tuy nhiên, riêng đối với các điện thoại Nokia series 60 sử dụng hệđiều hành Symbian thì chúng ta phải tự cài đặt font tiếng Việt cho thiết bị này. Việc cài đặt cũng khá đơn giản qua 2 bước sau :
1. Chép tập tin “tahoma.gdr” vào thư mục “C:\Systems\Font” 2. Khởi động lại máy.
6.3 Hướng dẫn sử dụng chương trình :
6.3.1. Chức năng duyệt bản đồ
Di chuyển bản đồ :
Để di chuyển bản đồ, chúng ta sử dụng các phím theo sơđồ sau :
Ù
Hình 6-10 : Các phím di chuyển bản đồ
Phím 1 : di chuyển bản đồ lên góc trên bên trái
Phím 2 : di chuyển bản đồ lên trên
Phím 3 : di chuyển bản đồ lên góc trên bên phải
Phím 4 : di chuyển bản đồ sang trái
Phím 6 : di chuyển bản đồ sang phải
Phím 7 : di chuyển bản đồ xuống góc dưới bên trái
Phím 8 : di chuyển bản đồ xuống dưới
Phím 9 : di chuyển bản đồ xuống góc dưới bên phải
Phóng to – thu nhỏ bản đồ :
Phím * : phóng to
Phím # : thu nhỏ
6.3.2. Chức năng tra cứu địa điểm, tên đường :
Tra cứu các địa danh – địa điểm :
Để tra cứu các địa danh, địa điểm, chúng ta thực hiện theo các bước sau :
Bước 1 :
Bước 2 :
Chọn loại địa điểm cần tìm, ví dụ : chợ, bệnh viện, trường học v.v…
Bước 3 :
Trên màn hình sẽ xuất hiện một danh sách tên các địa điểm. Ở bước này, chúng ta có thể dùng các phím mũi tên để chọn tên địa điểm cần đến. Để nhanh hơn, có thể nhập tên địa điểm cần tìm trong hộp nhập “Tên
địa điểm”, khi đó, trong danh sách sẽ chỉ hiển thị những địa
điểm nào có tên gần giống với chuỗi ký tự vừa được nhập vào.
Lưu ý : chuỗi ký tự được nhập vào là chuỗi tiếng Việt không dấu và không phân biệt chữ hoa hay chữ thường.
Bước 4 :
Sau khi tìm thấy tên địa điểm cần đến, nhấn phím chọn, màn hình sẽ
Hình 6-11 : Kết quả tìm địa điểm
Tra cứu tên đường :
Việc tra cứu tên đường được thực hiện theo các bước sau :
Bước 1 :
Chọn chức năng tra cứu tên đường (menu “Tìm tên đường”)
Bước 2 :
Trên màn hình chính sẽ xuất hiện danh sách tất cả các tên đường. Nhập tên đường (hoặc một phần tên đường) cần tìm vào trong textbox “Tên