দেখা যাচ্ছে যে বন্যভাবে পরিবর্তিত পারফরম্যান্স আবর্জনা সংগ্রহের সাথে সম্পর্কিত। কোনও আবর্জনা সংগ্রহ চালানো না হওয়া অবধি ফাংশনের প্রতিটি কল ধীর হয়ে যাবে। স্টক ইম্যাক্স সহ, জিসি প্রতি কয়েক সেকেন্ডের মধ্যে চালানো হত, তবে আমার স্টার্টআপের সময়টি উন্নত করার জন্য আমার ইনপিসে একটি লাইন ছিল যা গিগা-কনস-থ্রোসোল্ড 20 এমবি সেট করে, এবং এর অর্থ হ'ল জিসি অনেক বেশি চালিত হয়েছিল, যার ফলে বেঞ্চমার্কগুলি ধীরে ধীরে ধীরে ধীরে প্রতিবেদন করুন যতক্ষণ না কয়েক মিনিটের পরে একটি গিসি চালিত হয়, তারপরে সময়গুলি নিমজ্জিত হবে এবং আবার দ্রুত হবে।
ডিফল্ট জিসি-কনস-থ্রেশহোল্ডে ফিরে যাওয়ার পরে, বেঞ্চমার্কিং আরও সহজ হয়ে যায়।
তারপরে আমি বিল্ট ইন প্রোফাইলার ( M-x profiler-start
) এর সাহায্যে মেমোরির জন্য প্রোফাইড করেছি এবং আবিষ্কার করেছি যে সিন্ট্যাক্স-পিপিএসে কলগুলি সবচেয়ে বেশি বরাদ্দের কারণ হয়ে গেছে, তাই সিন্ট্যাক্স-পিপিএস কম কল করার জন্য কিছু অপ্টিমাইজেশনের পরে আমি গ্রহণযোগ্য কর্মক্ষমতা অর্জন করেছি।
জিট-লক-মোড ব্যবহার করা (জিট-লক-রেজিস্টারের মাধ্যমে একটি ফাংশন যোগ করা) বিশ্বাসযোগ্যভাবে কাজ করার জন্য মাল্টি লাইন ফন্ট লকিংয়ের সহজতম উপায় বলে মনে হয়, তাই এটিই আমি বেছে নিয়েছিলাম।
সম্পাদনা: আবিষ্কারের পরেও যে খুব বড় বাফারগুলিতে পারফরম্যান্স এখনও যথেষ্ট ভাল ছিল না আমি সিএমইউ ব্যবহার এবং বরাদ্দের অনুকূলিতকরণের জন্য অনেকটা সময় ব্যয় করেছি, ইমাসস প্রোফাইলার ( M-x profiler-start
) এর সাথে নির্মিত পারফরম্যান্সের উন্নতিগুলি পরিমাপ করে । যাইহোক, খুব বড় বাফারগুলির মাধ্যমে দ্রুত স্ক্রোল করার সময় ইমাকগুলি হুড়োহুড়ি করে ঝুলবে। আমি নিবন্ধিত জিট-লক ফাংশনটি jit-lock-register
সরিয়ে দিলে তোতলাম্বি এবং হ্যাংগুলি মুছে ফেলা হবে, তবে প্রোফাইলিংটি জিট-লক ফাংশনটি প্রায় 8 এমএসে সম্পূর্ণ করতে দেখায় যা মসৃণ স্ক্রোলিংয়ের জন্য যথেষ্ট দ্রুত হওয়া উচিত। কলটি সরিয়ে ফেলার jit-lock-register
পরিবর্তে নিয়মিত ফন্ট-লক-কীওয়ার্ড ম্যাচার ব্যবহার করে সমস্যার সমাধান হয়েছে।
টিএলডিআর: এটি করা ধীর ছিল এবং হাঁপিয়ে উঠবে:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(jit-lock-register 'my-font-lock-function)
এটি করা দ্রুত ছিল এবং তোলাবাজি হবে না:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(defun my-font-lock-matcher (limit)
(my-font-lock-function (point) limit)
nil)
(setq font-lock-defaults
(list
...
;; Note that the face specified here doesn't matter since
;; my-font-lock-matcher always returns nil and sets the face on
;; its own.
`(my-font-lock-matcher (1 font-lock-keyword-face nil))))