Giải phỏp tăng tốc độ tớnh toỏn của chương trỡnh

Một phần của tài liệu Nghiên cứu công nghệ thành lập và ứng dụng bản đồ số địa chính trong điều kiện Việt Nam (Trang 98 - 105)

Ngày nay, với khối lượng dữ liệu tớnh toỏn ngày càng lớn trong cỏc bài toỏn xử lý số liệu, cấu hỡnh mỏy tớnh ngày càng mạnh, việc chọn một thuật toỏn và giải phỏp tăng tốc độ tớnh toỏn để giảm thiểu thời gian thực hiện là một cụng việc quan trọng đối với người xõy dựng chương trỡnh ứng dụng. Đõy là một đỏnh giỏ quan trọng ảnh hưởng lớn đến mức độ hài lũng của người sử dụng đối với sản phẩm ứng dụng.

Theo [27], khi bàn về mỗi thuật toỏn, hiệu quả được coi là một thành tố cốt yếu trong việc hoàn tất một tỏc vụ lớn nào đú. Do sự lưu ý kĩ lưỡng, đối với một số thuật toỏn khi đi tỡm một phương phỏp hiệu quả để giải quyết một bài toỏn thường dẫn tới một thuật toỏn hiệu quả hơn. Tuy nhiờn, mục tiờu hẹp này rất khụng thực tế, vỡ cú nhiều yếu tố rất thực khỏc cần được xột đến khi giải một bài toỏn phức tạp. Khụng cú thuật toỏn nào là tốt nhất mà chỉ cú những thuật toỏn phự hợp với những trường hợp thường xảy ra.

Trong những hệ thống lớn thường xảy ra trường hợp là cỏc yờu cầu của thiết kế hệ thống bắt buộc ngay từ đầu là phải cú thuật toỏn tốt nhất. Một cấu trỳc dữ liệu phự hợp của hệ thống sao cho cỏc thuật toỏn dựa trờn cấu trỳc đú được thuận tiện, nhanh hơn. Thường tớnh hiệu quả của toàn hệ thống phụ thuộc vào tớnh hiệu quả của một vài thuật toỏn cơ sở, chẳng hạn thuật toỏn sắp xếp, tỡm kiếm ... Cỏc thuật toỏn nhanh hơn thường phức tạp hơn, người lập chương trỡnh thụng thường chấp nhận một thuật toỏn chậm hơn để trỏnh phải đối phú với những phức tạp thờm vào. Điều này dẫn tới tốn thời gian rất nhiều khi xõy dựng một chương trỡnh với dữ liệu lớn. Tuy nhiờn, với những trường hợp cụ thể cần xem xột chọn thuật toỏn như thế nào để trỏnh quỏ lạm dụng thuật toỏn phức tạp cú thể làm gia tăng thời gian cần để cài đặt và bắt lỗi cú thể lớn hơn rất nhiều so với thời gian cần để chạy một thuật toỏn chậm hơn chỳt ớt.

Tiến trỡnh tổng quỏt của việc tạo ra cỏc sửa đổi ngày càng tiến bộ hơn cho một chương trỡnh để sinh ra một phiờn bản khỏc chạy nhanh hơn thỡ được gọi là tối ưu húa chương trỡnh. Đõy là một cỏi tờn giả do khụng cú một cài đặt nào là tốt nhất đối với tất cả cỏc trường hợp. Việc tối ưu chương trỡnh là khụng thể thực hiện được, tuy nhiờn việc cải tiến chương trỡnh để đạt được hiệu quả cao nhất cú thể đối với những trường hợp thụng thường là một việc hoàn toàn cú thể thực hiện được.

Đối với chương trỡnh cú khối lượng dữ liệu lớn như chương trỡnh thành lập, biờn tập và ứng dụng bản đồ số địa chớnh thỡ chỉ cải tiến cỏc thuật toỏn là thực sự chưa đủ, bởi cỏc thuật toỏn đến nay đó phỏt triển trờn thế giới hầu như khú cú thể cải tiến được hiệu quả hơn.

Trong lập trỡnh phần mềm, tốc độ thực hiện cỏc chương trỡnh ứng dụng phụ thuộc vào cỏc yếu tố sau: hệ điều hành, tuỳ chọn biờn dịch, thuật toỏn, lựa chọn kiểu dữ liệu và cỏc phộp toỏn... Trước đõy, khi đặt vấn đề tối ưu hoỏ về tốc độ cho cỏc chương trỡnh người ta thường nghĩ ngay đến việc tối ưu hoỏ về thuật toỏn. Tuy nhiờn, thực tế chỉ ra rằng, khi cỏc thuật toỏn đó tiến tới hoàn thiện thỡ cỏc yếu tố như tuỳ chọn biờn dịch hay việc lựa chọn kiểu dữ liệu cũng như cỏc phộp toỏn sẽ cú tiếng núi quyết định đến tớnh hiệu quả của chương trỡnh về mặt thời gian thực thi, đặc biệt khi tớnh toỏn với dữ liệu đầu vào lớn phải sử dụng cỏc vũng lặp.

