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


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.