Lập trình hiệu năng - viên ngọc của tư duy lập trình

Liên hệ QC

rongreu

Thành viên mới
Tham gia
1/10/06
Bài viết
5
Được thích
3
Bài này mình post vào mục lập trình nhưng không có quyền nên post tạm đây vậy.

Lập trình hiệu năng viên ngọc của tư duy lập trình
Câu hỏi
Trong các tệp Excel quản l‎ý thông tin, quản lý kho hàng, tiêu thụ hay bất cứ vấn đề gì của tôi khi mới lập thì chạy rất tốt. Nhưng ngày nào đó, tự nhiên tốc độ tính toán chậm như rùa bò. Khi nhập dữ liệu vào 1 cell rồi enter thì tại thanh statusbar cứ hiện từng % tính toán rất chậm. Tôi phải bỏ chế độ tính tự động thì hết nhưng không refresh được các ô công thức. Không riêng trường hợp kích thước tệp tin quá lớn mà cả khi tôi chép thang2 sang thang3 rôi xóa hết phát sinh chỉ để Danh mục hàng thì hiện tượng này vẫn có. Nhờ chỉ giùm lý do và cách xử lý lỗi này.

Trả lời
Nếu bạn xài excel 2003, giới hạn lý thuyết là 65,536 dòng và 256 cột. Nhưng thực tế khi dữ liệu lên đến 5,000 dòng là máy bắt đầu cà giựt rồi. Mình nghĩ file của bạn hồi mới thì dữ liệu còn ít nên nó chạy ngon/nhanh. Nhưng càng về sau dữ liệu càng nhiều, càng ì ạch là chuyện thường tình.

Vấn đề này cũng có thể do bạn lập trình hay sử dụng các công thức chưa được hiệu năng.
Các công thức sau sẽ làm cho bạn xử l‎y chậm đi và tạo một rủi ro lớn trong các liên kết
  • Liên kết các sheets quá nhiều
  • Sử dụng công thức mảng
  • Sử dụng các vùng đặt tên quá nhiều
  • Tạo các liên kết bên ngoài
  • Công thức bị vòng lặp
  • Quá trình xử l‎ý có sử dụng bộ nhớ đệm nhiều như các thao tác Copy, tạo vùng tính đệm
  • Vì tốc độ chậm có thể có nhiều lý do kể cả lý do phần cứng nữa.
  • File excel nhiều lúc bị như vậy là do virus làm file lớn lên và dẫn đến chậm bạn có thể quét virus thử.
  • Không nên quá lạm dụng Excel vào những công việc pro. Xét cho cùng, nó cũng chỉ là một trong những ứng dụng của Microsoft Office thôi, không phải phần mềm chuyên biệt.
Hậu quả của nếu không chú các vấn đề trên
Treo máy
Excel bị đứng


Nếu muốn giải quyết triệt để vấn đề về tối ưu tốc độ bạn phải phối hợp nhiều ngôn ngữ như VB, DosBatch, C Sharp, VBS, … Đặc biệt ở mức cao là phải biết tinh giản code và luôn tính đến yếu tố hiệu năng. Ngoài ra, lập trình hiệu năng thuật toán phải sử dụng cấu trúc phân tán, tránh các vòng lặp các hàm đệ quy không cần thiết, các quá trình giải phóng bộ nhớ. Quá trình lập trình hiệu năng là mức thượng thừa trong lập trình rồi. Quá trình làm việc và sự tinh tế ‎, sáng tạo của bạn sẽ cho bạn nhưng kinh nghiệm đó chứ sách vở chỉ có thể khái quát hóa vấn đề chứ các mức tinh tế riêng biệt thì bạn phải vào thực tế mới nhận ra được. Thông thường người lập trình chỉ chú ý đến thực hiện được và giải quyết được vấn đề chứ không hề để ý đến vấn đề này. Bài toán chỉ xuất hiệu khi khi tính toán liên tục ở tần suất lớn, liên tục, các thực hiện các phép tính phức tạp. Chưa kể khi bạn thực hiện xử lý với khối lượng dữ liệu lớn và vượt quá mức bộ nhớ đệm của Excel cũng như công thức thuộc dạng quản l‎‎ý mảng riêng biệt sẽ làm cho chương trình của bạn bị treo và đứng lại ngay. Trên đây là những tóm tắt mà mình đã đã trải qua và lập trình xử l‎‎ý những vấn đề này. Để đạt được vấn đề trên bạn sẽ thấy mình không bị khống chế bởi công nghệ vì nếu xử l‎‎ý các vấn đề lớn, dữ liệu nhiều mà thực hiện trên máy tính bình thường là một sự thể hiện tính uyển chuyển, hiểu thấu đáo để tăng tốc quá trình xử l‎‎ý mà dường như chúng ta chỉ nghĩ rằng chỉ làm được trên máy tính siêu lớn hoặc không thể thực hiện được trên một ngôn ngữ đơn giản nào đó. Ví dụ như ngôn ngữ Dos batch mà thực hiện thì rất nhanh chóng nhưng cũng ít ai để ‎‎ý bởi vì ai cũng theo cái mới chứ không hề để ‎ý vấn đề hiệu năng.

