XÂY DỰNG BẢN ĐỒ TRÊN ĐIỆN THOẠI DI ĐỘNG CÓ HỖ TRỢ JAVA - 8 docx

17 408 0
XÂY DỰNG BẢN ĐỒ TRÊN ĐIỆN THOẠI DI ĐỘNG CÓ HỖ TRỢ JAVA - 8 docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 103 // Imports import javax.microedition.lcdui.Graphics; public final class g { // Fields private static int[] a; private static short[] b; private static String[] c; private static byte[] d; private static short[] e; private static short[] f; private static short[] g; private static short[] h; private static short[] i; private static short[] j; // Constructors public g() { } // Methods public static final void a() { } public static final void a(Graphics graphics) { } public static final void b(Graphics graphics) { } private static final void c(Graphics graphics) { } } Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 104 Kết quả sau khi sử dụng obfuscator vào chương trình : Ghi chú : kích thước file JAR không tính các tập tin tài nguyên Kích thước file JAR (bytes) Số bytes được rút ngắn (bytes) Tỉ lệ rút ngắn Không tối ưu kích thước 33.213 Sử dụng proguard 3.2 21.255 11.958 36,0 % Sử dụng retroguard 2.0.1 22.632 10.581 31,9 % Bảng 5-1 : Bảng so sánh kết quả sử dụng obfuscator 5.3. Tối ưu hóa về tốc độ : 5.3.1. Khái quát chung : - Khi muốn tối ưu về tốc độ, trước tiên, cần tập trung vào tối ưu việc thiết kế và lựa chọn giải thuật cho hợp lý, sau đó mới thực hiện việc cải thiện tốc độ ở mức cấp thấp trên từng dòng lệnh bởi vì phần lớn thời gian chương trình hoạt động được dùng cho việc thực hiện các hàm xử lý trong thư viện do chúng ta g ọi đến, đặc biệt là đối với các chức năng xử lý đồ họa cấp thấp. - Quy tắc 90/10 : “trong các chương trình có nhu cầu xử lý đồ họa lớn, đặc biệt là các phần mềm trò chơi hành động, 90% tổng thời gian xử lý của chương trình dùng để xử lý 10% mã nguồn”. Như vậy, 90% mã nguồn còn lại chỉ cần 10% thời gian để xử lý. Do đó, chúng ta cần phải tập trung xác định nh ững thao tác xử lý nào tiêu tốn nhiều thời gian xử lý nhất để tìm cách tối ưu hóa chúng. - Hiệu suất thi hành các lệnh không giống nhau trên thiết bị của các nhà sản xuất khác nhau do mỗi hãng sản xuất có công nghệ và cách cài đặt xử lý theo đặc tả MIDP khác nhau. 5.3.2. Tìm các vị trí cần tối ưu về tốc độ :  Sử dụng Profiler Trong bộ công cụ lập trình J2ME của Sun (Sun Wireless Toolkit) có cung cấp cho chúng ta một tiện ích dùng để thống kê tần suất hoạt động và tài nguyên CPU dành cho từng chức năng xử lý (công cụ này được gọi là profiler). Dựa vào Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 105 bảng thống kê này, chúng ta có thể xác định được hàm nào được gọi thực hiện nhiều nhất, chi phí dành cho mỗi lần thực hiện là bao nhiêu và cho con số tổng cộng về tổng số tài nguyên được cung cấp cho mỗi hàm trong toàn bộ thời gian mà chương trình hoạt động. Từ bảng thống kê này, chúng ta có thể xác định được hàm nào sử dụng nhiều tài nguyên nhất để tập trung vào việc tối ưu nó. Để hiển thị profiler, trong màn hình chính của Sun Wireless Toolkit, chọn menu Edit Æ Preferences. Chọn tab Monitor, đánh dấu check vào ô Enable Profiling trong khung Profiler. Sau khi trình giả lập kết thúc việc thực thi ứng dụng, cửa sổ Methods’ Profiler hiện ra như sau : Hình 5-3 : Màn hình giao diện công cụ Profiler  Xác định thời gian thực thi : Profiler giúp chúng ta xác định được số lượng chu kỳ xử lý cần cho mỗi hàm, tuy nhiên lại không giúp chúng ta xác định được thời gian cụ thể cho mỗi hàm xử lý và profiler cũng không được cung cấp trên thiết bị thật. Vì vậy, chúng ta có Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 106 thể xây dựng riêng một đoạn mã nhằm xác định khoảng thời gian dùng cho hàm bằng cách sử dụng giờ hệ thống : long startTime = System.currentTimeMillis(); //Trước khi gọi hàm gọi_hàm(); long timeTaken = System.currentTimeMillis() – startTime; //Khoảng thời gian thực thi 5.3.3. Các nguyên tắc tăng tốc cho chương trình : - 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. Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 107 - Đố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ố của phần tử cuối thì Java sẽ thông báo ngoại lệ ArrayIndexOutOfBoundsException. Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 108 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 : Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 109 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. Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 110 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” xuất hiện cùng với trình giả lập. Màn hình giao diện của công cụ như sau : Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 111 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ớ System.gc() cũng mất nhiều thời gian. Vì vậy, chúng ta cần quản lý bộ nhớ chặ t chẽ, Chương 5 : Một số cải tiến nhằm tối ưu hóa chương trình 112 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 : [...]... chọn loại điện thoại cần giả lập, sau đó nhấn Emulate Kết quả như sau : 116 Chương 6 : Thử nghiệm – Hướng dẫn cài đặt và sử dụng 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... 1 18 Chương 6 : Thử nghiệm – Hướng dẫn cài đặt và sử dụng 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. .. 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 Kết quả thực hiện như sau : 114 Chương 6 : Thử nghiệm – Hướng dẫn cài đặt và sử dụng 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 Developer’ Suite for J2ME Run as a Standalone Hộp thoại sau xuất hiện : 115 Chương 6 : Thử nghiệm – Hướng dẫn cài đặt và sử dụng Hình 6-3 : Thử nghiệm ứng dụng trên trình... 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... 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 : 117 Chương 6 : Thử nghiệm – Hướng dẫn cài đặt và sử dụng 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... ứ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 : Hình 6-7 : Kết quả thử nghiệm trên trình giả lập Siemens 119 . 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ó. 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. 21.255 11.9 58 36,0 % Sử dụng retroguard 2.0.1 22.632 10. 581 31,9 % Bảng 5-1 : Bảng so sánh kết quả sử dụng obfuscator 5.3. Tối ưu hóa về tốc độ : 5.3.1. Khái quát chung : - Khi muốn

