Code Review: .NET Application Performance

Overview: Nói đến performance là sẽ nhắc luôn đến scalability . Nghía là chương trình sẽ đảm bảo về tốc đo, hiệu suất và đáp ứng đong thời nhiều user . Mục tiêu là phải đảm bảo được về performance và scalability trước khi được deploy. Chúng ta sẽ focus vào coding techniques and design choices mà dẫn tới performance và scalabilities.

Vấn đê chung ảnh hưởng đến performance:

  • Frequent code paths: đoạn code hay dùng

  • frequent loops

  • Resource cleanup : đảm bảo resource phải được close và realease ngay khi có thể. Đảm bảo code gọi dispose hoặc close trên mỗi resource . Đảm bảo có code của finally

  • Exception : cấu trúc lại việc trao exception vì nó lien quan đến robust code để có thể maintain. Không lợi dụng việc trao ngoại lệ để tạo nên flow chương trình, ngoại lệ chỉ sư dụng vì ẽxception.

Không trao exception trong vòng lặp

Sư dụng try catch ở những đoạn code dễ xảy ra ẽxception

  • String management: việc concate string dễ dàng tạo những allocate ko cần thiết và làm cho gabage collector thêm việc . Do đó nên dùng StringBuilder

  • Threading: nên sử dụng common language runtime(CLR) như là thread pool, ko nên tự tạo ra thread nếu có thể. Thread chỉ nên lock một vài line code là thích hơp chứ ko nên lock toàn bộ class và method. Không sử dụng thread.abort hay thread.suúpended

Boxing : gây ra heap allocate và hành động copy bộ nhớ. Lưu ý boxing bên trong loop

I/ viêt code với clr performance

A/ memory management

1/ gọi dispose/ close mà suppose các method này trên :

Database-related classes: Connection, DataReader, and Transaction. File-based classes: FileStream and BinaryWriter. Stream-based classes: StreamReader, TextReader, TextWriter, BinaryReader, and TextWriter. Network-based classes: Socket, UdpClient, and TcpClient.

2/ làm đơn giản hệ thống các đối tượng phức tạp. Việc tạo nhiều objext sẽ phải allocate nhiều sẽ phải dùng đến gabage collector. Thế nên tối ưu các object làm đơn giản hơn và làm ít đi các object của hệ thống

3/ khi không tham chiếu nữa set object = null để gabage có thể collect

4/ catch dữ liệu dùng weak reference : ko thích hợp dùng với object small nên dùng với size medium hoặc large

B/ gọi rõ ràng Gc. Collect

C/ Dùng finallize

1/ chỉ implement finallize cho những object mà giữ những resource không được manage qua các cuộc gọi

2/ lớp cung cấp finallize cũng implement IDisposable

3/Phương thức Dispose có an toàn khi gọi nhiều lần mà ko gây ra ngoại lệ. Check đảm bảo code bạn throws ObjectDisposeException

4/method dispose của bạn có gọi method dispose từ lớp base

5/ check code finallize của bạn đơn giản chỉ release source chứ không thiết lập hành động hỗn hợp nào khác

D/ Loop và recursion

1/ lặp lại việc truy cập các thuộc tính

2/ sử dụng đe quy: nếu phải sử dụng thì nên set maximine số lần xảy ra đe quy

3/sử dụng for thay vì foreach

4/ kiểm tra code bên trong vòng lặp : kiểm tra concate string có sử dụng Stringbuilder ko, có sử dụng exception trong loop ko? Có gọi thuộc tính thiết lập những action phức tạp ko. Tất cả đieu nay đều ảnh hưởng đến performance

E/ string operation

1/phải dùng stringbuilder ko dùng concate nếu cỡ append là ko xác đinh được

2/ check lệu có thiết lập case insentive khi so sánh chuỗi. Việc gọi ToLower rồi compareString sẽ phải trả giá đắt đặc biệt bên trong vòng lặp

F/ exception handling

1/ nên catch exception mà bạn không thể handle

2/ check liệu code của bạn không sử dụng việc trao exception để tiến hành một logic application. Được phép su dụng bool để chẹck faillure hay success

3/ Dùng finally block để đảm bảo resource được free

4/ tránh dùng try/ catch bên trong vòng lặp

G/ Arrays

1/ sử dụng strongly type arays để tránh boxing

Ví dụ nên sử dụng

int[] arrIn = new int[10]; Thay vì : Object[] arrObj = new Object[10];

2/ tránh dùng mảng đa chiều

H/ Collection

1/ enummerate sử dụng foreach sẽ tăng performance hơn là sử dụng for đơn giản

2/ nếu collection size là dinamically thì nên thiết lập số tối đa cho size

ArrayList ar = new ArrayList (43);

3/ nếu sử dụng arraylist

Lưu data strongly type để tránh boxing và unbox

khối lượng dữ liệu lớn lưu ở hastable , nhỏ hơn nên lưu ở ListDictionary

I/ threading

1/ nên tránh tạo ra thread , nên sử dụng CLR thread pôl. Việc tạo ra nhiều thread mới dẫn đến vấn đề context, allocate memory và extra clean up khi thread die.

2/ gọi thread.resume hoacj thread.suspend để syncronize hoạt động của đa thread có thể dẫn tới deadlock.

3/ hạn chế sử dụng keyword volatile vì nó không có ý đam bảo safety thread

F/ Asynchronus processing

1/ mỗi cuộc gọi BeginInvoke đảm bảo gọi EndInvoke để tránh résource leak

G/ Seriallization

1/ seriallize properties một cách thích hợp. Ví dụ đa có field "date of birth" thì thôi không nên serriallize thêm trường gọi là "age" nữa . Vì field "Age" có thể computed được từ field "Date Of Birth"

2/ Chỉ nên Serializable and NonSerialized trên các attributes thôi, không nên implements Class với ISerializable vì như vậy sẽ phải take care và maintain cho code serialize của bạn.

K/ Reflection and Late Binding

1/ Tránh sử dụng trong loop và recursive methods :

2/ reflection được dùng để tạo ra các controls và hook các event handle . Việc cắt giảm các control làm cho page nhanh hơn

3/Framework APIs như Object.ToString dùng reflection. Implement ToString trên loại custom của bạn để tránh điều này.

4/Việc dùng late binding : a variable là late bound nếu nó được declare như là Object hoặc nó không có kiểu rõ ràng

Những object early-bound có performance tốt hơn late-bound objects .

Sub AddOrder() Dim dataclass As Object = New DAOrder ' Dim dataclass as DAOrder = New DAOrder will improve performance ' Do other processing End Sub


All Rights Reserved