Sử dụng Stopwatch so sánh tốc độ xử lý trong .Net

Test ứng dụng có lẽ là việc không còn xa lạ với lập trình viên, đặc biệt là các tester để xử lý lỗi, so sánh tốc độ xử lý… Việc viết Unit Test có thể không phải lập trình viên nào cũng có thể làm tốt và hiệu quả được, việc viết test sẽ đảm bảo chương trình của bạn tốt hơn, ít lỗi hơn, tốc độ xử lý cải thiện hơn khi sử dụng các thuật toán, loại dữ liệu, hàm chức năng phù hợp.

Trong phạm vi bài viết mình không nói về Unit Test trong việc kiểm tra, so sánh tốc độ xử lý của chương trình, hàm chức năng nào đó? Mà mình muốn nói đến Stopwatch. Đúng vậy, bằng cách viết 1 đoạn mã ngắn gọn như sau là mình đã có thể kiểm tra được tốc độ xử lý tương đối giữa các thao tác xử lý một đoạn mã lệnh.

Ví dụ sau mình dùng Stopwatch để test kiểm tra hiệu suất khi sử dụng Generic collection và non-Generic collection trong việc lưu trữ dữ liệu vào mảng dạng danh sách. Bạn có thể viết đoạn mã này vào sự kiện click của button để kiểm thử.

Sử dụng Stopwatch so sánh tốc độ xử lý trong .Net Csharp
Sử dụng Stopwatch so sánh tốc độ xử lý trong .Net Csharp

Stopwatch wt = new Stopwatch();
string tmpStr=string.Empty;
List ListGenerateCollection=new List();
ArrayList ListNonGenerateCollection=new ArrayList();
wt.Start();
for (int i = 0; i < 10000; i++)
{
    ListGenerateCollection.Add(i.ToString());
}
wt.Stop();
tmpStr+="List: "+wt.Elapsed.ToString()+"\r\n";

wt.Reset();
wt.Start();
for (int i = 0; i < 10000; i++)
{
    ListNonGenerateCollection.Add(i);
}
wt.Stop();
tmpStr+="ArrayList: "+wt.Elapsed.ToString()+"\r\n";
MessageBox.Show(tmpStr,"^^");

Kết quả hiển thị sau khi chạy ứng dụng cho thấy sử dụng Generic Collection (các tập hợp định kiểu strong-type, kiểu dữ liệu mạnh) trong .Net tốc độ xử lý nhanh hơn so với Non-Generic Collection (các tập hợp không định kiểu: object). Tuy nhiên, đây chỉ là ví dụ để so sánh tốc độ xử lý tương đối, còn việc sử dụng Generic collection hay non-Generic collection nó phụ thuộc vào yêu cầu của chương trình cũng như loại dữ liệu yêu cầu.

Bạn có thể sử dụng đoạn mã trên để kiểm tra quá trình load dữ liệu, so sánh function (ví dụ tốc độ xử lý giữa SubString và Remove), hay loại xử lý mà trong đó KHÔNG phải phụ thuộc vào độ trễ của tiến trình, các tác nhân không thể kiểm soát điều kiện hiệu suất chính xác như: kết nối internet, cơ sở dữ liệu. Đối với các trường hợp này đòi hỏi phải viết unit test và các phương thức test phức tạp hơn.

Để thực sự test hiệu suất thuật toán, giải pháp nào tối ưu hơn trong quá trình phát triển ứng dụng đòi hỏi rất nhiều yếu tố. Stopwatch dù có thể kiểm thử nhanh hiệu suất các phương thức để lập trình viên lựa chọn sử dụng nhưng chỉ đáp ứng ở các phương thức, ứng dụng đơn giản. Ngược lại, bạn nên tìm hiểu và viết test song song sẽ đáp ứng các kết quả hiệu suất, phát triển ứng dụng, xử lý lỗi tốt hơn. Bạn an tâm là viết Unit Test cũng không quá phức tạp đâu.

XEM THÊM

Trả lời