Trang 2/6 đầuđầu 1 2 3 4 5 6 cuốicuối
Hiển thị kết quả tìm kiếm từ 11 đến 20 trên tổng số: 56

Ðề tài: Giúp code lọc nhanh Siêu tốc độ

  1. @minhtuan55,

    Ông tướng này viết gần 200 bài rồi còn ném code ra bài viết. Cho vào thẻ CODE hoặc PHP.

  2. Trích Nguyên văn bởi befaint View Post
    @minhtuan55,

    Ông tướng này viết gần 200 bài rồi còn ném code ra bài viết. Cho vào thẻ CODE hoặc PHP.
    Ông ta ném ra cho bạn đọc chứ ông ta đâu có đọc đâu mà cần phải cải tiến. Tại bạn muốn "nâng cao tinh thần học hỏi nhau" thì phải chấp nhận vậy.
    (hồi đó tôi cũng từng bảo người viết "sửa chỗ... rồi nói chuyện tiếp" thì bị một số thành viên khác chửi là chảnh. Thực sự tôi thấy bài nào dùng font lớn và bôi đậm toàn thể là khong thèm đọc đến dòng thứ 2, cố đọc loạn thị mất)

  3. Trích Nguyên văn bởi VetMini View Post
    Ông ta ném ra cho bạn đọc chứ ông ta đâu có đọc đâu mà cần phải cải tiến. Tại bạn muốn "nâng cao tinh thần học hỏi nhau" thì phải chấp nhận vậy.
    (hồi đó tôi cũng từng bảo người viết "sửa chỗ... rồi nói chuyện tiếp" thì bị một số thành viên khác chửi là chảnh. Thực sự tôi thấy bài nào dùng font lớn và bôi đậm toàn thể là khong thèm đọc đến dòng thứ 2, cố đọc loạn thị mất)
    Em cảm ơn anh.

    Em thì bị chửi là "...kẻ cả" các kiểu luôn nhưng mà hổng có sao, hổng "ngán" ạ.

    Chúc anh một tối vui và ngon giấc!

  4. Trích Nguyên văn bởi HieuCD View Post
    Code:
    If Len(NV) <> 6 Then
      dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV
    else
      dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat)
    end if
    Viết như vầy đọc rõ hơn
    Code:
    dk = (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) ' điều kiện này chính
    If Len(NV) <> 6 Then dk = dk And (Arr(J, 5) = NV) ' nếu len <> 6 thì thêm điều kiện phụ

  5. Trích Nguyên văn bởi VetMini View Post
    Viết như vầy đọc rõ hơn
    Code:
    dk = (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) ' điều kiện này chính
    If Len(NV) <> 6 Then dk = dk And (Arr(J, 5) = NV) ' nếu len <> 6 thì thêm điều kiện phụ
    cám ơn bạn, vừa gọn vừa dể hiểu

  6. tiện thể có chủ đề này mọi người giúp đỡ em vấn đề trong file này nhé
    vấn đề là mình cần 1 hàm lọc dữ liệu (trả về mảng dữ liệu sau khi lọc) hơi bị đa năng nên mong mọi người giúp đỡ
    trong file chỉ là 1 góc trong vô vàn cách lọc, theo em thấy thì cái góc này chắc là lọc chậm nhất trong các cách nên nêu ra
    bỏ qua AutoFilter của excel nhé
    trong file là cách em tự binh biến
    nếu mọi người có tuyệt chiêu gì mong được chỉ giáo
    link Media

  7. Trích Nguyên văn bởi langtuchungtinh360 View Post
    tiện thể có chủ đề này mọi người giúp đỡ em vấn đề trong file này nhé
    vấn đề là mình cần 1 hàm lọc dữ liệu (trả về mảng dữ liệu sau khi lọc) hơi bị đa năng nên mong mọi người giúp đỡ
    trong file chỉ là 1 góc trong vô vàn cách lọc, theo em thấy thì cái góc này chắc là lọc chậm nhất trong các cách nên nêu ra
    bỏ qua AutoFilter của excel nhé
    trong file là cách em tự binh biến
    nếu mọi người có tuyệt chiêu gì mong được chỉ giáo
    link Media
    tạm liếc qua thế này

    1) VBA:chấp nhận dùng class là chậm so với module thường (đối với dạng vấn đề đang xử lý của bạn) - chỉ thuận lợi cho người viết code (khi viết và chỉnh sửa) mà thôi - cái này phải suy nghĩ đánh đổi tốc độ và thuận lợi
    2) Dictionary trong class của bạn là vô ích làm chậm đi quá trình (vì Dic.Add STT..., mà STT thì luôn khác nhau rui, đầu cần Dic làm chi??)
    3) khi tìm với Tất cả (col Tìm=0) thì thuật toán cần xem lại: nên phân biệt number và Text (cái này chưa cần với ví dụ của bạn - vì toàn Text)
    4) Việc tìm ra rồi lại list lại STT sau đó mới cho vào mảng, cũng làm chậm đi (cái này chắc không đáng kể)

    Cải thiện được 4 điều trên thì code sẽ nhanh lên nhiều
    thay đổi nội dung bởi: winvista, 16-02-17 lúc 03:43 PM

  8. Trích Nguyên văn bởi winvista View Post
    1) chấp nhận dùng class là chậm so với module thường - chỉ thuật lợi cho người viết code (khi viết và chỉnh sửa) mà thôi - cái này phải suy nghĩ đánh đổi tốc độ và thuận lợi
    cái này thì mình không biết, chủ yếu để trong class vì sau này cho vô Addins rồi mình thấy nếu viết function trong module thì lúc mình test code thì nó hay chạy mấy cái function trong module (không biết nguyên nhân)
    Trích Nguyên văn bởi winvista View Post
    2) Dictionary trong class của bạn là vô ích làm chậm đi quá trình (vì Dic.Add STT..., mà STT thì luôn khác nhau rui, đầu cần Dic làm chi??)
    Trích Nguyên văn bởi winvista View Post
    4) Việc tìm ra rồi lại list lại STT sau đó mới cho vào mảng, cũng làm chậm đi (cái này chắc không đáng kể)
    Dictionary đó mình dùng để lấy dòng thỏa điều kiện để sau đó thêm vào mảng, vì không biết được kích thước mảng kết quả nên chỉ khi hoàn thành mới khai báo và gán lại mới được, nếu có cách khác hay hơn không làm ảnh hưởng đến tốc độ thì ok, mình cứ tưởng sử dụng Dic là tốc độ "bàn thờ" rồi chứ
    Trích Nguyên văn bởi winvista View Post
    3) khi tìm với Tất cả (col Tìm=0) thì thuật toán cần xem lại: nên phân biệt number và Text (cái này chưa cần với ví dụ của bạn - vì toàn Text)
    cái này mình không biết làm sao cho tổng quát hơn được nên chỉ mới nghĩ ra như thế

  9. cái này thì mình không biết, chủ yếu để trong class vì sau này cho vô Addins rồi mình thấy nếu viết function trong module thì lúc mình test code thì nó hay chạy mấy cái function trong module (không biết nguyên nhân)
    Khó hiểu,
    Nếu cần thì đặt Private Sub/Function - để hạn chế phạm vi sử dụng hàm hay sub đó, cần nữa thì chỉ rõ tên module trong khi gọi sub/fun

    Dictionary đó mình dùng để lấy dòng thỏa điều kiện để sau đó thêm vào mảng, vì không biết được kích thước mảng kết quả nên chỉ khi hoàn thành mới khai báo và gán lại mới được, nếu có cách khác hay hơn không làm ảnh hưởng đến tốc độ thì ok, mình cứ tưởng sử dụng Dic là tốc độ "bàn thờ" rồi chứ
    Khi dùng Dic.Add key, ... --> Dic phải dò tìm xem key đó đã trùng hay chưa (trong Add method sẽ phải làm việc đó) - khi số lương keys lớn thì việc dò tìm dĩ nhiên là chậm hơn là không dò tìm rồi (dù DIC có siêu tốc hay không siêu tốc thì cũng chi phí thời gian đáng kể bị lãng phí),
    Trong bài của bạn nên đổi thành dùng Array 1 chiều lưu chỉ số i

    cái này mình không biết làm sao cho tổng quát hơn được nên chỉ mới nghĩ ra như thế
    trên tôi đã gợi ý bạn nên phân tách ra number và text là 1 cách ... Nhưng bài ví dụ hiện tại của bạn toàn text nên không ảnh hường
    ------------

    1 lưu ý mới nữa là

    5) đối với sub LOAD Data:

    + có những biến và dòng code thừa - như ArrDataU vô ích chú ý này xem lại thì thấy ArrDataU có cần dùng không phải vô ích - tuy thế có cần upcase trước thế hay không?

    + có nên chăng phải lọc trước dữ liệu của Data gốc không?, sao không nghĩ phương án chuyển thẳng Data gốc cùng ArrCotDuLieu vào thẳng code Filter (hiện trong class) để xử lý (vì trước sau ta cũng phải nhặt dữ liệu theo điều kiện Filter) -- như thế bỏ hẳn được đoạn For i for j ngốn nhiều resource (time and memory) này (khi dữ liêu lớn (số dòng ở đây) thì mỗi FOR duyệt sẽ làm tăng chi phí thời gian là đáng kể)

    -----------
    Suy nghĩ cải thiện 5 điều đó thì code mới dần nhanh được, có thể còn nhiều cái khác nữa - vì tôi mới đọc lướt lướt qua.
    thay đổi nội dung bởi: winvista, 16-02-17 lúc 04:42 PM

  10. Trích Nguyên văn bởi winvista View Post
    Khi dùng Dic.Add key, ... --> Dic phải dò tìm xem key đó đã trùng hay chưa (trong Add method sẽ phải làm việc đó) - khi số lương keys lớn thì việc dò tìm dĩ nhiên là chậm hơn là không dò tìm rồi (dù DIC có siêu tốc hay không siêu tốc thì cũng chi phí thời gian đáng kể bị lãng phí),
    Trong bài của bạn nên đổi thành dùng Array 1 chiều lưu chỉ số i
    Cái này thì có thể sửa được, thì ra Dic phải tìm nữa mới Add vô (mất thời gian chỗ này), thế mà cứ tưởng nó ok rồi.
    Trích Nguyên văn bởi winvista View Post
    trên tôi đã gợi ý bạn nên phân tách ra number và text là 1 cách ... Nhưng bài ví dụ hiện tại của bạn toàn text nên không ảnh hường
    cái này thì chưa biết giải quyết thế nào rồi, vì nếu tách text với Nunber ra thì phải thêm 1 bước kiểm tra nữa, liệu như thế có nhanh hơn không, vì dự tính là hàm tổng quát nên dữ liệu nó không ổn định như thế
    Trích Nguyên văn bởi winvista View Post
    5) đối với sub LOAD Data:
    + có những biến và dòng code thừa - như ArrDataU vô ích
    + có nên chăng phải lọc trước dữ liệu của Data gốc không, sao không nghĩ phương án chuyển thẳng Data gốc cùng ArrCotDuLieu vào thẳng code Filter (hiện trong class) để xử lý (vì trước sau ta cũng phải nhặt dữ liệu theo điều kiện Filter) -- như thế bỏ hẳn được đoạn For i for j ngốn nhiều resource (time and memory) này (khi dữ liêu lớn (số dòng ở đây) thì mỗi FOR duyệt sẽ làm tăng chi phí thời gian là đáng kể)
    ArrDataU đó mình để phuc vụ cho việc tìm kiếm mà không phân biệt chữ hoa chữ thường ấy.
    code LoadData mình dự định là chỉ chạy 1 lần đầu, những lần sau đó thì ko phải chạy lại (nên sẽ đỡ thời gian cho những lần chạy sau)- sẽ đặt điều kiện để nhận biết khi nào vùng dữ liệu thay đổi để Load lại, còn không thì không phải load
    còn ý phía sau mình không hiểu
    ps: Cảm ơn bạn đã quan tâm, vì đây là code ban đầu viết nên chưa lường hết các vấn đề nên vẫn còn chậm như thế, mong được sự hỗ trợ từ bạn để cải thiện tốc độ hơn

Trang 2/6 đầuđầu 1 2 3 4 5 6 cuốicuối

Thông tin về chủ đề này

Users Browsing this Thread

Hiện có 1 người đang xem đề tài này. (0 thành viên và 1 khách)

Bookmarks

Bookmarks

Quyền Sử Dụng Ở Diễn Ðàn

  • Bạn không thể đăng đề tài mới
  • Bạn không thể đăng trả lời
  • Bạn không thể đăng file đính kèm.
  • Bạn không thể sửa bài viết.
  •