ফন্ট লক কার্যকারিতা অনুকূলকরণ


13

আমি অ্যাঙ্কার্ড ফন্ট লক ম্যাচিংয়ের বৈকল্পিক সম্পাদন করতে চাই। আমার ফাংশন সংজ্ঞা রয়েছে যা নামের তালিকা দিয়ে শুরু হয় এবং আমি চাই যে ফাংশন বডিটির ভিতরে এই নামগুলি হাইলাইট করা হোক।

আমি একটি ফাংশন তৈরি করেছি যা এটি করে এবং এটি জিট-লক-রেজিস্টারের সাথে জিট-লক ফাংশন হিসাবে নিবন্ধিত করে তবে, পারফরম্যান্সটি বেশ দুর্বল এবং বড় ফাইলগুলিতে স্ক্রোলিং পিছিয়ে যায়।

  • আমি কীভাবে পারফরম্যান্স পরিমাপ করতে পারি? আমি যদি কেবলমাত্র আমার ফাংশনটিকে কোনও বড় ফাইলটিতে কল করতে পারি (ফ্লোট-টাইম সহ এর আগে এবং পরে বা এলপ সহ) আমি বন্যভাবে বিভিন্ন পারফরম্যান্স পাই, তবে এটি 0.65 থেকে 12 সেকেন্ড পর্যন্ত কিছু লাগে। ফন্ট লক কার্য সম্পাদনের জন্য কোন প্রস্তাবিত উপায় আছে?
  • ফন্ট-লক-কীওয়ার্ডগুলিতে সংজ্ঞায়িত অ্যাঙ্কার্ড ম্যাচারের মধ্যে পারফরম্যান্সে কোনও পার্থক্য রয়েছে এবং জিট-লক-রেজিস্টারের মাধ্যমে কোনও ফাংশন যুক্ত করা যায়?

সম্পাদনা: দেখে মনে হচ্ছে যে পারফরম্যান্সের পরিবর্তনশীলতা আবর্জনা সংগ্রহের সাথে সম্পর্কিত, আমার জিট-লক ফাংশনটির অনুরোধগুলি আবর্জনা সংগ্রহ পরিচালিত না হওয়া অবধি প্রতিটি অনুরোধের সাথে ক্রমশ ধীর হয়ে যায়, সেই সময়ে তারা আবার দ্রুত পায়।


প্রথম আইটেমটির জন্য, প্রোফাইলার চেষ্টা করুন।
মালাবরবা

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

আপনার কি কিছু কোড আছে যা আমরা পরীক্ষা করতে পারি? এটি আমাদের অনেক সাহায্য করতে পারে।
পাইথননট

1
যদিও প্রোফাইলিং বা মাইক্রো-অপ্টিমাইজেশান সম্পর্কে নয়, তবে: আমি ফন্ট-লক-স্টুডিও প্যাকেজটি ফন্ট-লক কার্যকারিতা বোঝার জন্য অন্য সহায়ক সরঞ্জাম হিসাবে পেয়েছি । এটি অন্য কোনও ইন্টারেক্টিভ স্টেপিং ডিবাগার যেমন সাহায্য করতে পারে ঠিক তেমনভাবে সহায়তা করতে পারে - আপনি কার্যকর করতে পারেন যে মৃত্যুর পথগুলি আপনি প্রত্যাশা করেন না এবং এটিই মূল পারফরম্যান্সের সমস্যা।
গ্রেগ হেন্ডারশট

ফন্ট-লক-স্টুডিও সম্পর্কে পরামর্শ দেওয়ার জন্য ধন্যবাদ, এটি দুর্দান্ত! যদিও জিট-লক-ফাংশনগুলিতে সহায়তা করে না, তবে নিশ্চিতভাবে সমস্ত কিছু করে।
জোয়াকিম হার্সম্যান

উত্তর:


8

দেখা যাচ্ছে যে বন্যভাবে পরিবর্তিত পারফরম্যান্স আবর্জনা সংগ্রহের সাথে সম্পর্কিত। কোনও আবর্জনা সংগ্রহ চালানো না হওয়া অবধি ফাংশনের প্রতিটি কল ধীর হয়ে যাবে। স্টক ইম্যাক্স সহ, জিসি প্রতি কয়েক সেকেন্ডের মধ্যে চালানো হত, তবে আমার স্টার্টআপের সময়টি উন্নত করার জন্য আমার ইনপিসে একটি লাইন ছিল যা গিগা-কনস-থ্রোসোল্ড 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))))

আপনি যে কোডটি ব্যবহার করেছেন তা ভাগ করে নিতে পারবেন? আপনার সমাধান অন্যকে একই জিনিস অর্জনে সহায়তা করতে পারে।
ম্যানুয়েল উবার্তি

আমি সত্যিই কোনও নির্দিষ্ট কোড ব্যবহার করি নি, আমি কেবল সিনট্যাক্স-পিপিএস কম বলেছি। আপনি এখানে প্রশ্নে কোডটি দেখতে পারেন: bitbucket.org/harsman/dyalog-mode/src/… সন্ধান করুন dyalog-fontify-locals
জোয়াকিম হার্সম্যান

আমার ধারনা dyalog-fontify-locals-matcherহওয়া উচিত my-font-lock-matcherএবং এর একটি endহওয়া উচিত limit। যাইহোক, সত্যিই আকর্ষণীয় আবিষ্কার!
Lindydancer

@ লিন্ডাড্যান্সার: হ্যাঁ আপনাকে ধন্যবাদ সংশোধন করা হয়েছে।
জোয়াকিম হার্সম্যান

1
পুনরায়: gc-cons-thresholdআপনি যদি শুরু করার সময়টি উন্নত করার জন্য বিশুদ্ধভাবে অভ্যন্তরীণ মানগুলির সাথে জগাখিচুড়ি করেন, তবে আমি আপনাকে emacs-startup-hookসেগুলি পরে পুনরুদ্ধার করার জন্য ব্যবহার করার পরামর্শ দিচ্ছি ।
ফিল্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.