Trong phần này, nghiờn cứu một cỏch tiếp cận hoàn toàn khỏc về vấn đề nõng cao hiệu quả chương trỡnh về mặt tốc độ xử lý thụng qua việc khảo sỏt tốc độ thực hiện cỏc phộp toỏn.

Hệ điều hành Windows hiện nay được sử dụng trong phần lớn cỏc mỏy vi tớnh, là hệ điều hành đa nhiệm, tức là trong cựng một thời điểm cú thể thực hiệu nhiều cụng việc và chương trỡnh khỏc nhau (Multi Tasking). Với mỗi một ứng dụng chạy, lại cú thể phõn ra thành nhiều luồng chạy, cũn gọi là hệ

điều hành chạy đa luồng (Multi Threading). Việc thực nghiệm trờn hệ điều hành Windows XP, giữ nguyờn tất cả cỏc dịch vụ (Services) của hệ điều hành, chương trỡnh thực nghiệm tớnh toỏn cũng được chạy song song với một vài ứng dụng khỏc để đảm bảo điều kiện chạy bỡnh thường khi lập trỡnh ứng dụng [15].

Tất cả cỏc phộp toỏn trong đều được thử nghiệm với số lần chạy là 100 triệu lần (100,000,000), thực hiện trờn mỏy tớnh cú cấu hỡnh như sau: Intel(R) Core(TM) 2 Duo E7500 @ 2.93GHz, Ram 1.74 GB, cài đặt hệ điều hành Windows XP SP2.

Chức năng kiểm tra tốc độ tớnh toỏn nằm trong trỡnh đơn Test.

Trong chương trỡnh thực nghiệm, sử dụng hàm randomize để lấy giỏ trị ngẫu nhiờn. Giả sử thời gian khởi tạo cỏc giỏ trị này với số lần lặp là 100.000.000 lần là T1 (T1 được tớnh bằng cỏch lấy hiệu thời điểm kết thỳc và thời điểm bắt đầu vũng lặp, thời gian cú thể lấy từ giờ hệ thống của mỏy tớnh)

Do

B = Rnd (1000) C = Rnd (1000)

Loop Until Lanlap > 100.000.000

Bõy giờ cần khảo sỏt phộp toỏn P, đưa phộp toỏn vào vũng lặp cựng với 2 lệnh khởi tạo đó được đo thời gian ở trờn (số lần lặp vẫn là 100.000.000 lần). Thời gian hoàn thành phộp toỏn này cựng với cỏc lệnh khởi tạo giả sử là T2.

Do

B = Rnd (1000) C = Rnd (1000)

Phộp toỏn P

Loop Until Lanlap > 100.000.000

Như vậy thời gian hoàn thành phộp toỏn với 100.000.000 lần lặp (T) được tớnh như sau:

T = T2 - T1

a. Thử nghiệm tốc độ thực hiện cựng phộp toỏn khỏc kiểu dữ liệu

Trong bảng 4.1 dưới đõy khảo sỏt sự chờnh lệch về tốc độ thực hiện cựng một phộp toỏn với cỏc kiểu dữ liệu khỏc nhau. Ở cột thời gian thực hiện sẽ thể hiện số giõy hoàn tất phộp toỏn, ở cột so sỏnh tương đối giữa cỏc kiểu dữ liệu khỏc nhau, giả sử tốc độ thực hiện với kiểu Integer là 1, cỏc kiểu dữ liệu khỏc sẽ được tớnh tương đối so với kiểu Integer.

Bảng 4.1. So sỏnh tốc độ thực hiện phộp toỏn của cỏc kiểu dữ liệu

Phộp toỏn P Biểu thức Thời gian thực hiện (giõy) So sỏnh với kiểu Integer (lần) Cộng Cộng 2 số Integer Cộng 2 số Long Cộng 2 số Single Cộng 2 số Double A = B + C. (A,B,C: Integer) A = B + C. (A,B,C: Long) A = B + C. (A,B,C: Single) A = B + C. (A,B,C: Double) 0.172 0.172 0.797 0.797 1 1.0 4.6 4.6 Trừ Trừ 2 số Integer Trừ 2 số Long Trừ 2 số Single Trừ 2 số Double A = B - C. (A,B,C: Integer) A = B - C. (A,B,C: Long) A = B - C. (A,B,C: Single) A = B - C. (A,B,C: Double) 0.172 0.172 0.797 0.797 1 1.0 4.6 4.6 Nhõn Nhõn 2 số Integer Nhõn 2 số Long Nhõn 2 số Single A = B * C. (A,B,C: Integer) A = B * C. (A,B,C: Long) A = B * C. (A,B,C: Single) 0.172 0.172 0.890 1 1.0 5.2

