আমি কীভাবে এলিসপ কোডটির কার্যকারিতা পরিমাপ করব?


26

আমি কীভাবে আমার এলিসপ কোডটির কার্যকারিতা পরিমাপ করব? আমার নেওয়া সময় পরিমাপ করার জন্য কোন সরঞ্জাম / বাহ্যিক প্যাকেজগুলি উপলব্ধ?

মোট সময় ছাড়াও, আমি কি এমন একটি প্রোফাইল দেখতে পাচ্ছি যা প্রতি ফাংশনে সময় নিয়েছে? আমি কি মেমরির ব্যবহারের প্রোফাইল দিতে পারি?


1
প্রশ্নটি খুব বিস্তৃত। কেমন পারফরম্যান্স? কোথায়? কখন? " ইমাক্স পারফরম্যান্স " এর অর্থ যেকোনো কিছুই এবং সবকিছু হতে পারে।
ড্র

@ ড্র্য আরও অনেক প্রোগ্রামিং ভাষার একটি মানদণ্ডের সেট রয়েছে (যেমন পাইথন: স্পিড.পিপাই.আর.জি , জেএস: সানস্পাইডার ইত্যাদি) এবং আমি আশা করছিলাম যে এলিসপ ইন্টারপ্রেটারের সমতুল্য আছে।
উইলফ্রেড হিউজেস

ফাংশন দ্বারা সরবরাহিত benchmarkএবং প্রোফাইলার যেমন মানদণ্ড Emacs কর্মক্ষমতা পরিমাপ করে না । এটি নির্দিষ্ট এক্সপ্রেশন মূল্যায়নের কর্মক্ষমতা পরিমাপ করে। এটি ইমাসের মধ্যে পারফরম্যান্সের তুলনা করতে সহায়ক । Emacs এর কার্যকারিতা পরিমাপ করার জন্য আপনাকে এটিকে Emacs ব্যতীত অন্য কোনও কিছুর পারফরম্যান্সের সাথে তুলনা করতে হবে। এবং এটি থেকেই ইমাসের প্রস্থটি খেলতে আসে। আপনি এটি বা তার জন্য ইমাস বনাম এক্সওয়াইজেড পরিমাপ করতে পারেন, তবে সামগ্রিকভাবে ইমাসের পারফরম্যান্স পরিমাপ করার জন্য আপনাকে এ জাতীয় তুলনা প্রয়োজন।
ড্রিউ

সম্ভবত আপনি বোঝাতে চেয়েছিলেন " আমি ইমাসে পারফরম্যান্সটি কীভাবে পরিমাপ করব "?
ড্রিউ

2
ঠিক আছে, আমি ইমাসকে বেনমার্কিং সম্পর্কিত হতে emacs.stackexchange.com/q/655/304 খুলেছি এবং এই প্রশ্নটির পুনরাবৃত্তিটি বেঞ্চমার্কিং / প্রোফাইলিং এলিস্প প্রোগ্রাম সম্পর্কিত হতে পারি।
উইলফ্রেড হিউজেস 10

উত্তর:


31

উচ্চতার চিহ্ন

সর্বাধিক সরল বিকল্পগুলি অন্তর্নির্মিত benchmarkপ্যাকেজ। এর ব্যবহার উল্লেখযোগ্যভাবে সহজ:

(benchmark 100 (form (to be evaluated)))

এটি স্বয়ংক্রিয়ভাবে চালিত হয়েছে, সুতরাং আপনার এটির প্রয়োজনও হবে না।

প্রোফাইলিং

বেঞ্চমার্ক সামগ্রিক পরীক্ষাগুলিতে ভাল তবে আপনি যদি পারফরম্যান্সে সমস্যা বোধ করেন তবে কোনটি কার্যক্রমে সমস্যা সৃষ্টি করছে তা আপনাকে তা বলে না। তার জন্য, আপনার কাছে (বিল্ট-ইন) প্রোফাইলারও রয়েছে

  1. এটি দিয়ে শুরু করুন M-x profiler-start
  2. কিছুটা সময় ব্যয়কারী অপারেশন করুন।
  3. সঙ্গে রিপোর্ট পান M-x profiler-report

