Dictionary & Collection ?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,214
Xin chào các Bạn,
Đầu xuân chúc mọi người luôn mạnh khỏe & bình an.
----
Như tiêu đề OT đã nêu, OT có đọc bài viết của Bạn Collection @befaint nhưng có lẽ do kiến thức còn hạn hẹp nên chưa thể hiểu hết về sự khác biệt giữa Dictionary & Collection,
Ví dụ trong 2 đoạn code dưới đây sử dụng Dictionary & Collection cho cùng một công việc:
Mã:
Option Explicit

Sub CollectionFilter()
Dim TT As Double
TT = Timer
Dim myCol As Collection
Set myCol = New Collection
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If KeyExists(myCol, sKey) = False Then
                j = j + 1
                myCol.Add j, sKey
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            Else
                Result(myCol.Item(sKey), 4) = Result(myCol.Item(sKey), 4) + ArrData(i, 3)
             End If
        End If
    Next i
    If j > 0 Then
        .Range("M2").Resize(100, 4).ClearContents
        .Range("M2").Resize(j, 4) = Result
        .Range("Q7") = Timer - TT
    End If
End With


End Sub


Sub DictionaryFilter()
Dim TT As Double
TT = Timer

Dim Dic As Object
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If Not Dic.Exists(sKey) Then
                j = j + 1
                Dic.Add sKey, j
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            Else
                Result(Dic.Item(sKey), 4) = Result(Dic.Item(sKey), 4) + ArrData(i, 3)
            End If
        End If
    Next i
    If j > 0 Then
        .Range("H2").Resize(100, 4).ClearContents
        .Range("H2").Resize(j, 4) = Result
        .Range("L7") = Timer - TT
    End If
End With

End Sub
Trên máy tính của OT có vẻ như Collection nhanh hơn Dictionary :
1613618736712.png

Nhờ các bạn chỉ dẫn cho OT hiểu rõ thêm trong trường hợp nào thì dùng cái nào sẽ tối ưu hơn?
Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
 

File đính kèm

  • Collection.xlsb
    1.2 MB · Đọc: 13
Lần chỉnh sửa cuối:
Dạ Bác, nếu chỉ có danh mục mã hàng thôi thì số key duy nhất con làm việc không quá 10 000 , còn nếu liên quan mã và ngày tháng thì số lượng key duy nhất có lẽ cũng không vượt quá 100 000 ạ. Con test thử kết quả như sau Bác, thử chạy mấy lần thì trên máy của con Dic vẫn chậm hơn Col một chút Bác ạ (con đính kèm tập tin Bác xem ạ):
View attachment 254326
Ở chỗ môi trường con làm việc nếu dữ liệu lớn (ví dụ là 1triệu như thế này ) mà thời gian nhanh chậm không quá 30 giây thì là chuyện bình thường thôi ạ.
Bài 45 chẳng nói là càng ít càng giảm, 100.000 còn thua, đến 50.000 keys mới qua mặt mà

Theo như bảng này của Chú Mỹ thì với con nếu làm việc với dữ liệu thông thường trên Excel thì con thấy cột E là phù hợp nhất chọn Dic để thực hành là tốt nhất vừa nhiều chức năng vừa nhanh.
70.000 cũng qua mặt 1 bánh xe
 
Upvote 0
Bài 45 chẳng nói là càng ít càng giảm, 100.000 còn thua, đến 50.000 keys mới qua mặt mà
Bài đã được tự động gộp:


70.000 cũng qua mặt 1 bánh xe

Bài 45 chẳng nói là càng ít càng giảm, 100.000 còn thua, đến 50.000 keys mới qua mặt mà


70.000 cũng qua mặt 1 bánh xe
Sau khi test xong con mới đọc lại thấy bài của Chú, trong giờ làm thi thoảng con chỉ lướt lướt thôi, cảm ơn Chú Mỹ đã test thử và chỉ ra mấy trường hợp ạ.
Con đi ăn đã sau đó sẽ trả lời Chú Mỹ ở kênh bên kia ạ.:p
 
