Tăng tốc các mục nhập bản đồ khi khớp theo thuộc tính


8

Câu hỏi : Tại sao org-map-entrieskhớp tài sản quá chậm và tôi có thể làm gì để tăng tốc?

Bối cảnh : Tôi có một cách sử dụng tương đối đơn giản để org-map-entries: lấy nỗ lực (tính bằng số phút) từ tất cả các mục nhập chương trình nghị sự với thẻ goalvà mức độ ưu tiên nhất định (ví dụ B).

(org-map-entries #'hw-org-get-effort-in-minutes "goal+PRIORITY=\"B\"" 'agenda)

Điều này cực kỳ chậm, mất hơn một phút cho tệp chương trình nghị sự ~ 12k của tôi.

Tuy nhiên, nếu tôi loại bỏ PRIORITYkhỏi bộ lọc để bất kỳ goalsmục được gắn thẻ nào được chọn, nó sẽ hoàn thành gần như ngay lập tức.

Tôi cũng có thể thiết lập các bộ lọc như thế goal/DONEvà chúng hoàn thành rất nhanh, nhưng nếu tôi làm điều gì đó như goals+EFFORT>0chúng tôi sẽ quay lại mất hơn một phút. Có vẻ như tài sản nói chung là rất chậm để phù hợp.

Tôi tìm thấy một cách giải quyết gian lận : Tôi có thể khớp các thuộc tính bên trong hàm được ánh xạ rất nhanh bằng cách sử dụng org-entry-get. Khi tôi làm điều này, thực thi là ít hơn một giây. Điều này có vẻ ngớ ngẩn, hy vọng có một cách tốt hơn, nhưng ít nhất nó hoạt động!

Đã thử : Kể từ khi (benchmark 1000 (hw-org-effort-to-minutes "1:20"))trả về "Elapsed time: 0.000019s", tôi không nghĩ chức năng của mình đóng góp nhiều.

Theo đó profiler, ~ 40% thời gian CPU được sử dụng bởi cond, với ~ 29% đến từ phân tích cú pháp phần tử ( org-element--current-element). Hai đóng góp lớn nhất tiếp theo nói chung là 14% và 13%, vì vậy 40% conddường như là phần lớn của vấn đề. Không chắc chắn tại sao phân tích cú pháp phần tử sẽ được thực hiện thường xuyên hơn với các trình so khớp thuộc tính, trừ khi sự khác biệt đến từ việc phân tích cú pháp chỉ tiêu đề (thẻ, TODO) so với tiêu đề + cơ thể (thuộc tính).

Câu trả lời:


2

Một cách để cải thiện tốc độ là phân tích nội dung của các tệp chương trình nghị sự của bạn một lần trong bộ đệm tạm thời thu thập nỗ lực của tất cả các mục khớp goal+PRIORITY="B"(xem Kiểm tra 1). Với ~ 10K dòng, tôi nhận được "Thời gian đã trôi qua: 0,052280 giây" so với "Thời gian đã trôi qua: 1,340006 giây" bằng cách sử dụng org-map-entries(Thử nghiệm 2) mà tôi nghĩ là những gì bạn đang cố gắng thực hiện. Để có kết quả tốt hơn bằng cách sử dụng, org-map-entriesbạn có thể thử Test 3, cũng khá nhanh. Đã thử nghiệm với phiên bản Emacs 26.2 và chế độ Org phiên bản 9.2.4.

Kiểm tra 1 (nhanh nhất)

(org-duration-from-minutes
 (apply '+ (let (efforts
                 (regexp (concat org-effort-property ":\s*\\(.+\\)")))
             (with-temp-buffer
               (mapcar #'insert-file-contents org-agenda-files)
               (goto-char (point-min))
               (while (re-search-forward regexp nil t)
                 (let ((effort (match-string 1)))
                   (save-excursion
                     (outline-previous-heading)
                     (when (and (member "goal" (org-get-tags))
                                (= (and (looking-at org-heading-regexp)
                                        (org-get-priority (match-string 0)))
                                1000))
                    (push (org-duration-to-minutes effort) efforts))))))
          efforts)))

Kiểm tra 2 (chậm nhất)

(org-duration-from-minutes
 (apply '+ (org-map-entries
            (lambda ()
              (org-duration-to-minutes
               (org-entry-get nil org-effort-property)))
            "goal+PRIORITY=\"B\""
            'agenda)))

Bài kiểm tra 3 (khá tốt)

(org-duration-from-minutes
 (apply '+ (org-map-entries
            (lambda ()
              (if (re-search-forward (concat org-effort-property ":\s*\\(.+\\)")
                                     (save-excursion
                                       (org-end-of-meta-data)
                                       (point))
                                     t)
                  (let ((effort (match-string 1)))
                    (outline-previous-heading)
                    (when (looking-at org-complex-heading-regexp)
                      (let ((priority (match-string 3))
                            (tags (match-string 5)))
                        (if (and (string= priority "[#B]")
                                 (string-match ":goal:" tags))
                            (org-duration-to-minutes effort)
                          0))))
                0))
            nil 'agenda)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.