Nhõn 2 số Double A = B * C. (A,B,C: Double) 0.890 5.2 Chia Chia 2 số Integer Chia 2 số Long Chia 2 số Integer Chia 2 số Long Chia 2 số Single Chia 2 số Double A = B / C. (A,B,C: Integer) A = B / C. (A,B,C: Long) (A: Double) A = B / C. (B,C: Integer) A = B / C. (B,C: Long) A = B / C. (B,C: Single) A = B / C. (B,C: Double) 3.937 2.969 2.340 2.340 1.730 1.730 1 0.8 0.6 0.6 0.4 0.4

Qua bảng 4.1 cho thấy, đối với kiểu số nguyờn thỡ cỏc phộp toỏn cộng, trừ, nhõn cho thời gian ớt nhất nhưng phộp chia chiếm thời gian lại rất lớn; đối với kiểu số thực thỡ ngược lại phộp chia hai số thực lại tốn thời gian ớt nhất cũn đối với cỏc phộp toỏn khỏc thỡ lại chiếm thời gian xử lý lớn hơn nhiều lần.

b. Thử nghiệm tốc độ thực hiện cỏc phộp toỏn khỏc nhau

Để khảo sỏt tốc độ thực hiện cỏc phộp toỏn khỏc nhau trong cựng điều kiện, đặt cỏc phộp toỏn vào vũng lặp cú số lần thực hiện giống nhau, kiểu dữ liệu giống nhau. Giả thiết rằng, thời gian để chương trỡnh duyệt qua toàn bộ vũng lặp và khụng thực hiện một lệnh nào là 1, cỏc phộp toỏn khỏc sẽ được so sỏnh với thời gian duyệt vũng lặp để tớnh tương đối số lần nhiều hơn. Kết quả được thể hiện ở Bảng 4.2.

Bảng 4.2. So sỏnh tốc độ thực hiện cỏc phộp toỏn khỏc nhau (adsbygoogle = window.adsbygoogle || []).push({});

Phộp toỏn P Biểu thức Thời gian thực hiện (giõy) So sỏnh với khụng thực hiện lệnh (lần)

Khụng thực hiện gỡ (Duyệt qua vũng lặp thử nghiệm) 0.125 1

If ... then If A > B then End If (A, B: Boolean) 0.125 1.0

And A = B And C (A, B, C: Boolean) 0.125 1.0

Or A = B Or C (A, B, C: Boolean) 0.125 1.0

Chia nguyờn A = B \ C (A, B, C: Long) 0.450 3.6

Cộng A = B + C (A, B, C: Double) 0.797 6.4

Trừ A = B - C (A, B, C: Double) 0.797 6.4

Nhõn A = B * C (A, B, C: Double) 0.890 7.1

Chia A = B / C (A, B, C: Double) 1.730 13.8

Lấy phần dư Mod A = B Mod C (A, B:Double, C: Long) 1.860 14.9

Căn bậc 2 Sqr A = Sqr(B) (A, B: Double) 1.906 15.2

Bỡnh phương A = B^2 (A, B: Double) 19.985 159.9

Luỹ thừa 3 A = B^3 (A, B: Double) 19.989 159.9

Sin A = Sin(B) (A, B: Double) 4.687 37.5

Cos A = Cos(B) (A, B: Double) 4.984 39.9

Tan A = Tan(B) (A, B: Double) 6.672 53.4

ArcTan A = Atn(B) (A, B: Double) 6.421 51.4

Qua bảng 4.2 cho thấy thời gian để thực hiện cỏc phộp lũy thừa thực hiện với thời gian lớn nhất, cỏc phộp so sỏnh logic cho thời gian thực hiện ớt nhất.

c. Thử nghiệm tựy biến chế độ biờn dịch an toàn

Để thấy được vai trũ của tựy biến chế độ biờn dịch an toàn, tiến hành thử nghiệm một số biểu thức với vũng lặp như trờn cho kết quả ở bảng 4.3.

Bảng 4.3. So sỏnh tốc độ thực hiện khi sử dụng tuỳ chọn biờn dịch an toàn

Lựa chọn tối ưu Biểu thức