Upvote 0
Trong chăn mới biết có nhóc gì. :)
Câu chuyện dữ liệu lớn và lớn, dùng Excel/ Google sheets giờ đây phổ biến rồi.
Rất tiếc là công nghệ phát triển cấp số nhân nhưng việc phát triển trí tuệ của người dùng lại không "phổ biến" như bạn hy vọng.
Dữ liệu lớn nhưng khả năng tư duy người dùng không lớn theo.
Để bù đắp khả năng tư duy, đáng lẽ con người phải cố tâm học hỏi và làm việc hơn. Thay vì vậy, người ta lợi dụng công nghệ mạng xã hội để nhờ người khác học và làm giùm mình từ a đến z.
Cứ nghe những câu "làm nhiều thủ cong sợ sai", "làm thủ công chắc em chết mất", vân vân thì biết cái "phổ biến" bạn nói trên chỉ là lý tưởng.
 
Upvote 0
Rất tiếc là công nghệ phát triển cấp số nhân nhưng việc phát triển trí tuệ của người dùng lại không "phổ biến" như bạn hy vọng.
Dữ liệu lớn nhưng khả năng tư duy người dùng không lớn theo.
Để bù đắp khả năng tư duy, đáng lẽ con người phải cố tâm học hỏi và làm việc hơn. Thay vì vậy, người ta lợi dụng công nghệ mạng xã hội để nhờ người khác học và làm giùm mình từ a đến z.
Cứ nghe những câu "làm nhiều thủ cong sợ sai", "làm thủ công chắc em chết mất", vân vân thì biết cái "phổ biến" bạn nói trên chỉ là lý tưởng.
Vâng anh.
Cũng theo xu thế đó, giờ cũng là lúc phân hóa rõ rệt, một bên là những người chịu thay đổi, học hỏi, một bên là luôn có sẵn lý do để từ chối.
 
Upvote 0
theo dõi diết thấy chủ thớt khoãng 1 năm lại đây cũng chịu cày code ghê đấy chứ....
cũng ko đến nổi như người khác vác trỏng tre ra gốc cây sung ngồi hóng mát :D :D :D
 
Upvote 0
Dạ Bác, nếu chỉ có danh mục mã hàng thôi thì số key duy nhất con làm việc không quá 10 000 , còn nếu liên quan mã và ngày tháng thì số lượng key duy nhất có lẽ cũng không vượt quá 100 000 ạ. Con test thử kết quả như sau Bác, thử chạy mấy lần thì trên máy của con Dic vẫn chậm hơn Col một chút Bác ạ (con đính kèm tập tin Bác xem ạ):
View attachment 254326
Ở chỗ môi trường con làm việc nếu dữ liệu lớn (ví dụ là 1triệu như thế này ) mà thời gian nhanh chậm không quá 30 giây thì là chuyện bình thường thôi ạ.
Thế thì tùy system. Trên máy tôi Windows 10 64 bit 1.60 GHz RAM 4 GB + Excel 2013 32 bit thì kết quả như hình. Rõ ràng đít sần cho collection và hashtable biết thế nào là lễ độ.
Trong video đính kèm tôi kéo thanh trượt trong VBE chậm để mọi người kiểm tra code để tránh nghi ngờ là tôi sửa lại code.

tocdo.jpg


Máy bạn nhanh tới mức nào? Và phiên bản Excel? Phiên bán của tôi củ chuối là 2013 32 bit.
Ngoài ra với cỡ 100 000 key DUY NHẤT thì cả ở máy tôi và máy anh Mỹ hashtable phải lạy đít thon không mỡ bằng cụ mà ở máy bạn lại hơn đít thon một chút.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy thì có thể đúng có là rất có thể là như vậy rồi Bác ạ,
Con không nhớ rõ hay không nhưng hôm qua lúc vừa làm vừa thử code qua qua con có copy đoạn code này chạy thử thấy có chênh nhau giữa Dic & Col (Dic hơn Col như Bác đã đề cập) nhưng ko nhớ chính xác con số là bao nhiêu , hôm nay con thử lại thấy Dic lại chậm hơn một chút nên ngạc nhiên mới đầu con cũng định hỏi liệu máy móc ảnh hưởng gì đến tốc độ giữa cái kia không (giống như hiện trạng máy của Bác bây giờ đó ạ) nhưng phải kiểm tra lại code thật kỹ xem có làm đúng theo Bác chỉ dẫn hay không thậm trí khởi động lại máy tính nhưng kết quả vẫn như dữ liệu test con gửi chỉ là mỗi lần chạy số có thay đổi một chút (chênh lệch nhiều thì khoảng 1 giây giữa các lần chạy).
Giờ Bác nói con có nhớ là máy tính của con hôm nay có update cái gì đó sau đấy con bấm update rồi khởi động.
Cấu hình máy tính của con Windows 10 64 bit - hình như Ram8GB , Excel 2019 64bit, Bác ạ.
Nhưng dù gì đi nữa với ai muốn thử tìm hiểu nữa thì thử nhưng vẫn vấn đề con thấy sử dụng Dic là phù hợp cho nhu cầu của ạ, chỉ cần cố làm quen nhiều hơn cho nhớ ạ.
Bác giữ gìn sức khỏe ạ,con cảm ơn Bác.

