বড় বাফারগুলিতে `লাইন-নম্বর-এ-পোস্ট` পাওয়ার জন্য একটি দ্রুত পদ্ধতি


19

ফাংশন line-number-at-pos(যখন প্রায় 50 বার পুনরাবৃত্তি করা হয়) আধা-বড় বাফারগুলিতে লক্ষণীয় ধীর-ডাউন ঘটায় - যেমন 50,000 লাইন - যখন পয়েন্টটি বাফারটির শেষের কাছাকাছি হয়। ধীর-ডাউন দ্বারা, আমি প্রায় 1.35 সেকেন্ডের সম্মিলিত মোট অর্থ।

elispগণনা-লাইনগুলি এবং বাফারের শীর্ষে যেতে 100% ফানসিটন ব্যবহার করার পরিবর্তে , আমি একটি হাইব্রিড পদ্ধতিতে আগ্রহী যেটি মোড-লাইনে উপস্থিত লাইন নম্বরটির জন্য দায়বদ্ধ অন্তর্নির্মিত সি সক্ষমতায় ট্যাপ করবে। বাফারের আকার নির্বিশেষে মোড-লাইনে প্রদর্শিত লাইন নম্বরটি হালকা গতিতে ঘটে।


এখানে একটি পরীক্ষা ফাংশন:

(defmacro measure-time (&rest body)
"Measure the time it takes to evaluate BODY.
http://lists.gnu.org/archive/html/help-gnu-emacs/2008-06/msg00087.html"
  `(let ((time (current-time)))
     ,@body
     (message "%.06f" (float-time (time-since time)))))

(measure-time
  (let* (
      line-numbers
      (window-start (window-start))
      (window-end (window-end)))
    (save-excursion
      (goto-char window-end)
      (while
        (re-search-backward "\n" window-start t)
        (push (line-number-at-pos) line-numbers)))
    line-numbers))

উত্তর:


17

চেষ্টা

(string-to-number (format-mode-line "%l"))

আপনি ইমাস লিসপ ম্যানুয়ালটিতে বর্ণিত % -নিস্ট্রাক্টগুলি ব্যবহার করে অন্যান্য তথ্য বের করতে পারবেন ।

সতর্কীকরণ:

ওয়াসমাসা এবং স্টিফান দ্বারা চিহ্নিত সীমাবদ্ধতা ছাড়াও (নীচে মন্তব্যগুলি দেখুন) এটি প্রদর্শিত না হওয়া বাফারদের জন্য কাজ করে না।

এটা চেষ্টা কর:

(with-temp-buffer
  (dotimes (i 10000)
    (insert (format "%d\n" i)))
  (string-to-number (format-mode-line "%l")))

এবং তুলনা

(with-temp-buffer
  (dotimes (i 10000)
    (insert (format "%d\n" i)))
  (line-number-at-pos))

হ্যাঁ, এটি এটি 1.35 সেকেন্ড থেকে 0.003559 এ কমিয়েছে! আপনাকে অনেক ধন্যবাদ - প্রশংসা! :)
— আইনজীবি

6
সচেতন হন যে এই পদ্ধতিটি আপনাকে "??" দেবে অতিক্রমকারী লাইনের জন্য line-number-display-limit-widthযা আমি এখানে খুঁজে পেয়েছি হিসাবে ডিফল্ট হিসাবে 200 এর মান সেট করা হয়েছে ।
— ওয়াশমাস

3
আইআইআরসি ফলাফলটিও অবিশ্বাস্য হতে পারে যদি শেষ পুনর্নির্মাণের পরে বাফারে কোনও পরিবর্তন ঘটে থাকে।
— স্টিফান

আমি বিশ্বাস করি যে উত্তরে পরীক্ষাগুলি সংশোধন করা প্রয়োজন যে দ্বিতীয় অক্ষরটি প্রথম পরীক্ষার জন্য iপ্রতিস্থাপন করা হয়েছিল (string-to-number (format-mode-line "%l"))এবং দ্বিতীয় পত্রটি দ্বিতীয় পরীক্ষার জন্য iপ্রতিস্থাপন করা হবে (line-number-at-pos)।
— আইনজীবি

5

nlinum.el নিম্নলিখিত ব্যবহার করে:

(defvar nlinum--line-number-cache nil)
(make-variable-buffer-local 'nlinum--line-number-cache)

;; We could try and avoid flushing the cache at every change, e.g. with:
;;   (defun nlinum--before-change (start _end)
;;     (if (and nlinum--line-number-cache
;;              (< start (car nlinum--line-number-cache)))
;;         (save-excursion (goto-char start) (nlinum--line-number-at-pos))))
;; But it's far from clear that it's worth the trouble.  The current simplistic
;; approach seems to be good enough in practice.

(defun nlinum--after-change (&rest _args)
  (setq nlinum--line-number-cache nil))

(defun nlinum--line-number-at-pos ()
  "Like `line-number-at-pos' but sped up with a cache."
  ;; (assert (bolp))
  (let ((pos
         (if (and nlinum--line-number-cache
                  (> (- (point) (point-min))
                     (abs (- (point) (car nlinum--line-number-cache)))))
             (funcall (if (> (point) (car nlinum--line-number-cache))
                          #'+ #'-)
                      (cdr nlinum--line-number-cache)
                      (count-lines (point) (car nlinum--line-number-cache)))
           (line-number-at-pos))))
    ;;(assert (= pos (line-number-at-pos)))
    (setq nlinum--line-number-cache (cons (point) pos))
    pos))

মোড ফাংশনে নিম্নলিখিত অতিরিক্ত কনফিগারেশন সহ:

(add-hook 'after-change-functions #'nlinum--after-change nil t)

1
আহ ... আমি খুব সকালে এই সকালে আপনার লাইব্রেরি সম্পর্কে ভাবছিলাম। line-number-at-posকনস্টান্টটাইন দ্বারা উত্তর দিয়ে প্রতিস্থাপিত করা যেতে পারে, এবং যে আরও বেশি চেয়ে ইতিমধ্যে তার আপনার লাইব্রেরি গতি বাড়াতে হবে - বিশেষ করে বৃহৎ বাফার হবে। count-linesকনস্ট্যান্টাইন দ্বারা পদ্ধতিটি ব্যবহার করেও ঠিক করা উচিত। আমি এমনকি সেই ফাংশনগুলি ঠিক করতে রিপোর্ট-ইমাস-বাগ হটলাইনে একটি প্রস্তাব-বাক্স জমা দেওয়ার কথা ভাবছিলাম।
— আইনজীবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.