আপনাকে ফাংশন কলগুলির নেভিগেটেবল ট্রি সহ একটি বাফারে নিয়ে যাওয়া উচিত।
প্রোফাইলার স্ক্রিনশট


benchmarkফাংশনটি কাজ করছে বলে মনে হচ্ছে না: যখন আমি একটি খোলা .cফাইলের ভিতরে করি তখন আমি (benchmark 100 (c-font-lock-fontify-region 0 17355))পেতে থাকি void-function jit-lock-bounds
হাই-অ্যাঞ্জেল

1
এফটিআর: এর বিকল্প হিসাবে benchmarkফাংশন রয়েছে benchmark-runএবং benchmark-run-compiled। আমার জন্য প্রধান পার্থক্যটি ছিল উভয় ফাংশন আসলে কাজ করে (পূর্ববর্তী মন্তব্য দেখুন) : Ь
হাই-অ্যাঞ্জেল

14

@ মালাবারার উত্তর ছাড়াও, আমি with-timerআমার কোডের বিভিন্ন অংশে (যেমন আমার init.elফাইল) স্থায়ীভাবে ইনস্টল করতে কাস্টম-মেড ম্যাক্রো ব্যবহার করার ঝোঁক ।

পার্থক্যটি হ'ল যখন benchmarkআপনি একটি নির্দিষ্ট বিট কোডের কার্যকারিতা অধ্যয়ন করতে পারবেন যা আপনাকে with-timerসর্বদা কোডের প্রতিটি চালিত অংশে ব্যয় করে সময় দেয় (যথেষ্ট পরিমাণে বড় অংশের জন্য খুব বেশি ওভারহেড ছাড়াই) যা আপনাকে জানার জন্য ইনপুট দেয় gives কোন অংশটি আরও তদন্ত করা উচিত।