theo dõi diết thấy chủ thớt khoãng 1 năm lại đây cũng chịu cày code ghê đấy chứ....
cũng ko đến nổi như người khác vác trỏng tre ra gốc cây sung ngồi hóng mát :D :D :D
Cảm ơn Bạn đã quan tâm,
Cũng giống như Bác Siwtom thông tin ở trên:
"Bạn hãy học cách sử dụng mọi công cụ có trong xưởng, còn dùng cái nào thì tùy vào công việc cụ thể. Hôm nay cần đào cái rãnh nhỏ trong vườn thì dùng xẻng thôi. Ngày mai cần đào móng thì dùng máy đào máy xúc"
Với môi trường của OT nếu công việc chỉ dùng cho bản thân mình thì OT có thể tìm hiểu các công cụ có sẵn tìm hiểu Google sheets, Pivot,Power query..
không phải máy tính nào cũng được cho phép kết nối mạng để sử dụng.
Và vấn đề lớn là vì các file dữ liệu thường có nhiều người sử dụng,người sau thường dùng theo những gì của người trước để lại (không mấy khi sửa đổi có thể vì không đủ kiến thức, hoặc là do qui định theo biểu mẫu..)
Nếu cứ mỗi người làm một kiểu không thống nhất thì sẽ rất là khó vì tiến độ công việc và độ chính xác là ưu tiên hàng đầu do vậy trong trường hợp một người mới khi thay công việc của người cũ có kinh nghiệm thì cũng phải làm được Bạn ạ.
Thường thì khi có động lực hoặc sự đam mê thì sẽ có sự nỗ nực..OT rất thích thú với hoạt động cải tiến,khi được cấp trên ghi nhận thì sẽ mang lại niềm tin và trao cho mình cảm hứng thêm. Hơn nữa không có ai có thể sống và giúp mình mãi như thế này được bản thân OT cũng ngại khi nhờ vả.
có điều là OT rất nhanh quên nếu không động đến là sẽ quên ngay ạ..
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu tôi nhớ ko lầm thì trên 5 Năm trước trên GPE này họ cũng đã test thử các kiểu rồi ... cuối cùng cũng phải thừa nhận Dic là số 1
Tìm loạt bài trong nick vodoi gì đó ... tính xuất nhập tồn dữ liệu khủng gì đó ... những thành viên viết bài trong thớt này ngày đó cũng có tham gia đấy
Loại bài này ko mới vì ngày xưa trên này họ đã làm và đo tốc độ các kiểu rồi ............................ ===> tìm đi là thấy
 
Upvote 0
Cảm ơn Bạn,qua việc tìm hiểu và nhận được nhiều lời khuyên của mọi người nên OT không còn ý nghĩ muốn tìm hiểu hay bàn về tốc độ hơn kém nhau với đơn vị chục giây nữa và cảm nhận của OT đã cũng đã nêu ra ở bài 80 ạ.
 
Upvote 0
- Add nhiều keys không trùng lần nào <--- kiểm tra Add key vào object;
Trong file ở bài đó làm rồi còn gì.

- Add nhiều lần 1 key <--- thử nghiệm phần kiểm tra sự tồn tại key trong object;

Const key = "key_xyz" '---> Đây là 1 key
Const num = 2000000
Dim i as long
For i = 1 to num
'kiem tra key khong co trong object '(*)
'add key vào object
object.add key, "" '---> add nhiều lần 1 key, thực ra là add có 1 lần, chỉ thử nghiệm cái dòng trên (*) thôi.
Next i.

Mình cứ đọc ---- thật ---- chậm thôi.
Giờ mạnh mới tin là thuật toán Hash table tự tạo có thể nhanh hơn Dic đấy .... @befaint có tin không ???
không phải hash khai báo xài của bill nha
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom