Thứ Bảy, 26 tháng 12, 2009

Tăng tốc cho chương trình Java

Tăng tốc cho chương trình Java

Để chương trình Java chạy nhanh hơn, bạn có thể dùng các công cụ như DashO Pro, Optimize It (trong JBuilder của Borland) hoặc JProbe,.... Ở đây tôi xin giới thiệu vài cách đơn giản liên quan đến việc viết mã và biên dịch bằng JDK (bộ công cụ lập trình Java):

1. Dùng tham số -O khi biên dịch. Khi chạy trình biên dịch javac, ta chỉ cần bổ sung thêm tham số -O, trình biên dịch sẽ tối ưu hóa mã để tạo ra mã chạy nhanh hơn. Ví dụ thay vì đánh dòng lệnh biên dịch là

C:\MyProg\javac MyProg.java

ta thay bằng dòng lệnh sau

C:\MyProg\javac –O MyProg.java

2. Tránh dùng các biểu thức bất biến trong vòng lặp. Chẳng hạn, bạn xem đoạn mã ngắn sau:

for(int i = 0;i < s.length;i++)

a[i] = s[i] + b * c;

Như bạn thấy, cứ sau mỗi lần lặp, biểu thức b * c được tính lại trong khi nó không thay đổi theo vòng lặp. Để tránh mất thời gian cho tính toán không cần thiết như vậy, bạn sửa lại như sau:

float tmp = b * c;

for(int i = 0;i < s.length;i++)

a[i] = s[i] + tmp;

Nhờ vậy, biểu thức b * c chỉ được tính một lần chứ không phải là s.length lần như trước. Điều này đặc biệt quan trọng đối với những chương trình nặng về tính toán.

3. Loại bỏ những biểu thức con giống nhau trong một khối lệnh. Chẳng hạn, trong đoạn mã như sau:

double d = a * Math.sqrt(r);

double e = b * Math.sqrt(r);

double f = c * Math.sqrt(r);

bạn thấy rõ việc tính căn số Math.sqrt(r) lặp lại nhiều lần. Tính căn số vốn không phải là nhiệm vụ nhẹ nhàng nhưng đôi khi do "tiện tay sao chép", ta vô tình buộc chương trình phải lặp lại việc tính toán không cần thiết, gây tốn thời gian một cách vô ích. Bạn tối ưu hóa đoạn mã trên như sau:

double tmp = Math.sqrt(const);

double d = a * tmp;

double e = b * tmp;

double f = c * tmp;

Nhờ vậy hàm Math.sqrt(r) chỉ được gọi một lần và kết quả được lưu lại trong biến tạm tmp. Các câu lệnh tiếp theo chỉ cần lấy kết quả có sẵn trong biến tmp.

4. Dùng các toán tử gán tối ưu thay cho toán tử gán thông thường. Bạn hãy xem đoạn mã:

for(int i = 0;i < a.length;i++)

a[i] = a[i] + const;

Thay vì dùng toán tử gán thông thường, bạn có thể dùng toán tử gán tối ưu hóa += như sau (tương tự như trong C/C++):

for(int i = 0;i < a.length;i++)

a[i] += const;


Các toán tử gán tối ưu hóa để bạn tham khảo.


Toán tử Mô tả Ví dụ
++ Tăng rồi gán a++

-- Giảm rồi gán a--

+= Cộng rồi gán a+=b

-= Trừ rồi gán a-=b

*= Nhân rồi gán a*=b

/= Chia rồi gán a/=b

%= Lấy phần dư rồi gán a%=b

|= OR rồi gán a|=b

&= AND rồi gán a&=b

^= XOR rồi gán a^=b

<<= Dịch trái rồi gán a<<=b

>>= Dịch phải rồi gán a>>=b

>>>= Dịch phải lấp đầy số 0 rồi gán a>>>=b

5. Hạn chế khởi tạo các đối tượng không thật sự cần thiết. Bạn đừng nghĩ rằng đối tượng chỉ là phận "bọt bèo", "muốn bao nhiêu cũng có". Mỗi đối tượng được tạo ra thông qua hàm dựng đều tiêu tốn một nguồn lực nhất định của hệ thống. Do vậy, ta chỉ nên khởi tạo những đối tượng thật sự cần thiết hoặc dùng chung đối tượng nếu có thể.

Theo Echip

Không có nhận xét nào:

Đăng nhận xét

Người theo dõi

Tìm kiếm Blog này