Professional Documents
Culture Documents
Ky Thuat Lap Trinh Lec4. Efficient Code (Cuuduongthancong - Com)
Ky Thuat Lap Trinh Lec4. Efficient Code (Cuuduongthancong - Com)
om
.c
Kỹ thuật viết mã nguồn
ng
co
hiệu quả
an
th
o ng
du
u
cu
3/24/2020 1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Các kỹ thuật viết mã nguồn hiệu quả
om
2. Những nguyên tắc cơ bản trong việc
.c
tăng hiệu quả viết mã nguồn
ng
co
3. Tối ưu hóa mã nguồn C/C++
an
th
o ng
du
u
cu
3/24/2020 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương trình hiệu quả
• Trước hết là giải thuật
• Hãy dùng giải thuật hay nhất có thể
om
• Sau đó hãy nghĩ tới việc tăng tính hiệu quả của code
.c
• Ví dụ: Tính tổng của n số tự nhiên liên tiếp kể từ m
ng
co
void main(){ void main(){
an
long n, m, i, sum; long n, m, sum;
th
cin << n; ng cin << n;
cin << m; cin << m;
o
du
sum += i; }
cout << “Sum = “ <<sum;
}
3/24/2020 3
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Dùng chỉ thị chương trình dịch
• Một số compilers có vai trò rất lớn trong việc
tối ưu chương trình
om
.c
• Chúng phân tích sâu mã nguồn và làm mọi điều
“machinely” có thể
ng
co
• Ví dụ GNU g++ compiler trên Linux/Cygwin cho
chương trình viết bằng C
an
th
g++ –O5 –o myprog myprog.c
ng
• Có thể cải thiện hiệu năng từ 10% đến 300%
o
du
u
cu
3/24/2020 4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nhưng...
• Bạn vẫn có thể thực hiện những cải tiến mà trình dịch
không thể
om
• Bạn phải loại bỏ tất cả những chỗ bất hợp lý trong
.c
code
ng
• Làm cho chương trình hiệu quả nhất có thể
co
• Có thể phải xem lại khi thấy chương trình chạy chậm
an
th
• Vậy cần tập trung vào đâu để cải tiến nhanh nhất, tốt nhất?
ng
o
du
u
cu
3/24/2020 5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Viết chương trình hiệu quả
• Xác định nguồn gây kém hiệu quả
• Dư thừa tính toán - redundant computation
om
• Chủ yếu
.c
• Trong các procedure
ng
• Các vòng lặp: Loops
co
an
th
o ng
du
u
cu
3/24/2020 6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Khởi tạo 1 lần, dùng nhiều lần
• Before float f(){
om
double value = sin(0.25);
//
.c
…
ng
}
co
an
• After
th
ng
double defaultValue = sin(0.25);
o
float f(){
du
//
cu
…
}
3/24/2020 7
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hàm nội tuyến (inline functions)
Điều gì xảy ra khi một hàm được gọi?
om
CPU sẽ lưu địa chỉ bộ nhớ của dòng lệnh hiện tại mà
nó đang thực thi (để biết nơi sẽ quay lại sau lời gọi
.c
hàm), sao chép các đối số của hàm trên ngăn xếp
ng
(stack) và cuối cùng chuyển hướng điều khiển sang
co
hàm đã chỉ định. CPU sau đó thực thi mã bên trong
an
hàm, lưu trữ giá trị trả về của hàm trong một vùng
th
nhớ/thanh ghi và trả lại quyền điều khiển cho vị trí lời gọi
ng
hàm
o
du
➔ Điều này sẽ tạo ra một lượng chi phí hoạt động nhất
u
sử dụng hàm).
3/24/2020 8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hàm nội tuyến (inline functions)
• Đối với các hàm lớn hoặc các tác vụ phức tạp, tổng
chi phí overhead của lệnh gọi hàm thường không đáng
om
kể so với lượng thời gian mà hàm mất để chạy.
.c
• Tuy nhiên, đối với các hàm nhỏ, thường xuyên được
ng
sử dụng, thời gian cần thiết để thực hiện lệnh gọi hàm
co
thường nhiều hơn rất nhiều so với thời gian cần thiết
an
để thực thi mã của hàm.
th
• Inline functions (hàm nội tuyến) là một loại hàm
ng
trong ngôn ngữ lập trình C++. Từ khoá inline được sử
o
du
triển nội tuyến) với hàm đó hay nói cách khác là chèn
code của hàm đó tại địa chỉ mà nó được gọi.
3/24/2020 9
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hàm nội tuyến (inline functions)
• Đối với các hàm lớn hoặc các tác vụ phức tạp, tổng
chi phí overhead của lệnh gọi hàm thường không đáng
om
kể so với lượng thời gian mà hàm mất để chạy.
.c
• Tuy nhiên, đối với các hàm nhỏ, thường xuyên được
ng
sử dụng, thời gian cần thiết để thực hiện lệnh gọi hàm
co
thường nhiều hơn rất nhiều so với thời gian cần thiết
an
để thực thi mã của hàm.
th
• Inline functions (hàm nội tuyến) là một loại hàm
ng
trong ngôn ngữ lập trình C++. Từ khoá inline được sử
o
du
triển nội tuyến) với hàm đó hay nói cách khác là chèn
code của hàm đó tại địa chỉ mà nó được gọi.
3/24/2020 10
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Inline functions
#include <iostream>
#include <cmath>
om
using namespace std;
.c
inline double hypothenuse (double a, double b){
ng
return sqrt (a * a + b * b);
co
}
an
int main (){
double k = 6, m = 9;
th
ng
// 2 dòng sau thực hiện như nhau:
o
du
return 0;
}
3/24/2020 11
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Inline functions
#include <iostream>
using namespace std;
om
inline int max(int a, int b){
return a > b ? a : b;
.c
}
ng
int main() {
co
cout << max(3, 6) << '\n';
an
cout << max(6, 3) << '\n';
th
return 0;
}
ng
Khi chương trình trên được biên dịch, mã máy được tạo ra
o
du
int main(){
cu
om
inline int max(int a, int b){
return a > b ? a : b;
.c
}
ng
int main() {
co
cout << max(3, 6) << '\n';
an
cout << max(6, 3) << '\n';
th
return 0;
}
ng
Khi chương trình trên được biên dịch, mã máy được tạo ra
o
du
int main(){
cu
om
• Hàm chứa vòng lặp (for, while, do-while).
.c
• Hàm chứa các biến tĩnh.
ng
• Hàm đệ quy.
co
an
• Hàm chứa câu lệnh switch hoặc goto.
th
o ng
du
u
cu
3/24/2020 14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Inline functions
• Ưu điểm:
‒ Tiết kiệm chi phí gọi hàm.
om
‒ Tiết kiệm chi phí của các biến trên ngăn xếp khi hàm được
.c
gọi.
ng
‒ Tiết kiệm chi phí cuộc gọi trả về từ một hàm.
co
• Nhược điểm:
an
‒ Tăng kích thước file thực thi do sự trùng lặp của cùng một
th
ng
mã.
o
‒ Khi được sử dụng trong file tiêu đề (*.h), nó làm cho file tiêu
du
‒ Hàm nội tuyến có thể không hữu ích cho nhiều hệ thống
nhúng. Vì trong các hệ thống nhúng, kích thước mã quan
trọng hơn tốc độ.
3/24/2020 15
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Macros
#define max(a,b) (a > b ? a : b)
• Các hàm inline cũng giống như macros vì cả 2 được
om
khai triển khi dịch compile time
.c
• macros được khai triển bởi preprocessor, còn inline
ng
functions được truyền bởi compiler.
co
• Tuy nhiên có nhiều điểm khác biệt:
an
• Inline functions tuân thủ các thủ tục như 1 hàm binh
th
thường. ng
• Inline functions có cùng syntax như các hàm khác, chỉ
o
có điều là có thêm từ khóa inline khi khai báo hàm.
du
om
compile-time.
.c
ng
int int_array[100];
co
int main() {
an
static float float_array[100];
th
double double_array[100]; ng
char *pchar;
o
pchar = (char *)malloc(100);
du
/* .... */
u
cu
return (0);
}
3/24/2020 17
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Static Variables
• Các biến khai báo trong chương trình con được cấp phát bộ
nhớ khi chương trình con được gọi và sẽ bị loại bỏ khi kết
om
thúc chương trình con.
.c
• Khi bạn gọi lại chương trình con, các biến cục bộ lại được
ng
cấp phát và khởi tạo lại.
co
• Nếu bạn muốn 1 giá trị vẫn được lưu lại cho đến khi kết
an
thúc toàn chương trình, bạn cần khai báo biến cục bộ của
th
chương trình con đó là static và khởi tạo cho nó 1 giá trị.
ng
• Việc khởi tạo sẽ chỉ thực hiện lần đàu tiên chương trình được
o
gọi và giá trị sau khi biến đổi sẽ được lưu cho các lần gọi sau.
du
• Bằng cách này 1 chương trình con có thể “nhớ” một vài mẩu
u
om
• static, stack, và heap data.
.c
• Static: global hay static variables
ng
co
• Stack data:
an
• các biến cục bộ của chương trình con
th
• ví dụ double_array trong ví dụ trên.
ng
• Heap data:
o
du
dụ trên).
cu
3/24/2020 19
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính toán trước các giá trị
• Nếu bạn phải tính đi tính lại 1 biểu thức, thì
nên tính trước 1 lần và lưu lại giá trị, rồi dùng
om
giá trị ấy sau này
.c
ng
int f(int i){ static int[] values =
co
if (i < 10 && i >= 0){ {0, 0, 2,3*3-3, ..., 9*9-9};
return i * i - i; int f(int i){
an
} if (i < 10 && i >= 0)
th
return 0;
return values[i];
ng
}
o
return 0;
du
}
u
cu
3/24/2020 20
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Loại bỏ những biểu thức thông thường
• Đừng tính cùng một biểu thức nhiều lần!
• Một số compilers có thể nhận biết và xử lý.
om
.c
for (i = 1; i<= 10; i++)
ng
x += strlen(str);
co
Y = 15 + strlen(str);
an
th
ng
len = strlen(str);
o
for (i = 1; I <= 10; i++) x += len;
du
Y = 15 + len;
u
cu
3/24/2020 21
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Sử dụng các biến đổi số học!
• Trình dịch không thể tự động xử lý
om
if (a > sqrt(b))
.c
x = a*a + 3*a + 2;
ng
co
an
if (a *a > b)
x = (a+1)*(a+2); th
o ng
du
u
cu
3/24/2020 22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Dùng “lính canh” -Tránh những kiểm tra
không cần thiết
• Trước
om
char s[100], searchValue;
.c
int pos, found, size;
// Gán giá trị cho s, searchValue
ng
…
co
size = strlen(s);
an
pos = 0;
th
While (pos < size) && (s[pos] != searchValue)
ng
do pos++;
o
du
else found = 1;
cu
3/24/2020 23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Dùng “lính canh” ….
• Ý tưởng chung
• Đặt giá trị cần tìm vào cuối xâu
om
• Luôn đảm bảo tìm thấy giá trị cần tìm.
.c
• Nhưng nếu vị trí >= size nghĩa là không tìm thấy!
ng
co
size = strlen(s);
an
strcat(s, searchValue);
pos = 0;
th
ng
while ( s[pos] != searchValue)
o
du
do pos++;
if (pos >= size) found = 0
u
cu
else found = 1;
om
.c
for (i =0; i<100;i++)
ng
plot(i, i*sin(d));
co
an
th
M = sin(d); ng
for (i =0; i<100;i++)
o
du
plot(i, i*M);
u
cu
3/24/2020 25
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Không dùng các vòng lặp ngắn
om
sum += q*i -i*7;
.c
ng
co
i = j;
an
sum += q*i -i*7;
th
i ++; ng
sum += q*i -i*7;
o
du
i ++;
u
sum += q*i-i*7;
cu
3/24/2020 26
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Giảm thời gian tính toán
• Trong mạng nơ-ron sử
om
dụng hàm kích hoạt
.c
sigmoid
ng
• Với x dương lớn ta có
co
sigmoid(x) 1
an
• Với x âm “lớn”
th
ng
sigmoid (x) 0
o
du
u
cu
1
sigmoid( x) =
1 + e − kx
3/24/2020 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính Sigmoid
float sigmoid (float x ){
return 1.0 / (1.0 + exp(-x))
om
};
.c
ng
• Hàm exp(-x) mất rất nhiều thời gian để tính!
co
an
• Những hàm kiểu này người ta phải dùng khai triển
th
chuỗi ng
• Chuỗi Taylor /Maclaurin
o
• Tính tổng các số hạng dạng ((-x)n / n!)
du
om
• Trong mỗi lần gọi sigmoid x2 sigmoid(x0)
.c
• Tìm giá trị gần nhất của x và kết quả ứng với x3 sigmoid(x0)
ng
giá trị ấy x4 sigmoid(x0)
co
• Thực hiện nội suy tuyến tính - linear x5 sigmoid(x0)
interpolation
an
x6 sigmoid(x0)
th
ng .
.
.
o
du
x99 sigmoid(x99)
u
cu
3/24/2020 29
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính Sigmoid
om
x0 sigmoid(x0) if (x <x0) return (0.0);
x1 sigmoid(x0)
.c
x2 sigmoid(x0)
ng
x3 sigmoid(x0)
co
x4 sigmoid(x0)
an
x5 sigmoid(x0)
th
x6 sigmoid(x0) ng
.
o
.
du
.
u
x99 sigmoid(x99)
3/24/2020 30
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính Sigmoid
• Chọn số các điểm (N = 1000, 10000, v.v.) tùy
theo độ chính xác mà bạn muốn
om
• Tốn kém thêm không gian bộ nhớ cho mỗi điểm là
.c
2 giá trị float hay double tức là 8 – 16 bytes
ng
• Khởi tạo giá trị cho mảng khi bắt đầu thực hiện
co
an
th
o ng
du
u
cu
3/24/2020 31
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính Sigmoid
• Bạn đã biết X0
om
• Tính Delta = X1 - X0
.c
• Tính Xmax = X0 + N * Delta;
ng
• Với X đã cho
co
• Tính i = (X – X0)/Delta;
an
• 1 phép trừ số thực và 1 phép chia số thực
• Tính sigmoid(x) th
o ng
• 1 phép nhân float và 1 phép cộng float
du
u
cu
3/24/2020 32
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kết quả đạt được
• Nếu dùng exp(x):
om
• Mỗi lần gọi mất khoảng 300 nanoseconds với 1
máy Pentium 4 tốc độ 2 Ghz.
.c
• Dùng tìm kiếm trên mảng và nội suy tuyến tính:
ng
co
• Mỗi lần gọi mất khoảng 30 nanoseconds
an
• Tốc độ tăng gập 10 lần
th
• Đổi lại phải tốn kếm thêm từ 64K to 640K bộ nhớ.
o ng
du
u
cu
3/24/2020 33
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Lưu ý!
• Với đại đa số các chương trình, việc tăng tốc
độ thực hiện là cần thiết
om
• Tuy nhiên, cố tăng tốc độ cho những đoạn
.c
code không sử dụng thường xuyên là vô ích!
ng
co
an
th
o ng
du
u
cu
3/24/2020 34
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Những quy tắc cơ bản
• Đơn giản hóa Code – Code Simplification:
• Hầu hết các chương trình chạy nhanh là đơn giản. Vì
om
vậy, hãy đơn giản hóa chương trình để nó chạy nhanh
.c
hơn.
ng
• Đơn giản hóa vấn đề - Problem Simplification:
co
• Để tăng hiệu quả của chương trình, hãy đơn giản hóa
an
vấn đề mà nó giải quyết.
th
• Không ngừng nghi ngờ - Relentless Suspicion:
ng
• Đặt dấu hỏi về sự cần thiết của mỗi mẩu code và mỗi
o
du
• Hãy thực hiện ngay công việc để tránh thực hiện nhiều
lần sau này.
3/24/2020 35
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Fundamental Rules
• Code Simplification: Most fast programs are simple, so
keep it simple . Sources of harmful complexity includes: A
om
lack of understanding the task and premature optimization.
.c
• Problem Simplification: To increase the efficiency of a
ng
program, simplify the problem it solves. Why store all values
when you only need a few of them?
co
• Relentless suspicion: Question the necessity of each
an
instruction in a time critical piece of code and each field in a
th
space critical data structure.
ng
• Early binding: Move work forward in time. So, do work now
o
du
om
• Dùng thêm các dữ liệu có cấu trúc:
.c
ng
• Thời gian cho các phép toán thông dụng có thể
co
giảm bằng cách sử dụng thêm các cấu trúc dữ liệu
với các dữ liệu bổ sung hoặc bằng cách thay đổi
an
các dữ liệu trong cấu trúc sao cho dễ tiếp cận hơn.
• Lưu các kết quả được tính trước: th
o ng
• Thời gian tính toán lại các hàm có thể giảm bớt
du
bằng cách tính toán hàm chỉ 1 lần và lưu kết quả,
u
3/24/2020 37
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Quy tắc tăng tốc độ: cont.
• Caching:
om
• Dữ liệu thường dùng cần phải dễ tiếp cận nhất,
luôn hiện hữu.
.c
• Lazy Evaluation:
ng
co
• Không bao giờ tính 1 phần tử cho đến khi cần để
tránh những sự tính toán không cần thiết.
an
th
o ng
du
u
cu
3/24/2020 38
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Quy tắc lặp: Loop Rules
• Những điểm nóng - Hot spots trong phần lớn
các chương trình đến từ các vòng lặp:
om
• Đưa Code ra khỏi các vòng lặp:
.c
ng
• Thay vì thực hiện việc tính toán trong mỗi lần lặp,
co
tốt nhất thực hiện nó chỉ một lần bên ngoài vòng
lặp- nếu được.
an
th
• Kết hợp các vòng lặp – loop fusion:ng
• Nếu 2 vòng lặp gần nhau cùng thao tác trên cùng 1
o
tập hợp các phần tử thì cần kết hợp chung vào 1
du
vòng lặp.
u
cu
3/24/2020 39
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Quy tắc lặp: Loop Rules
• Kết hợp các phép thử - Combining Tests:
• Trong vòng lặp càng ít kiểm tra càng tốt và tốt nhất chỉ
om
một phép thử. Lập trình viên có thể phải thay đổi điều
.c
kiện kết thúc vòng lặp. “Lính gác” hay “Vệ sĩ” là một ví
dụ cho quy tắc này.
ng
co
• Loại bỏ Loop:
an
• Với những vòng lặp ngắn thì cần loại bỏ vòng lặp, tránh
th
phải thay đổi và kiểm tra điều kiện lặp
ng
o
du
u
cu
3/24/2020 40
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Procedure Rules
• Khai báo những hàm ngắn và đơn giản
om
(thường chỉ 1 dòng) là inline
.c
• Tránh phải thực hiện 4 bước khi hàm được
ng
gọi
co
• Tránh dùng bộ nhớ stack
an
th
o ng
du
u
cu
3/24/2020 41
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Optimizing C and C++ Code
• Đặt kích thước mảng = bội của 2
Với mảng, khi tạo chỉ số, trình
om
dịch thực hiện các phép nhân, vì
.c
vậy, hãy đặt kích thước mảng
ng
bằng bội số của 2 để phép nhân có
co
thể được chuyển thành phép toán
an
dịch chuyển nhanh chóng
th
ng
• Đặt các giá trị case của lênh
o
switch trong phạm vi hẹp
du
om
• Nếu bố trí các case thường gặp lên trên, việc thực
.c
hiện sẽ nhanh hơn
ng
co
• Tái tạo các switch lớn thành các switches lồng nhau
an
• Khi số cases nhiều, hãy chủ động chia chúng thành
th
các switch lồng nhau, nhóm 1 gồm những cases
o ng
thường gặp, và nhóm 2 gồm những cases ít gặp. Khi
du
3/24/2020 43
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Optimizing C and C++ Code (tt)
• Hạn chế số lượng biến cục bộ
om
• Các biến cục bộ được cấp phát và khởi tạo khi hàm
.c
đc gọi, và giải phóng khi hàm kết thúc, vì vậy mất
ng
thời gian
co
• Khai báo các biến cục bộ trong phạm vi nhỏ nhất
an
th
• Hạn chế số tham số của hàm ng
• Với các tham số và giá trị trả về lớn hơn 4 byte,
o
du
3/24/2020 44
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Optimizing C and C++ Code (tt)
• Nên dùng int thay vì char hay short (mất thời gian convert), nếu
biết int không âm, hãy dùng unsigned int
om
• Hãy định nghĩa các hàm khởi tạo đơn giản
.c
• Thay vì gán, hãy khởi tạo giá trị cho biến
ng
• Hãy dùng danh sách khởi tạo trong hàm khởi tạo
co
Employee::Employee(String name, Stringdesignation){
m_name = name;
an
m_designation = designation;
th
}
ng
/* === Optimized Version === */
o
Employee::Employee(String name, String
du
(designation) { }
cu
• Đừng định nghĩa các hàm ảo tùy hứng: "just in case" virtual
functions
• Các hàm gồm 1 đến 3 dòng lệnh nên định nghĩa inline
3/24/2020 46
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Một vài ví dụ tối ưu mã C, C++
switch ( queue ) {
case 0 : letter = 'W'; break;
om
case 1 : letter = 'S'; break;
.c
ng
case 2 : letter = 'U'; break;
co
}
an
Hoặc có thể là :
if ( queue == 0 )
th
ng
letter = 'W';
o
du
else if ( queue == 1 )
u
cu
letter = 'S';
static char *classes="WSU";
else letter = 'U'; letter = classes[queue];
3/24/2020 47
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Một vài ví dụ tối ưu mã C, C++
(x >= min && x < max) có thể chuyển thành
(unsigned)(x - min) < (max - min)
om
.c
Giải thích:
ng
int: -231 … 231 - 1
co
unsigned: 0 … 232 - 1
an
th
ng
Nếu x - min >= 0: Hai biểu thức trên tương đương
o
Nếu x - min <= 0:
du
3/24/2020 48
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Một vài ví dụ tối ưu mã C, C++
int fact1_func (int n) {
int i, fact = 1;
om
for (i = 1; i <= n; i++) fact *= i;
.c
return (fact);
ng
}
co
int fact2_func(int n) {
an
int i, fact = 1;
th
ng
for (i = n; i != 0; i--) fact *= i;
o
return (fact);
du
}
u
cu
3/24/2020 49
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Số thực dấu phẩy động
• So sánh:
x = x / 3.0;
om
và
.c
x = x * (1.0/3.0) ;
ng
co
(biểu thức hằng được thực hiện ngay khi dịch)
an
• Hãy dùng float thay vì double
th
• Tránh dùng sin, exp và log (chậm gấp 10 lần * )
ng
• Dùng x * 0.5 thay vì x / 2.0
o
du
om
https://techdifferences.com/difference-between-inline-
and-macro.html
.c
2. Hàm nội tuyến:
ng
co
https://viblo.asia/p/inline-function-jvElaGRDKkw
3. Tối ưu hóa code C/C++:
an
th
https://people.cs.clemson.edu/~dhouse/courses/405/pap
ng
ers/optimize.pdf
o
du
3/24/2020 51
CuuDuongThanCong.com https://fb.com/tailieudientucntt