so sánh dữ liệu giữa 2 datagridview và thêm vào datagridview mới nhưng quá chậm

Em code để so sánh cột 1 của datagirdview1 và cột 1 của datagirdview2 rồi đổ vào datagirdview3 như dươi:

for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
for (int j = 0; j < dataGridView2.RowCount - 1; j++)
{
if(dataGridView1[0, i].Value.ToString()==dataGridView2[0, j].Value.ToString())
{
string[] row={ dataGridView1[0, i].Value.ToString() };
dataGridView3.Rows.Add(row);
}
}
}

Nếu j < 300 thì chạy ổn, nhưng nếu lớn hơn thì cứ đứng máy. Ở đây dữ liệu của dataGridView1 và dataGridView2 đều hơn 10.000 dòng.
Anh chị nào rành về c# hướng dẫn xử lý code giúp em để em xử lý nhanh hơn. Em cảm ơn !
 

snowolf901

Tuyết Lang
cho việc xử lý vào 1 thread, như thế nó sẽ chạy ngầm.
ngoài ra, nên load tất cả dữ liệu 2 bảng 1 và 2 ra List<Object>
tạo 1 list rỗng kiểu data của grid 3, rồi đổ dữ liệu cần chèn vào grid 3 vào đấy.
xử lý xong hết, đem dữ liệu của list đó add range vào grid 3 1 lượt

nếu muốn tính trường hợp nhiều dữ liệu hơn thì có thể chia ra từng block 100 row 1 lần, hoặc 1000 row...
 

tengiday

Happy life
Mình ko biết ngôn ngữ này, nhưng mình nghĩ nó cũng có những data structure như C++ vậy. Cách làm của bạn có độ phức tạp O(n^2), tức là 10^8, đó là chưa kể so sánh chiều dài của string.
Tại sao ko đưa toàn bộ data của dataGrid2 vào HashSet rồi quét từ dataGrid1 kia; sau đó so sánh rồi xuất ra dataGrid3? Vì dữ liệu tối đa là 10^4 nên phép so sánh trên HashSet đảm bảo O(1). Cách này chỉ có độ phức tạp O(n), hoặc cùng lắm là O(n log n) nếu dùng tree implementation.

Mình có cảm giác ko lẽ các bạn dùng ngôn ngữ cấp cao chỉ biết "sức trâu" mà ko dùng thuật toán; phải chăng đây là nguyên nhân software ngày nay càng lúc càng chậm?
 
Sửa lần cuối:

snowolf901

Tuyết Lang
Anh có thể nói rõ hơn giúp em. Em mới mày mò về món này nên chưa hiểu nhiều về c#.
ý tưởng thôi mà bạn :D
về cơ bản code của bạn ko sai, nhưng hiệu suất sẽ bị chậm. tăng hiệu suất có nhiều cách, kinh nghiệm của bạn tăng thì sẽ tự biết cách cải thiện.
Còn về thread thì bạn phải tìm hiểu sâu về đa luồng trong C#, nó khá hại não :)
 

snowolf901

Tuyết Lang
Mình ko biết ngôn ngữ này, nhưng mình nghĩ nó cũng có những data structure như C++ vậy. Cách làm của bạn có độ phức tạp O(n^2), tức là 10^8, đó là chưa kể so sánh chiều dài của string.
Tại sao ko đưa toàn bộ data của dataGrid2 vào HashSet rồi quét từ dataGrid1 kia; sau đó so sánh rồi xuất ra dataGrid3? Vì dữ liệu tối đa là 10^3 nên phép so sánh trên HashSet đảm bảo O(1). Cách này chỉ có độ phức tạp O(n), hoặc cùng lắm là O(n log n) nếu dùng tree implementation.

Mình có cảm giác ko lẽ các bạn dùng ngôn ngữ cấp cao chỉ biết "sức trâu" mà ko dùng thuật toán; phải chăng đây là nguyên nhân software ngày nay càng lúc càng chậm?
bởi thuật toán là 1 thứ ko phải ai cũng áp dụng được. và số lượng chức năng cần giải quyết quá nhiều ko cho phép đủ thời gian để ngồi nghĩ giải pháp về hiệu suất :)
 

tengiday

Happy life
bởi thuật toán là 1 thứ ko phải ai cũng áp dụng được. và số lượng chức năng cần giải quyết quá nhiều ko cho phép đủ thời gian để ngồi nghĩ giải pháp về hiệu suất :)
Bạn nói đúng, trong nhiều trường hợp thì productivity quan trọng hơn performance. Tuy nhiên, ngay bài này, với O(n^2) (phép xử lý lên tới 10^8) và O(n) (phép xử lý chỉ 10^4), mình tin tưởng với bất kỳ ai thì sự chênh lệch này là hoàn toàn xứng đáng để thay đổi. Khi dùng thread như cách của bạn thì số phép xử lý đâu có thay đổi, nhưng bạn chỉ làm nhiều việc một lúc.

Mình biết những cty lớn luôn luôn có ng` tối ưu về mấy đoạn code này. Câu hỏi của OP thể hiện rất rõ là đang muốn improve performance.
 
Sửa lần cuối:
Top