(defmacro with-timer (title &rest forms)
  "Run the given FORMS, counting the elapsed time.
A message including the given TITLE and the corresponding elapsed
time is displayed."
  (declare (indent 1))
  (let ((nowvar (make-symbol "now"))
        (body   `(progn ,@forms)))
    `(let ((,nowvar (current-time)))
       (message "%s..." ,title)
       (prog1 ,body
         (let ((elapsed
                (float-time (time-subtract (current-time) ,nowvar))))
           (message "%s... done (%.3fs)" ,title elapsed))))))

উদাহরণ ব্যবহার:

(with-timer "Doing things"
  (form (to (be evaluated))))

*Messages*বাফারে নিম্নলিখিত আউটপুট ফলন :

Doing things... done (0.047s)

আমার উল্লেখ করা উচিত যে এটি দুর্দান্তভাবে use-package-with-elapsed-timerতাঁর use-packageএক্সটেনশনে জোন উইগলির ম্যাক্রো দ্বারা অনুপ্রাণিত হয়েছিল ।


আপনি যদি init.el পরিমাপ করছেন তবে আপনি সম্ভবত ইমাস স্টার্টআপ প্রোফাইলারের প্রতি আগ্রহী হবেন ।
উইলফ্রেড হিউজেস

ম্যাক্রো দুর্দান্ত। এটি আরও ভোটের দাবিদার।
মালবারবা

2
Emacs মোট সূচনা সময় রেকর্ড করে। আপনি কমান্ড দিয়ে এটি প্রদর্শন করতে পারেন emacs-init-time
জো

1
@ উইলফ্রেডহাগস হ্যাঁ, আমি ব্যবহার করি esupএবং আমি এটি পছন্দ করি। তবে আবারও, আগ্রহী এমন জিনিসের মতো with-timerকিছু বদ্ধভাবে প্রোফাইল করা তেমন নয়। আসল আগ্রহটি হ'ল আপনার কাছে সর্বদা প্রোফাইলিং তথ্য থাকে। আমি যখনই ইমাস শুরু করি, আমার *Messages*বাফারে আমার কিছু লাইন রয়েছে যা আমাকে বলুন কোন অংশটি কত সময় নিয়েছে। যদি আমি অস্বাভাবিক কিছু শনাক্ত করি তবে আমি প্রোফাইলে জিনিসগুলি অনুকূল করতে এবং আরও অনুকূল করতে আরও পর্যাপ্ত যেকোন সরঞ্জাম ব্যবহার করতে পারি।
ffevotte

@ জোস হ্যাঁ, emacs-init-timeআকর্ষণীয় তথ্য দেয়। তবে এটি সূচনার পৃথক অংশগুলি ভেঙে যাওয়ার সম্ভাবনা ছাড়াই কেবল একটি অন্তর্ভুক্তিমূলক সময় ব্যয় করে।
ffevotte

3

@ মালবারবা এর উত্তর ছাড়াও, মনে রাখবেন যে আপনি আপনার কোডটির সংকলিত সম্পাদনের সময়টি মাপতে পারবেন benchmark-run-compiled। সেই মেট্রিকটি আপনাকে ব্যাখ্যা করা কার্যকর মৃত্যুর সময় থেকে অনেক বেশি প্রাসঙ্গিক হয় M-x benchmark:

ELISP> (benchmark-run (cl-loop for i below (* 1000 1000) sum i))
(0.79330082 6 0.2081620540000002)

ELISP> (benchmark-run-compiled (cl-loop for i below (* 1000 1000) sum i))
(0.047896284 0 0.0)

তিনটি সংখ্যা হ'ল মোট সময় অতিবাহিত সময়, জিসি রানের সংখ্যা এবং জিসিতে সময় কাটানো।


1

বেঞ্চমার্কিং কেবল সংখ্যা অর্জন সম্পর্কে নয়, ফলাফল বিশ্লেষণের ভিত্তিতে সিদ্ধান্ত গ্রহণের বিষয়েও।

নেই benchstat.el Melpa উপর প্যাকেজ যা আপনি যে নতুন বৈশিষ্ট্য পান করতে ব্যবহার করতে পারেন benchstat প্রোগ্রাম প্রদান করে।

এটি তুলনামূলক ভিত্তিক বেঞ্চমার্কিং কার্যকর করে যেখানে আপনি এর Xবিপরীতে পারফরম্যান্স বৈশিষ্ট্য পরীক্ষা করেন Y

বেঞ্চস্ট্যাট ফাংশনগুলিকে একটি benchmark-run-compiledমোড়ক হিসাবে দেখা যেতে পারে যা কেবল তথ্যই সংগ্রহ করে না, তবে এটি ব্যাখ্যা বিন্যাসটি পড়তে সহজে ফিরিয়ে দেয়। এটা অন্তর্ভুক্ত:

  • মধ্যে অতিবাহিত সময় ব-দ্বীপ XএবংY
  • গড় গড় সময়
  • বরাদ্দ পরিমাণ

খুব সাধারণ ব্যবহারের উদাহরণ:

(require 'benchstat)

;; Decide how much repetitions is needed.
;; This is the same as `benchmark-run-compiled` REPETITIONS argument.
(defconst repetitions 1000000)

;; Collect old code profile.
(benchstat-run :old repetitions (list 1 2))
;; Collect new code profile.
(benchstat-run :new repetitions (cons 1 2))

;; Display the results.
;; Can be run interactively by `M-x benchstat-compare'.
(benchstat-compare)

benchstat-compareএকটি অস্থায়ী বাফারে ফলাফল রেন্ডার হবে:

name   old time/op    new time/op    delta
Emacs    44.2ms ± 6%    25.0ms ±15%  -43.38%  (p=0.000 n=10+10)

name   old allocs/op  new allocs/op  delta
Emacs      23.0 ± 0%      11.4 ± 5%  -50.43%  (p=0.000 n=10+10)

benchstatযদিও আপনার বাইনারি প্রোগ্রামের প্রয়োজন হবে । আপনি যদি গো প্রোগ্রামিংয়ের ভাষা ব্যবহার করেন তবে সম্ভবত আপনার সিস্টেমে একটি ইতিমধ্যে রয়েছে। অন্যথায় উত্স থেকে এটি সংকলনের একটি বিকল্প রয়েছে।

লিনাক্স / এএমডি 64 এর জন্য প্রাকম্পম্পিত বাইনারিটি গিথুব প্রকাশের পৃষ্ঠায় পাওয়া যাবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.