You are on page 1of 40

MỤC TIÊU

Hiểu được thế nào là 1 chương trình viết tốt.

Nắm vững một số kỹ thuật tinh chỉnh mã nguồn.

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô Phước Nguyên 1


Ngày nay yếu tố thời gian
Khó đạt cả 3. được coi trọng.
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 2
Phước Nguyên
• Muốn biên dịch nhanh  bỏ Optimizer khi
biên dịch.

Dùng các cấu trúc dữ liệu hợp lý, cải


tiến giải thuật, sử dụng các phát biểu hợp
lý cũng giúp làm tăng đáng kể về hiệu suất
thời gian chạy của chương trình

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 3


Phước Nguyên
Hai yếu tố thời gian và không gian mâu
thuẩn nhau  Muốn chạy nhanh thì chấp
nhận kích thước chương trình lớn.

Ngày nay, với sự tiến bộ của kỹ thuật, CPU


tốc độ cao, bộ nhớ lớn, khuynh hướng hiện
nay là chấp nhận dư thừa dữ liệu để đạt
yêu cầu về thời gian.

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 4


Phước Nguyên
THÍ DỤ MINH HỌA

struct Line
{ int x1, y1; // điểm đầu
int x2, y2; // điểm cuối
};
double getLen (Line L) // hàm tính độ dài
{ return sqrt( (L.y2-L.y1)*(L.y2-L.y1) +
(L.x2-L.x1)*(L.x2-L.x1));
}
Mỗi lần truy xuất độ dài một đoạn thẳng , 8 lần
truy xuất dữ liệu, 4 phép trừ, 2 phép nhân, một
phép cộng và 1 lời gọi hàm sqrt thực thi.

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 5


Phước Nguyên
CẢI TiẾN

struct Line
{ int x1,y1; // điểm đầu
int x2,y2; // điểm cuối
double len ; // độ dài
};

 Chỉ phải cập nhật trị của len mỗi lần khi
x1,y1,x2,y2 thay đổi, còn khi truy xuất độ dài chỉ
tốn 1 lần truy xuất bộ dữ liệu (biến).

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 6


Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 7
Phước Nguyên
• Thêm yếu tố cấu trúc thay cho tính toán.
• Tạo bảng tìm kiếm để lưu các trị tính toán trước.
• Dùng bảng kiểm tra lười.
• Khởi tạo trị ngay lúc biên dịch và tính toán trước.
• Giải pháp cho các tình huống đơn giản.
• Cải tiến giải thuật.
• Dùng kiểm tra đơn giản thay cho kiểm tra phức
tạp

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 8


Phước Nguyên
• Dùng kỹ thuật cầm canh (sentinel)
• Tránh đệ quy.
• Dùng kỹ thuật xấp xỉ.
• Giảm truy xuất đĩa.

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 9


Phước Nguyên
struct Line  struct Line
{ int x1,y1; { int x1,y1;
int x2, y2; int x2,y2;
}; double Len;
};
Để bớt việc tính toán độ dài mỗi khi cần
truy xuất

Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 10


Phước Nguyên
• Tình huống: Cần rất nhiều truy xuất 1 trị căn bậc 2 của
0<=x<=100 . Ta lưu trữ sẵn bảng căn 2 này.
#define NUM 100
double sqrt_table[NUM+1];
{ int i;
for (i=0;i<NUM+1; ++i) sqrt_table[i]= sqrt(i);
}
double square_root(int x)
{ return sqrt_table[x];
}
• Tuy nhiên khi cần kiểm tra 1 ký tự có là chữ hoa hay
không bằng việc truy xuất 1 bảng thì không nhanh bằng
định nghĩa 1 macro:
#define isupper(ch) (ch >= ‘A’ && ch <= ‘Z’)
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô Phước Nguyên 11
• Ta muốn bảng tính toán trước chỉ cần thực thi tại lần đầu tiên
truy xuất căn bậc 2 của x

#define NUM 100


double square_root(int x)
{ static double sqrt_table[NUM+1];
static int precalc[NUM+1] // mảng cờ đánh dấu
if (!precalc[x])
{ sqrt_table[x]= sqrt(x); // đưa căn x vào mảng
precalc[x]= 1; // đánh dấu đã đưa trị vào
bảng rồi
}
return sqrt_table[x];
} Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô Phước Nguyên 12
• Định nghĩa trước bảng căn 2

#define NUM 100


double square_root(int x)
{ static double sqrt_table[NUM+1]=
{ 0.000000, 1.000000, 1.414214, 1.732051,........
.........
9.949874, 10.000000
};
return sqrt_table[x];
}
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô Phước Nguyên 13
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 14
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 15
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 16
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 17
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 18
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 19
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 20
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 21
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 22
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 23
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 24
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 25
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 26
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 27
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 28
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 29
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 30
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 31
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 32
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 33
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 34
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 35
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 36
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 37
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 38
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 39
Phước Nguyên
Chương 2 : TINH CHỈNH MÃ NGUỒN Gv Ngô 40
Phước Nguyên

You might also like