Rongreu - NDP
 
Đồng ý dử liệu càng nhiều thì càng chậm
Đồng ý việc nhanh chậm phụ thuộc nhiều vào thuật toán...
Nhưng... Nhiều là nhiều cở bao nhiêu thì nó sẽ chậm ???
he... he...
5000 dòng dử liệu thì là cái đinh gì chứ

Mơ hồ và khó hiểu quá!
Thế bạn khuyên nên cho dử liệu cở bao nhiêu là vừa đủ ???
Hi.. hi...
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
30.000 và số tính toán khoảng 5000 biến, ngoài ra còn các hàm tính toán từ các phân hệ xử lý thống kê, dự báo, tối ưu hóa, chart, các hàm riêng biệt trong toán tài chính như ARIMA, mô phỏng. Số lượng file cần xử lý lên đến 200.000 file cho đến vô số. Chưa kể tạo cấu trúc suy luận ảo. Bạn nghĩ nó đã nhiều chưa

Mình không có ý bảo là bao nhiều là đủ mà là cách xử lý nó đối với bài toán lớn và phức tạp. VÍ dụ như trong lĩnh vực chứng khoán thì các phép tính toán ở trên đều có trong từng chứng khoán chưa kể còn có thêm phân tích kỹ thuật, dự báo, định giá chứng khoán, xếp hạng và nhóm lại thành một group rồi còn cả báo cáo tự động cho từng cái. Mọi cái thật phúc tạp nếu mình không để ý đến những cái mình đã trình bày trên.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình không có ý bảo là bao nhiều là đủ mà là cách xử lý nó đối với bài toán lớn và phức tạp. VÍ dụ như trong lĩnh vực chứng khoán thì các phép tính toán ở trên đều có trong từng chứng khoán chưa kể còn có thêm phân tích kỹ thuật, dự báo, định giá chứng khoán, xếp hạng và nhóm lại thành một group rồi còn cả báo cáo tự động cho từng cái. Mọi cái thật phúc tạp nếu mình không để ý đến những cái mình đã trình bày trên.

Bạn cho mình ví dụ(file đính kèm) minh họa về sự so sánh của bạn được không vậy. Ví dụ cùng một công dụng mà làm theo những điều bạn viết chẳng hạn, và một file làm theo lối thông thường chẳng hạn. Cảm ơn .
 
Lần chỉnh sửa cuối:
Upvote 0
TRẢI NGHIỆM


Sau một thời gian lập trình ứng dụng vào công việc của mình theo hướng tự động hóa hoàn toàn, và hướng có trí tuệ nhân tạo để thay mình làm việc mọi thứ. Tôi đã tư duy lại về vấn đề phát triển lập trình như thế nào cho có “hiệu năng”. Hiệu năng ở đây được hiểu là cả thời gian đọc lại code, chỉnh sửa code, tìm nhanh chóng, tận dụng lại nhanh, ai đọc vào cũng hiểu ở mức nắm bắt ý tưởng ngay, hiểu được luồng di chuyển, code phải nhanh chóng tìm ra lỗi, và phải đẹp.

Hiện có một số sách bàn về vấn đề này ở cách dùng chữ là phong cách lập trình. Mình nhận thấy điều này không phản ảnh đúng tinh thần của nó. Vì phong cách thì đa dạng nên không thể nói hết tinh thần của lập trình theo hướng đã niêu trên. Do đó mình đã đưa khái niệm tư duy “lập trình hiệu năng” vào để giải thích hết được cái hồn của tinh thần trên. Lập trình hiệu năng cho bất cứ ngôn ngữ lập trình nào hiện nay vẫn chưa được sự chú ý đúng mức của các nhà lập trình. Một sự cẩu thả sẽ làm bạn đau đầu trong việc tìm một lỗi ngớ ngẩn đó là chưa kể bạn làm việc nhóm. Lập trình không phải là công việc tất cả mà cái chính là ý tưởng, tính kế thừa, tính trong sáng, và tính đơn giản nhất có thể từ những cái phức tạp. Đó chính là tinh thần của một phong cách lập trình trong sáng và đạt hiệu năng cao.