Ngày đăng: 30/07/2014, 20:20

Từ khóa liên quan

Mục lục

  • Chương 1 : TỔNG QUAN VỀ LẬP TRÌNH TRÊN ĐIỆN THOẠI DI ĐỘNG

    • 1.1. Đôi nét về thị trường điện thoại di động Việt Nam :

      • 1.1.1. Sự phát triển của thị trường thông tin di động :

      • 1.1.2. Nhu cầu phát triển phần mềm cho điện thoại di động :

      • 1.2. Lập trình trên điện thoại di động :

        • 1.2.1. Quá trình phát triển ứng dụng J2ME :

        • 1.2.2. Các J2ME IDE :

        • 1.3. Giới thiệu một số công cụ hỗ trợ lập trình cho J2ME :

          • 1.3.1. J2ME Wireless Toolkit (WTK) :

          • 1.3.2. Borland Jbuilder :

          • 1.3.3. Sun ONE Studio 5, Mobile Edition

          • Chương 2 : GIỚI THIỆU KHÁI QUÁT VỀ CHUẨN J2ME

            • 2.1. Nền tảng Java :

            • 2.2. Sự khác nhau giữa ngôn ngữ Java trên CLDC với Java thôn

            • 2.3. MIDP :

              • 2.3.1. Định nghĩa :

              • 2.3.2. Yêu cầu về phần cứng :

              • 2.3.3. Các khả năng và hạn chế của MIDP :

              • Chương 3 : NHỮNG KHÓ KHĂN DO HẠN CHẾ CỦA J2ME

                • 3.1. Các hàm tô màu :

                • 3.2. Các hàm vẽ đường :

                • 3.3. Vấn đề font chữ :

                • 3.4. Vấn đề vẽ chuỗi ký tự :

                • 3.5. Vấn đề về số thực :

                • Chương 4 : PHÂN TÍCH – THIẾT KẾ ỨNG DỤNG

                  • 4.1. Khảo sát hiện trạng :

                  • 4.2. Phân tích và xác định yêu cầu :

                    • 4.2.1. Danh sách các yêu cầu nghiệp vụ :

                    • 4.2.2. Các yêu cầu phi chức năng :

Tài liệu cùng người dùng

Tài liệu liên quan