Thời gian thực hiện (giõy) Chọn Bỏ chọn

Remove Array Bounds Checks C= A+ B. (C,A,B: Single 0.156 0.094

Remove Integer Overflow Checks A = A*5 (A: Long) 0.391 0.281

Remove Floating Point Error Checks A = A/5 (A: Single) 4.125 2.359

Remove Safe Pentium FDIV Checks A = 5 / A (A: Single) 2.328 2.281

Bảng 4.3 cho thấy thời gian thực hiện khi bỏ cỏc lựa chọn tựy biến trỡnh biờn dịch cú hiệu quả rừ rệt khi thực thi chương trỡnh.

d. Thử nghiệm với vũng lặp lồng nhau (adsbygoogle = window.adsbygoogle || []).push({});

Vũng lặp với số lần lặp lớn làm cho chương trỡnh chạy chậm đi. Tuy nhiờn, cú sự khỏc nhau khi sử dụng vũng lặp đơn hoặc vũng lặp lồng nhau. Vũng lặp đơn đảm bảo nguyờn tắc thực hiện nhiều lần thỡ sẽ mất nhiều thời gian chạy. Tuy nhiờn, cú sự khỏc nhau khi sử dụng vũng lặp lồng nhau.

Xột vớ dụ sau đõy: For i = 1 To m For j = 1 To n Khối lệnh A Next j Next i

Với m = 10 và n = 10.000.000, thời gian thực hiện hết 0.219 giõy. Khi thay m = 10.000.000 và n =10, thời gian chạy là 0.250 giõy. Tổng số lần chạy cho cả 2 vũng lặp đều là 100.000.000 lần, nhưng cú sự khỏc nhau về thời gian chạy. Như vậy, với số lần lặp trong vũng lặp trong cựng nhiều hơn, thỡ thời gian chạy là ớt hơn.

e. Giải phỏp tăng tốc độ tớnh toỏn

- Chọn kiểu dữ liệu phự hợp khi khai bỏo biến vỡ thụng thường cỏc kiểu dữ liệu Single và Double sẽ tốn thời gian thực hiện hơn trong cỏc phộp toỏn;

- Dựng cỏc phộp nhõn để thay thế phộp chia nếu cú thể vỡ phộp chia tốn thời gian hơn phộp nhõn (vớ dụ: sử dụng A * 0.5 thay cho A/2);

- Trỏnh sử dụng biểu thức lũy thừa, khi lập trỡnh lưu ý cú thể thay thế bằng cỏc phộp nhõn đơn giản hơn nếu cú thể. Vớ dụ sử dụng A*A thay cho A^2;

- Kiểm tra những trường hợp đặc biệt ở bờn ngoài vũng lặp bởi cỏc phộp thử hay kiểm tra điều kiện logic hầu như khụng mất nhiều thời gian thực hiện, do vậy nờn lựa chọn để trỏnh phải thực hiện nhiều phộp toỏn trong vũng lặp;

- Đặt những cụng việc tớnh toỏn lớn ở những vũng lặp bờn trong khi bắt buộc sử dụng cỏc vũng lặp lồng nhau thỡ hiệu quả tớnh toỏn sẽ cao hơn;

- Cần tựy biến chế độ biờn dịch an toàn tựy thuộc ngụn ngữ lập trỡnh để tăng tốc độ tớnh toỏn chương trỡnh khi thực thi.

Phần thử nghiệm chỉ tiến hành với ngụn ngữ lập trỡnh Visual Basic 6.0, chạy chương trỡnh trờn mỏy tớnh cú tốc độ trung bỡnh hiện nay. Tuy nhiờn, trong thử nghiệm cú sự so sỏnh tương quan về thời gian thực hiện giữa cỏc phộp tớnh và cỏc kiểu dữ liệu. Cỏc đỏnh giỏ phõn tớch thử nghiệm về giữa cỏc phộp tớnh và cỏc kiểu dữ liệu cú thể ỏp dụng trong cỏc ngụn ngữ lập trỡnh khỏc để cải thiện tốc độ tớnh toỏn. Từ đú cho thấy, để tăng tốc độ khi xõy dựng chương trỡnh ứng dụng, ngoài việc sử dụng cỏc thuật toỏn tối ưu thỡ vấn đề xỏc định giải phỏp tối ưu húa tốc độ tớnh toỏn cho cỏc thuật toỏn trong xõy dựng chương trỡnh là một trong những biện phỏp hiệu quả.

Một phần của tài liệu Nghiên cứu công nghệ thành lập và ứng dụng bản đồ số địa chính trong điều kiện Việt Nam (Trang 98 - 105)