Vậy từ hiệu năng đó là gì? Hiệu năng là tính hiệu quả của công việc trong 1 đơn vị khảo sát bằng thời gian. Hay khái quát rộng hơn là hiệu năng trên một tổng các đơn vị giới hạn về nguồn lực. Như vậy, chúng ta giải quyết vấn đề theo góc độ hiệu năng phải ở sự cải biến sâu rộng từ nhận thức trong tư duy. Một ví dụ đơn giản như bạn đi chơi nhưng nghĩ ra một sáng kiến có ích cũng đáng hơn nhiều người ngồi làm việc cả ngày đêm. Nhưng tính hiệu năng đó chỉ có hiệu lực khi anh ta phải sáng tạo liên tục không được nghỉ ngơi giữa chừng nếu không bị muốn bắt kịp.

Sau một số thời gian làm với ngôn ngữ đối tượng lắm chủ này mình thấy càng trở nên bối rối nếu mình không có một phương pháp khoa học hơn với mớ code viết xong.

Tôi cũng chỉ là người theo quan điểm dùng tin học trong lĩnh vực mình quan tâm để mình có thời gian thư giãn. Quá trình code tôi nhận thấy một số vấn đề cần trả lời sau:
Làm thế nào mình đọc code đã viết một cách nhanh nhất và hiểu hết các dòng lệnh trong đó? Bạn mất bao lâu để làm điều đó?
Làm thế nào để tái sử dụng nó một cách hiệu quả? Câu trả lời này sẽ đưa chúng ta đi tìm hiệu năng khai thác những gì đã có?
Tư duy thiết kế một vấn đề thực tiễn nên theo hướng tư duy nào?
Những kinh nghiệm có tính nguyên tắc trong lập trình từ những gì nhỏ nhất bạn phải tuân thủ?

Kim chỉ nang để giải quyết vấn đề là chúng ta nghĩ đến tốc độ của giải quyết và suy nghĩ kỹ trước khi làm. Chúng ta cũng sẽ từ bỏ cách tiếp cận thử và sai mà thay vào đó là một quá trình tương tác có tính hệ thống mở chặt chẽ. Có như vậy, quá trình giải quyết của chúng ta sẽ ở mức tự động hóa cao độ. Quá trình này chỉ thành công khi bạn bẫy được tất cả các lỗi có thể xảy ra.

Nhận diện các yếu tố có thể xảy ra với hệ thống trước khi bạn giải quyết một vấn đề cụ thể.

Thời gian :

Các biến cố xảy ra theo trình tự thời gian. Cho dù bạn cấu trúc như thế nào thì trình tự thời gian vẫn chi phối toàn bộ các biến cố dữ liệu, quá trình xử lý. Như vậy, bạn giải quyết vấn để ở quan điểm tự động quá một quá trình công việc thì phải chú ý đến các yếu tố bị chỉ phối này.

Không gian xử lý:

Không gian của bài toán hoàn toàn phụ thuộc vào các cấu trúc biến xử lý. Dữ liệu có lớn không? Dữ liệu động, phức tạp? Mình có thực hiện chiết xuất không? Dữ liệu được thực hiện có tính tham số, hay vừa tham số vừa đầu vào lại là kết quả cho phân hệ khác? Tư duy giải quyết vấn đề không gian xử lý phải ở mức không gian lớn và có thể co giãn được. Chỉ như thế bạn mới có một hệ theo đúng tiêu chuẩn tự động hóa hoàn toàn.

Ví dụ khi tôi loai hoay xử lý dữ liệu lớn nếu mà lập trình với bài toán cả hàng chục ngàn biến số với hạn chế về thời gian làm cho tôi ko có đường ra giải quyết. Mấu chốt vấn đề là ở đâu? Tôi nghĩ đến cấu trúc phân tán trong xử lý. Xử lý xong là giải phóng và phân tán ở cấu trúc từ dữ liệu đến xử lý. Kết quả vấn đề đã được giải quyết nếu bạn tư duy khác với thông thường.

© Nguyễn Phương Duy


Tp HCM
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Ví dụ mình chỉ rõ đối với những vấn đề từ ví dụ nhằm tạo sự thuận tiện theo dõi.
Bài toán : TÍnh tổng A một Range (vùng) nhất định

Function SumA(ByVal Value As Range)Dim Cell As RangeFor Each Cell In Value SumA = SumA + Cell.ValueNextEnd Function

Trình bày đẹp

Function SumA(ByVal Value As Range)‘ -----------------------------------------------------‘ ----------------------------------------------------- Dim Cell As Range For Each Cell In Value SumA = SumA + Cell.Value NextEnd Function


