350 likes | 530 Views
OPTIMIZING SOURCE CODE. Thực hiện: Nhóm 24. 1. 2. 3. 5. 4. Tại sao cần tối ưu mã nguồn ?. Phương pháp tối ưu hóa giao diện. Phương pháp tối ưu hóa xử lý. Các công cụ hỗ trợ tối ưu hóa mã nguồn. Phương pháp tối ưu hóa kiến trúc. Nội dung. Tại sao cần phải tối ưu mã nguồn ?.
E N D
OPTIMIZING SOURCE CODE Thực hiện: Nhóm 24
1 2 3 5 4 Tại sao cần tối ưu mã nguồn ? Phương pháp tối ưu hóa giao diện. Phương pháp tối ưu hóa xử lý. Các công cụ hỗ trợ tối ưu hóa mã nguồn Phương pháp tối ưu hóa kiến trúc. Nội dung
Tại sao cần phải tối ưu mã nguồn ? Lập trình bằng hình thức trực quan. Mã nguồn kém tối ưu.
Tại sao cần phải tối ưu mã nguồn ? • Kỹ năng tối ưu mã nguồn là một kỹ năng rất cần thiết đối với lập trình viên. • Một đoạn mã nguồntốt sẽ tận dụng tối đa ưu điểm của ngôn ngữ và khả năng xử lý của hệ thống. • Hầu hết các trình biên dịch phổ biến hiện nay đều hỗ trợ tốt việc tối ưu mã khi biên dịch. • Tuy nhiên, để đạt hiệu quả tốt nhất, lập trình viên cũng nên tập thói quen tối ưu mã lệnh mỗi khi viết chương trình.
Tối ưu hóa giao diện • Vì sao nên tối ưu hoá giao diện ? • Người dùng chủ yếu tương tác với hệ thống thông qua giao diện • Chương trình phải có bố cục chặt chẽ. • Chương trình phải tiện dụng, thân thiện, dễ hiểu và dễ sử dụng. • Chương trình phải có tính thẩm mỹ cao, tạo ấn tượng đối với người dùng. • Giao diện như thế nào gọi là tối ưu ?
Tối ưu hóa giao diện • Một số chuẩn–quy ước khi thiết kế giao diện: • Các ứng dụng đầu tiên nên có hiển thị giới thiệu về ứng dụng. • Hầu hết các màn hình, hộp thoại nên có các nút Minimize, Restore, Close. • Icon ứng dụng phải thích hợp thể hiện được chức năng mà nó có thể làm. • Tất cả các màn hình hộp thoại cần phải có chú thích thích hợp theo ngữ cảnh sử dụng. • … (trích GUI Testing Handbook )
Tối ưu hóa giao diện • Phương pháp chung: • Tuân theo các chuẩn về giao diện trong quá trình thiết kế. • Trong quá trình lấy yêu cầu, sử dụng các prototype sẽ giảm thiểu rủi ro trong quá trình thiết kế giao diện. • Thiết kế giao diện có thể thay đổi tuỳ theo mục đích của người sử dụng. • Kiểm thử giao diện bằng các checklist. • Kiểm thử giao diện trên số lượng lớn người sử dụng và thu thập ý kiến phản hồi.
Tối ưu hóa thuật toán. Tối ưu hóa dữ liệu. Tối ưu hóa xử lý
Tối ưu hóa thuật toán • Đơn giản hóa các biểu thức toán học. • CPU sẽ xử lý phép toán cộng, trừ nhanh hơn nhân, chia. • CPU xử lý tính toán với số nguyên (integer) chậm hơn số thực (float, double). • Trong một số trường hợp nhân/chia số nguyên, sử dụng toán tử dời bit (bit shifting) sẽ nhanh hơn. • VD: A *= 128 A <<= 7 • Trong C/C++, ta có thể tối ưu bằng cách dùng trực tiếp Assembly trong code như sau: __asm shl A,7;
Tối ưu hóa thuật toán • Tối ưu việc sử dụng biến tạm • Sử dụng biến tạm sẽ làm giảm tốc độ tính toán. • Để hạn chế điều này, ta nên tách các biểu thức phức tạp thành các biểu thức nhỏ gọn hơn. • VD: Bài toán hoán vị 2 số A = 7; B = 8 (int) A = A^B; B = A^B; A = A^B; int temp = A; A = B; B = temp; A = A + B; B = A - B; A = A – B; • Các trình biên dịch ngày nay đã hỗ trợ các cơ chế giúp tối ưu chương trình theo cách này khi biên dịch mã lệnh.
Tối ưu hóa thuật toán • Tối ưu các biểu thức điều kiện và luận lý. • Những điều kiện dư thừa có thể làm chậm việc tính toán và gia tăng kích thước mã lệnh. • Đưa ra các điều kiện có xác xuất xảy ra cao nhất, và tính toán nhanh nhất lên đầu biểu thức. • VD : • Biểu thức logic: ((A||B) && C) (C && (A||B)) • Kiểm tra một giá trị thuộc 1 miền giá trị cho trước: if (p <= max && p >= min && q <= max && q >= min) { //thực hiện khi thoả miền giá trị } else { //thực hiện khi không thoả miền giá trị } if (p > max || p < min || q > max || q < min) { //thực hiện khi thoả miền giá trị } else { //thực hiện khi không thỏa miền gt }
Tối ưu hóa thuật toán • Tối ưu các biểu thức điều kiện trùng lặp. if ((mydata->MyFunc() ) < min) { // ... } else if ((mydata->MyFunc() ) > max) { // ... } int temp_value = mydata->MyFunc(); if (temp_value < min) { // ... } else if (temp_value > max) { // ... }
Tối ưu hóa thuật toán • Tối ưu các vòng lặp. • Việc lạm dụng các vòng lặp là 1 nguyên nhân làm giảm tốc độ chương trình. • Đối với vòng lặp có số lần lặp nhỏ, ta không nên dùng vòng lặp. • Đối với các vòng lặp phức tạp, cần hạn chế việc cấp phát các biến nội bộ và các phép tính lặp lại bên trong vòng lặp mà không liên quan đến biến đếm lặp. • Đối với vòng lặp từ 0 đến n phần tử, nên thực hiện việc lặp từ giá trị n trở về 0 • Nên sử dụng ++i (--i) thay vì i++ (i--)
Tối ưu hóa thuật toán • Tối ưu các vòng lặp. • VD: int students_number = 10000; for( int i = 0; i < students_number; i++ ) { //hàm MyFunc mất nhiều thời gian thực hiện double sample_value = MyFunc(students_number); CalcStudentFunc(i, sample_value); } int students_number = 10000; double sample_value = MyFunc(students_number); for( int i = 0; i < students_number; i++ ) { CalcStudentFunc(i, sample_value); }
Tối ưu hóa dữ liệu Sự trừu tượng hóa dữ liệu • Là tiến trình xác định, nhóm các thuộc tính và các hành động liên quan đến một thực thể đặc thù, xét trong mối tương quan với ứng dụng đang phát triển. • VD: Ứng dụng bán xe • Thuộc tính Tên, Số lượng xe bán được, Tiền hoa hồng • Hành động Nhập tên nhân viên bán xe Nhập số lượng xe Tính tiền hoa hồng … • Đâu là những thuộc tính và những hành động cần thiết cho một vấn đề đặt ra?
Tối ưu hóa dữ liệuSự trừu tượng hóa dữ liệu • Thuận lợi: • Tập trung vào vấn đề. • Xác định những đặc tính thiết yếu và những hành động đòi hỏi. • Giảm thiểu những chi tiết không cần thiết. • Việc trừu tượng hóa dữ liệu là cần thiết, bởi vì không thể mô phỏng tất cả các hành động và thuộc tính.
Tối ưu hóa dữ liệuData Structure & Object • Data Structure: Phơi bày dữ liệu ra và không có định nghĩa về phương thức (functions). • Object: Ẩn dữ liệu (Data) và phơi bày ra các phương thức trên dữ liệu của nó.
Tối ưu hóa dữ liệuData Structure & Object • Code Thủ tục (Procedural code): • Sử dung Data Structure. • Dễ để thêm một function vì nó không ảnh hưởng đến các Data Structure đã có. • Khó để thêm một Data Structure vì tất cả các function phải thay đổi. • Code hướng đối tượng (Object-oriented): • Sử dụng Object. • Dễ để thêm một Class vì tất cả các function của các Class đã có không thay đổi. • Khó để thêm một function vì phải thêm ở tất cả Class.
Các công cụ hỗ trợ • Memcached
DEMO MEMCACHED • Giớithiệuchung • Phânphốibộnhớ cache • KiếntrúcMemcached • DEMO càiđặtvàthựchiệncácthaotáccơbảntrênMemcached (ngônngữ PHP)
Giới thiệu chung - 1 • Free & open source được phát triển bởi Danga Interactive for LiveJournal. • High-performance, distributed memory object caching system (hệ thống cache phân phối đối tượng bộ nhớ hiệu năng cao) • Nó chỉ là bộ lưu trữ các record “key-value” (lấy từ việc đọc DB, từ các hàm gọi API, ...) trong bộ nhớ chính. • Hướng sử dụng: tăng tốc cho các ứng dụng web động bằng việc giảm tải cơ sở dữ liệu thông qua việc lưu trữ bản sao các đối tượng (objects) và dữ liệu được truy cập nhiều lần trong RAM để giảm thiểu số lần phải đọc từ nguồn dữ liệu ngoài (database, xml, …).
Giới thiệu chung - 2 • Thiết kế đơn giản của nó đẩy mạnh quá trình tiển khai, phát triển dễ dàng và giải quyết được nhiều vấn đề liên quan đến lượng dữ liệu lưu trữ lớn. • Đa số ngôn ngữ đều có các hàm API hỗ trợ cơ chế Memcached. • Hầu hết các trang web lớn trên thế giới như: Youtube, Facebook, Wikipedia, Flickr, Twitter…đều sử dụng.
Phân phối bộ nhớ Mỗi server thực thi nhiệm vụ hoàn toàn độc lập nhau. • Chỉ dùng được tối đa là 64MB cache. Tất cả các server làm việc trên một vùng logic chứa bộ nhớ chung cho tất cả. • Mỗi item nhất định được lưu trữ và luôn được lấy từ cùng 1 vị trí trên toàn bộ website. • Tổng kích thước cache sử dụng tăng gấp đôi.
Kiến trúc hệ thống - 1 • Hệ thống sử dụng kiến trúc server-client: • Server: quản lý mảng các “key-value” • Client: thao tác trên mảng “key-value” và try vấn trên nó.
Kiến trúc hệ thống - 2 • Cơ chế liên lạc Client-Server: • Client liên lạc với Server qua tên và port của dịch vụ (mặc định là 11211). • Nếu một client muốn set hay get một giá trị tương ứng với một key nào, đầu tiên dựa vào key tính toán ra một “hash of key” để xác định server nào đang giữ giá trị của key đó liên lạc với server. • Server sẽ tính toán 1 “hash of key” thứ hai để quyết định vị trí để lưu trữ hay đọc giá trị tương ứng. • Nếu tất cả các thư viện sử dụng trên client có cùng một thuật toán “hashing” (băm) để xác định server thì các client có thể đọc được các dữ liệu được cached từ các client khác lý tưởng.
Hướng dẫn cài đặt • Cài đặt cho WINDOWS • Cài đặt để sử dụng cho ngôn ngữ PHP
Cài đặt trên WINDOWS • Tải về memcached-win32 • Cài đặt: • Giải nén và chép memcached.exe vào một thư mục (C:\memcached chẳng hạn). • Để cài đặt dùng lệnh (chạy từ commandline) C:\memcached\memcached.exe -d install • Để start dịch vụ: C:\memcached\memcached.exe -d start
Cài đặt trên cho PHP • Chép tập tin php_memcache.dll vào thư mục chứa Extensions của PHP. Nếu chưa có tập tin trên có thể tìm và download phiên bản phù hợp với phiên bản PHP. • Tìm file cấu hình php.ini của PHP và thêm vào: extension=php_memcache.dll. • Khởi động lại Apache. • Hoàn thành. Có thể sử dụng Memcached.
Q & A ?