Danh mục tài liệu

Bài giảng Kỹ thuật lập trình (Programming technique): Chương 2 - Vũ Đức Vượng

Số trang: 95      Loại file: ppt      Dung lượng: 484.50 KB      Lượt xem: 28      Lượt tải: 0    
Xem trước 10 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Bài giảng Kỹ thuật lập trình (Programming technique): Chương 2, chương này cung cấp cho học viên những nội dung về: tăng hiệu quả chương trình và phong cách lập trình; dùng chỉ thị chương trình dịch; những quy tắc cơ bản (fundamental rules);... Mời các bạn cùng tham khảo chi tiết nội dung bài giảng!
Nội dung trích xuất từ tài liệu:
Bài giảng Kỹ thuật lập trình (Programming technique): Chương 2 - Vũ Đức Vượng TĂNG HIỆU QUẢ CHƯƠNG TRÌNH VÀ PHONG CÁCH LẬP TRÌNH Efficient Programs  Trước hết là giải thuật   Hãy dùng giải thuật hay nhất có thể   Sau đó hãy nghĩ tới việc tăng tính hiệu quả của code  Ví dụ : Tính tổng của n số tự nhiên kế từ m void main() { void main() { long n,m,i , sum ; long n,m , sum ; cout 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  Chúng phân tích sâu mã nguồn và làm mọi điều  “machinely” có thể  Ví dụ  GNU g++ compiler trên Linux/Cygwin  cho chương trình viết = c  g++ –O5 –o myprog myprog.c      có thể cải thiện hiệu năng từ 10% đến 300%      3 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ể  Bạn phải loại bỏ tất cả những chỗ bất hợp lý  trong code  Làm cho chương trình hiệu quả nhất có thể  Có thể phải xem lại khi thấy chương trình  chạy chậm  Vậy cần tập trung vào đâu để cải tiến nhanh  nhất, tốt nhất ?     4 Writing Efficient Code  Xác định nguồn gây kém hiệu quả  Dư thừa tính toán ­ redundant computation  Chủ yếu  Trong các procedure   Các vòng lặp : Loops     5 Khởi tạo 1 lần, dùng nhiều lần  Before float f() { double value = sin(0.25); // ….. }  After double defaultValue = sin(0.25); float f() { double value = defaultValue; // …..     } 6 Inline functions  Nếu 1 hàm trong c++ chỉ gồm những lệnh đơn  giản, không co for, while .. Thì có thể khai báo  inline.  Inline code sẽ được chèn vào bất cứ chỗ nào hàm  được goi.   Chương trình sẽ lớn hơn chút ít  Nhưng nhanh hơn , không dùng stack– 4 bước khi 1  hàm được gọi …      7 Inline functions #include   #include   using namespace std;  inline double hypothenuse (double a, double b)  {  return sqrt (a * a + b * b);  }  int main () {  double k = 6, m = 9;  // 2 dòng sau thực hiện như nhau:  cout  Static Variables  Kiểu dữ liệu Static tham chiếu tới  global hay 'static'  variables , chúng được cấp phát bộ nhớ khi dịch  compile­time. int int_array[100]; int main() {  static float float_array[100];  double double_array[100];  char *pchar; pchar = (char *)malloc(100); /* .... */   return (0);    }   9 Static Variables  Các biến khai báo trong CT con được cấp phát bộ nhớ khi ct con  được gọi và sẽ bị loại bỏ khi kết thúc ct con.   Khi bạn gọi lại CT con, các biến cục bộ lại được cấp phát và  khởi tạo lại.   Nếu bạn muốn 1 giá trị vẫn  được lưu lại cho đến khi kết thúc  toàn chương trình, bạn cần khai báo biến cục bộ của CT con đó  là static và khởi tạo cho nó 1 giá trị.   Việc khởi tạo sẽ chỉ thực hiện lần đàu tiên chương  trình được gọi và giá trị sau khi biến đổi sẽ được lưu  cho các lần gọi sau.   Bằng cách này 1 ct con có thể “nhớ” một vài mẩu tin sau  mỗi lần được gọi.   Dùng biến Static thay vì Global :   Cái hay của 1 biến  static là nó là local của CT con, =>  tránh được các side efects.      10 Stack, heap  Khi thực hiện , vùng dữ liệu  data segment của 1 chương  trình được chia làm 3 phần :   ­ static, stack, và heap data.   Static: global hay static variables  Stack data:  ­ các biến cục bộ của ct con  ­ ví dụ  double_array trong ví dụ trên.   Heap data:  ­ Dữ liệu được cấp phát động (vd, pchar trong ví dụ trên).    ­ Dữ liệu này sẽ còn cho đến khi ta giải phóng hoặc khi kết  thúc CT.     11 Macros  #define max(a,b) (a>b?a:b)  Các hàm Inline cũng giống như macros vì cả 2 được khai triển khi dịch compile  time  macros được khai triển bởi preprocessor, còn inline functions được truyền  bởi  compiler.   Tuy nhiên có nhiều điểm khác biệt:  Inline functions tuân thủ các thủ tục như 1 hàm binh thường.  Inline functions có cùng syntax như các hàm khác, chỉ có điều là có thêm từ  khóa inline khi khai báo hàm.  Các biểu thức truyền như là đối số cho inline functions được tính 1 lần.  Trong 1 số trường hợp, biểu thức truyền như tham số cho macros có thể  được tính lại nhiều hơn 1 lần.   Bạn không thể gỡ rối cho macros, nhưng với inline functions thì có thể.     12 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  giá trị ấy sau này int f(int i) { static int[] values = {0, 0, 2,3*3-3, ..., 9*9-9}; if (i < 10 && i >= 0) { int f(int i) { return i * i - i; if (i < 10 && i >= 0) } { return values[i]; ...