Lập trình như trên thì đã xong rồi đúng không? Tôi cũng như bạn nghĩ thế và đi qua vấn đề khác. Một ngày đẹp trời tôi lập trình kiểu khác với dữ liệu lớn thì nó đã hiện ra vấn đề thời gian. Thế là sau này

Về đối số truyền theo kiểu 25 đối số thì đâu phải là vấn đề thực tế. Bạn có ứng dụng được nó ko, khi dữ liệu lớn hơn? Khi dữ liệu được lựa chọn, hay ở tự động chọn vùng khi đã cố định, không cố định?

Test
Về test sao bạn không nghĩ đến bằng cách test truyền bằng các giá trị bằng text soạn sẵn thay vì phải gõ hàng loạt hàm thủ tục sub. Một sự lãng phí thời gian, và không hiệu quả vì test không được nhiều. Điều đó bạn phải lập trình bằng import, hay lặp từng vùng dữ liệu nếu tiếp cận theo dữ liệu động.

Lỗi thời gian
Vấn đề có hiệu năng khi xử lý hay không nếu duyệt for bằng each mỗi vùng sẽ nhanh hơn địa chỉ ô I = 1 to N nhưng sẽ bất tiện nếu tham chiếu để so sánh. Ngoài ra còn ở vùng dữ liệu N chiều thì nó sẽ thấy hạn chế ngay. Rất nhiều thứ, mình chỉ gợi ý như thế.
Lỗi không gian xử lý
Lỗi thuật toán
Trong lập trình cấu trúc hạn chế dùng goto. Lệnh này thể hiện cấu trúc logic vấn đề không được thoáng đạt. Một trong những tiêu chí lập trình là hoàn toàn triệt bỏ lệnh Goto nếu bạn muốn code của bạn ở trạng thái sáng sủa nhất. Hạn chế nó bằng bẫy lỗi logic vẫn được nhìn thoáng đạt thành cấu trúc khối.
Lỗi về vô tổ chức (1) trong trình bày code
Lỗi về vô tổ chức (2) không nghĩ kỹ trước khi làm
….

Tóm lại các bạn đối chiếu thì sẽ thấy lập trình theo hướng ĐỘNG ở nhiều mức từ dữ liệu, xử lý, test, v.v.v thì bạn đã có được một đoạn code hoàn thiện rồi đấy. Cuối cùng là tinh chế mã, tinh chế thuật toán, và mọi thứ cho đẹp như bức tranh mà thôi. Vấn đề này còn rất nhiều thời gian để viết ra cho từng loại ngôn ngữ riêng biệt. Thời gian quả là không có nhiều để viết hết.

Trở lại vấn đề chúng ta có thể khảo sát file quản lý net như sau:
Cách lập trình thời gian đếm có cần thiết ko? Vì file phải luôn gọi thời gian đếm làm vi xử lý tính liên tục, làm hạn chế khả năng xử lý của máy, hại ổ cứng trong khi nếu ta chỉ cần khảo sát thời gian vào và log ở đấy. Nếu khi chọn ko dùng nữa thì ta lấy thời gian đó ghi vào EndTime. Đồng thời ra kết chuyển record đó sang sheet tính toán ngay. v.v.v Chúng ta có cần thiết phải realtime hàng loạt không. Mặc dù cách anh Tuân làm rất hay rất tuyệt nhưng suy nghĩ theo cách hiệu năng thì có vẻ hơi lãng phí? Mình chỉ nghỉ gợi ý về góc nhìn hiệu năng như thế để chúng ta có thể suy nghĩ thêm. Mình coi mã nguồn mở thấy vi phạm khá nhiều lỗi đã phân tích trên đấy. Những lỗi mình đã vi phạm đến 9 năm nay vẫn còn phải tự rút ra tự hoàn chỉnh để đúc rút thành một tập sách nhỏ để nói lên vấn đề này. Mình chỉ muốn mọi người sẽ tiếp kiệm được thời gian quý báu để làm việc khác. Mình không chuyên về IT trong IT mà là IT trong kinh doanh.

“Ngăn chặn lỗi là tiết kiệm tiền bạc, thời gian và sự sống”

Trong bài mình có đề cập về hai ví dụ mà bạn yêu cầu đấy. Các ví dụ thừong trực ở quanh ta nếu bạn chịu khó ngẫm nghĩ lại các code đó.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Quan trọng là máy tính để lâu ngày windows quá chậm, chứ dữ liệu khoảng 20Mb trong file excel vẫn chạy ầm ầm, bản thân cốt lõi là từ OS nó mà khỏe thì xử lý dữ liệu nhanh, giả sử bị nhiễm virus thì thôi rồi luôn vài trăm dòng cũng chạy chậm
 
Upvote 0
Web KT
Back
Top Bottom