কীভাবে আরও ফ্ল্যাশ এবং র‌্যামের জন্য কোডটি গ্রাস করবেন? [বন্ধ]


14

আমি আমাদের একটি নির্দিষ্ট পণ্য একটি বৈশিষ্ট্য বিকাশ উপর কাজ করেছি। একই বৈশিষ্ট্যটি অন্য পণ্যটিতে পোর্ট করার জন্য অনুরোধ করা হয়েছে। এই পণ্যটি একটি এম 16 ​​সি মাইক্রোকন্ট্রোলারের উপর ভিত্তি করে তৈরি করা হয়েছে, যা traditionতিহ্যগতভাবে 64K ফ্ল্যাশ এবং 2k র্যাম রয়েছে।

এটি একটি পরিণত পণ্য, এবং তাই কেবলমাত্র ১৩২ বাইট ফ্ল্যাশ এবং 2 বাইট র‌্যাম বাকী রয়েছে।

অনুরোধ করা বৈশিষ্টটি পোর্ট করতে (বৈশিষ্ট্যটি নিজেই অনুকূলিত করা হয়েছে), আমার 1400 বাইট ফ্ল্যাশ এবং 200 বাইট র‌্যামের দরকার।

কোড কমপ্যাকশন দ্বারা এই বাইটগুলি কীভাবে পুনরুদ্ধার করবেন সে সম্পর্কে কারও কি কোনও পরামর্শ আছে? আমি ইতিমধ্যে বিদ্যমান ওয়ার্কিং কোডটি কম্প্যাক্ট করার চেষ্টা করার সময় আমি কোন নির্দিষ্ট জিনিসগুলির সন্ধান করব?

যে কোনও ধারণা সত্যই প্রশংসা করা হবে।

ধন্যবাদ।


1
পরামর্শ জন্য সবাইকে ধন্যবাদ। আমি আপনাকে আমার অগ্রগতির সাথে আপডেট করে রাখব এবং যে পদক্ষেপগুলি কাজ করেছে এবং যেগুলি করেনি তাদের তালিকাবদ্ধ করব।
ইন্টেলিচিক

ঠিক আছে তাই এখানে কাজ করার চেষ্টা করেছি এমনগুলি এখানে রয়েছে: সংকলক সংস্করণ সরিয়ে নিয়েছে। অপ্টিমাইজেশনের মারাত্মক উন্নতি হয়েছিল যা আমাকে প্রায় 2 কে ফ্ল্যাশ দেয়। নির্দিষ্ট পণ্যের জন্য অপ্রয়োজনীয় এবং অব্যবহৃত কার্যকারিতা (সাধারণ কোড বেসের কারণে উত্তরাধিকারসূত্রে) পরীক্ষা করার জন্য তালিকা ফাইলগুলির মধ্য দিয়ে গিয়েছিলেন এবং আরও কিছু ফ্ল্যাশ অর্জন করেছেন।
ইন্টেলিচিক

র‌্যামের জন্য আমি নিম্নলিখিতটি করেছি: সর্বাধিক র‌্যাম ব্যবহার করে এমন ফাংশন / মডিউলগুলি পরীক্ষা করতে, মানচিত্রের ফাইলটি দিয়ে গিয়েছিলাম। লিগ্যাসি কোডের একটি সত্যই ভারী ফাংশন (12 টি চ্যানেল, প্রতিটি বরাদ্দ মেমরির একটি নির্দিষ্ট পরিমাণের সাথে) পেয়েছি, এটি কী অর্জন করার চেষ্টা করছে তা বুঝতে পেরেছি এবং সাধারণ যে চ্যানেলগুলির মধ্যে তথ্য ভাগ করে নিয়ে র্যাম ব্যবহারটি অনুকূলিত করেছে। এটি আমার প্রয়োজন 200 ডলার বাইটস।
ইন্টেলিচিক

আপনার যদি আসকি ফাইল থাকে তবে আপনি 8 থেকে 7 বিট সংকোচনের ব্যবহার করতে পারেন। আপনাকে 12.5% ​​বাঁচায়। একটি জিপ ফাইল ব্যবহার করা জিপ করতে আরও কোড নেবে এবং এটিকে কেবল ছেড়ে দেওয়ার চেয়ে আন-জিপ আনবে।
স্পার্ক 256

উত্তর:


18

আপনার কয়েকটি বিকল্প রয়েছে: প্রথমে অনর্থক কোডটি সন্ধান করা এবং সদৃশতা থেকে মুক্তি পেতে একক কলটিতে সরিয়ে নেওয়া; দ্বিতীয়টি হল কার্যকারিতা অপসারণ করা।

আপনার .map ফাইলটি ভালভাবে দেখুন এবং দেখুন যে কোনও ফাংশন রয়েছে যা থেকে আপনি মুক্তি বা পুনর্লিখন করতে পারেন। এছাড়াও নিশ্চিত হয়ে নিন যে লাইব্রেরি কলগুলি ব্যবহৃত হচ্ছে যা সত্যই প্রয়োজন।

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

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


1
পরামর্শের জন্য ধন্যবাদ, আমি স্ট্রিং ধ্রুবকগুলির জন্য ব্যতীত আমি অবশ্যই তাদের বেশিরভাগ চেষ্টা করতে পারি। এটি নিখুঁতভাবে একটি এম্বেডড ডিভাইস, কোনও ইউআই নেই এবং তাই কোডের মধ্যে প্রিন্টফ () এ কোনও কল নেই। আশা করছি যে এই পরামর্শগুলি আমার প্রয়োজন আমার 1400 বাইট ফ্ল্যাশ / 200 বাইট র্যাম পেতে আমাকে আরও জোড় করে দেওয়া উচিত।
ইন্টেলিচিক

1
@ ইন্টেলিচিক আপনি ডিবাগিং বা পেরিফেরিয়াল প্রেরণের জন্য প্রিন্ট করতে এম্বেড থাকা ডিভাইসের অভ্যন্তরে প্রিন্টফ () ব্যবহার করে কত লোক অবাক হয়ে যায়। এটির পরে আপনি আরও ভাল জানেন বলে মনে হয় তবে যদি কেউ আপনার আগে এই প্রকল্পে কোড লিখে থাকে তবে এটি পরীক্ষা করে আঘাত করা কোনও ক্ষতি করবে না।
কেলেনজবি

5
এবং কেবল আমার পূর্ববর্তী মন্তব্যে প্রসারিত করার জন্য, আপনি কতজন লোক ডিবাগিং স্টেটমেন্ট যুক্ত করেছেন তা অবাক করে দিয়েছিলেন, তবে সেগুলি কখনও সরাবেন না। এমনকি #ifdefs করা লোকেরাও মাঝে মাঝে অলস হন।
কেলেনজবি

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

এ সম্পর্কে কেবল একটি প্রশ্ন - স্তর থেকে স্তর পর্যন্ত নেস্টেড ফাংশন কল হપ્સ সম্পর্কে কী। কত ওভারহেড যোগ করে? একাধিক ফাংশন কল করে বা ফাংশন কলগুলি হ্রাস করে মডিউলারিটি রাখা এবং কিছু বাইট সংরক্ষণ করা ভাল। এবং তা কি তাৎপর্যপূর্ণ?
ইন্টেলিচিক

8

আপনার নির্দিষ্ট সংকলক বিশেষত খারাপ যা আছে সেগুলি সন্ধান করার জন্য ফাইল (এসেম্বলার) আউটপুট তালিকাভুক্ত হওয়া সর্বদা মূল্যবান।

উদাহরণস্বরূপ, আপনি দেখতে পাবেন যে স্থানীয় ভেরিয়েবলগুলি খুব ব্যয়বহুল, এবং যদি অ্যাপ্লিকেশনটি ঝুঁকির পক্ষে উপযুক্ত হিসাবে যথেষ্ট সহজ হয় তবে কয়েকটি লুপ কাউন্টারকে স্থিতিশীল ভেরিয়েবলগুলিতে সরিয়ে নেওয়া হয়ত প্রচুর কোড সংরক্ষণ করতে পারে।

বা অ্যারে সূচকগুলি খুব ব্যয়বহুল হতে পারে তবে পয়েন্টার অপারেশনগুলি খুব সস্তা। ্য মচক্সফন্দক্স.

তবে অ্যাসেম্বলি ভাষার দিকে তাকানোই প্রথম পদক্ষেপ।


3
আপনার সংকলকটি কী করে তা আপনি জেনে রাখা অত্যন্ত গুরুত্বপূর্ণ। আমার কম্পাইলারটিতে আপনার কী ভাগ হওয়া উচিত তা দেখতে হবে। এটি বাচ্চাদের কাঁদে (আমার অন্তর্ভুক্ত)।
কর্টুক

8

সংকলক অপ্টিমাইজেশন, উদাহরণস্বরূপ, জিসিসিতে -Osগতি এবং কোড আকারের মধ্যে সেরা ভারসাম্য দেয়। এড়ান -O3, কারণ এটি কোডের আকার বাড়াতে পারে।


3
আপনি যদি এটি করেন তবে আপনাকে সর্বদা পরীক্ষা করতে হবে! সংকলকটি তৈরি করে এমন নতুন অনুমানের কারণে অপটিমাইজেশনগুলি ওয়ার্কিং কোডটি কাজ না করার কারণ হতে পারে।
রবার্ট

@ রবার্ট, এটি কেবলমাত্র সত্য যদি আপনি অপরিবর্তিত বিবৃতি ব্যবহার করেন: উদাহরণস্বরূপ a = a ++ -O0 এবং -O3 এ আলাদাভাবে সংকলন করবে।
টমাস ও

5
@ থমাস সত্য নয়। যদি আপনার কাছে ক্লকচক্রটি বিলম্বিত করার জন্য কোনও লুপ থাকে তবে অনেক অপ্টিমাইজার আপনার এতে কিছুই না করার বিষয়টি বুঝতে পারে এবং এটি সরিয়ে ফেলবে। এটি মাত্র 1 উদাহরণ।
কেলেনজবি

1
@ থমাস ও, আপনারও নিশ্চিত হওয়া দরকার যে আপনি অস্থির ফাংশন সংজ্ঞা সম্পর্কে সতর্ক রয়েছেন। অপ্টিমাইজারগুলি তাদের উড়িয়ে দেবে যেগুলি মনে করে যে তারা সি সম্পর্কে ভাল জানেন তবে তারা পারমাণবিক ক্রিয়াকলাপগুলির জটিলতা বুঝতে পারে না।
কর্টুক

1
সমস্ত ভাল পয়েন্ট। সংজ্ঞা অনুসারে উদ্বায়ী ফাংশন / ভেরিয়েবলগুলি অপ্টিমাইজ করা উচিত নয়। যে কোনও অপটিমাইজার (যেমন কল-টাইম এবং ইনলাইনিং সহ) অপ্টিমাইজেশন করে তা ভাঙ্গা।
থমাস ও

8

র‌্যামের জন্য, আপনার সমস্ত ভেরিয়েবলের ব্যাপ্তি পরীক্ষা করে দেখুন - আপনি কি এমন খাঁটি ব্যবহার করছেন যেখানে আপনি কোনও চর ব্যবহার করতে পারেন? বাফারগুলি কি তাদের প্রয়োজনের চেয়ে বড় হবে?

কোড স্কিচিং খুব অ্যাপ্লিকেশন এবং কোডিং-স্টাইল নির্ভর। আপনার পরিমাণগুলি বামে বোঝা যায় যে কোডটি ইতিমধ্যে কিছু চেপে গেলেও ইতিমধ্যে চলে গেছে, যার অর্থ হতে পারে যে কিছুটা বাকি আছে।

সামগ্রিক কার্যকারিতা সম্পর্কেও কড়া নজর দিন - এমন কি এমন কিছু আছে যা সত্যই ব্যবহৃত হয় নি এবং জেটসিসন করা যায়?


8

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


ধন্যবাদ মাইক! আমি অতীতে এটি চেষ্টা করেছি এবং প্রাপ্ত স্থানটি ইতিমধ্যে ব্যবহার করা হয়েছে! :) আইএআর সি সংকলক 3.21 ডি থেকে 3.40 এ উঠে গেছে।
ইন্টেলিচিক

1
আমি আরও একটি সংস্করণ স্থানান্তরিত করেছি, এবং বৈশিষ্ট্যটি ফিট করার জন্য আরও কিছু ফ্ল্যাশ পেয়েছি। আমি সত্যিই র‌্যামের সাথে লড়াই করছি যদিও তা অপরিবর্তিত রয়েছে। :(
ইন্টেলিচিক

7

স্থানটি অনুকূলকরণের বিকল্পগুলির জন্য আপনার সংকলক ম্যানুয়ালটি সর্বদা পরীক্ষণযোগ্য।

জিসিসির জন্য -ffunction-sectionsএবং লিঙ্কারের পতাকা -fdata-sectionsসহ --gc-sectionsডেড কোডটি সরিয়ে ফেলার জন্য ভাল।

এখানে আরও কিছু দুর্দান্ত টিপস রয়েছে (এভিআরের দিকে প্রস্তুত)


এটি কি আসলে কাজ করে? দস্তাবেজগুলি বলছে "আপনি যখন এই বিকল্পগুলি নির্দিষ্ট করেন, তখন এসেম্বলার এবং লিঙ্কার বৃহত্তর অবজেক্ট এবং এক্সিকিউটেবল ফাইল তৈরি করে এবং ধীরে ধীরে হবে" " আমি বুঝতে পারি যে পৃথক বিভাগ থাকা ফ্ল্যাশ এবং র‌্যাম বিভাগগুলির সাথে একটি মাইক্রোটির জন্য অর্থবোধ করে - ডক্সে এই বিবৃতিটি কি মাইক্রোকন্ট্রোলারদের জন্য প্রযোজ্য নয়?
কেভিন ভার্মির

আমার অভিজ্ঞতা হ'ল এটি এভিআর
টবি জাফি

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

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

6

বরাদ্দকৃত স্ট্যাক স্পেস এবং হিপ স্পেসের পরিমাণ পরীক্ষা করতে পারেন। এই দুটি বা উভয়ই বরাদ্দ পেলে আপনি যথেষ্ট পরিমাণে র্যাম ফিরে পেতে সক্ষম হতে পারেন।

আমার অনুমান (ব্যবহার একটি প্রকল্প যে RAM এর 2k মধ্যে ফিট শুরু করার সঙ্গে কোন ডাইনামিক মেমরি বরাদ্দকরণের জন্য হয় malloc, callocইত্যাদি)। যদি এটি হয় তবে আপনি মূলত লেখককে স্তূপের জন্য কিছু বরাদ্দ রেখেছেন বলে ধরে নিয়ে আপনি পুরোপুরি গাদা থেকে মুক্তি পেতে পারেন।

স্ট্যাকের আকার হ্রাস করার জন্য আপনাকে খুব সতর্কতা অবলম্বন করতে হবে কারণ এটি যে বাগগুলি খুঁজে পেতে খুব কঠিন cause পুরো স্ট্যাক স্পেসটি একটি পরিচিত মানের (0x00 বা 0xff ব্যতীত অন্য কিছু হিসাবে এই মানগুলি আগে থেকেই দেখা যায়) শুরু করে শুরু করতে সাহায্য করতে পারে তারপরে স্ট্যাকের জায়গাগুলি কতটা অব্যবহৃত রয়েছে তা দেখার জন্য কিছুক্ষণ সিস্টেম চালান।


এগুলি খুব ভাল পছন্দ। আমি নোট করব আপনার এম্বেড থাকা সিস্টেমে কখনও ম্যালোক ব্যবহার করা উচিত নয়।
কর্টুক

1
@ কর্টুক এটি আপনার এম্বেডের সংজ্ঞা এবং সম্পাদিত টাস্কটির উপর নির্ভর করে
টবি জাফি

1
@ জোবি, হ্যাঁ, আমি এটি বুঝতে পারি। 0 টি পুনঃসূচনা সহ একটি সিস্টেমে এবং লিনাক্সের মতো কোনও ওএসের অনুপস্থিতিতে মলোক খুব খারাপ হতে পারে।
কর্টুক

কোনও গতিশীল মেমরি বরাদ্দ নেই, এমন কোনও জায়গা নেই যেখানে মলোক, কলোক ব্যবহৃত হচ্ছে। আমি গাদা বরাদ্দও পরীক্ষা করে দেখেছি এবং এটি ইতিমধ্যে 0 তে সেট করা হয়েছে, সুতরাং কোনও গাদা বরাদ্দ নেই। বর্তমানে বরাদ্দ করা স্ট্যাকের আকার 254 বাইট এবং 128 বাইটে অন্তরায় স্ট্যাকের আকার।
ইন্টেলিচিক

5

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

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

আপনার কোডটিতে স্ট্রিং টেবিল, এইচটিএমএল পৃষ্ঠাগুলি বা পিক্সেল গ্রাফিক্স (আইকন) এর মতো ধীরে ধীরে ধীরে ধীরে ডেটা রয়েছে? যদি এটি যথেষ্ট পরিমাণে বড় হয় (10 কেবি বলুন), এটি ডেটা সঙ্কুচিত করার জন্য এবং প্রয়োজনে ফ্লাইটিকে ডিসক্রেস করার জন্য খুব সাধারণ কম্প্রেশন স্কিমটি কার্যকর করা উপযুক্ত।


এখানে 2 টি ছোট দেখার সারণী রয়েছে যার মধ্যে দুর্ভাগ্যক্রমে 10K এর পরিমাণ হবে না। এবং কোনও ভাসমান পয়েন্ট গণিতও ব্যবহার করা হচ্ছে না। :( যদিও পরামর্শের জন্য ধন্যবাদ They সেগুলি ভাল
ইনটেলিচিক

2

আপনি আরও অনেকগুলি কোডকে আরও কমপ্যাক্ট শৈলীতে পুনরায় সাজানোর চেষ্টা করতে পারেন। কোড কী করছে তার উপর এটি অনেক কিছু নির্ভর করে। মূল বিষয় হ'ল অনুরূপ জিনিসগুলি সন্ধান করা এবং একে অপরের পরিপ্রেক্ষিতে এগুলি পুনরায় প্রয়োগ করা। চরমটি হ'ল ফোরথের মতো উচ্চ স্তরের ভাষা ব্যবহার করা হবে যার সাহায্যে সি বা এসেম্বলারের চেয়ে উচ্চতর কোডের ঘনত্ব অর্জন করা সহজ easier

এম 16 ​​সি এর জন্য এখানে ফোর্থ


2

সংকলকটির অপ্টিমাইজেশন স্তর সেট করুন। অনেক আইডিই'র সেটিংস রয়েছে যা সংকলন-সময় ব্যয় করে কোড-আকারের অপ্টিমাইজেশনের অনুমতি দেয় (বা এমনকি কিছু ক্ষেত্রে এমনকি প্রক্রিয়া করার সময়ও)। তারা কয়েকবার তাদের অপ্টিমাইজারটিকে পুনরায় চালিত করে, কম-সাধারণ অপ্টিমাইজ-সক্ষম প্যাটার্নগুলি অনুসন্ধান করতে এবং নৈমিত্তিক / ডিবাগ সংকলনের জন্য প্রয়োজনীয় নাও হতে পারে এমন কৌশলগুলির সম্পূর্ণ অন্য হোস্টের মাধ্যমে কোড কমপ্যাক্টিং সম্পন্ন করতে পারে। সাধারণত, ডিফল্টরূপে, সংকলকগুলি মাঝারি স্তরের অপ্টিমাইজেশনে সেট থাকে। আপনার কিছু পূর্ণসংখ্যার ভিত্তিক অপ্টিমাইজেশনের স্কেল সন্ধান করতে সক্ষম হওয়া উচিত সেটিংসে প্রায় খনন।


1
বর্তমানে আকারের সর্বোচ্চের জন্য অনুকূলিত। :) যদিও পরামর্শ জন্য ধন্যবাদ. :)
ইন্টেলিচিক

2

আপনি যদি ইতিমধ্যে আইএআর এর মতো পেশাদার-স্তরের সংকলক ব্যবহার করে থাকেন তবে আমার মনে হয় আপনি ছোটখাটো নিম্ন-স্তরের কোড-টুইট করে যে কোনও গুরুতর সঞ্চয় পাওয়ার জন্য লড়াই করতে যাচ্ছেন - আপনাকে কার্যকারিতা অপসারণ বা বড় করার দিকে আরও তাকাতে হবে আরও কার্যকর উপায়ে অংশগুলির পুনর্লিখন। যে কেউ আসল সংস্করণটি লিখেছিল তার চেয়ে আপনার আরও চৌকস কোডার হওয়া দরকার ... র‌্যামের জন্য বর্তমানে এটি কীভাবে ব্যবহৃত হচ্ছে তা আপনাকে খুব কড়া নজর দেওয়া দরকার এবং একই র‌্যামের ওভারলেলিংয়ের ব্যবহারের সুযোগ রয়েছে কিনা তা দেখুন see বিভিন্ন সময়ে বিভিন্ন জিনিস (ইউনিয়নগুলি এর জন্য কার্যকর)। আইআর এর ডিফল্ট হিপ এবং স্ট্যাক মাপের এআরএম / এভিআরগুলিতে আমি বেশি উদার হয়ে পড়েছি, তাই এগুলি প্রথম দেখার বিষয় হবে।


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

স্ট্যাক সাইজের আকারটি কী উপযুক্ত তা আমি কীভাবে জানতে পারি?
ইন্টেলিচিক

2

অন্য কিছু যাচাই করার জন্য - কিছু আর্কিটেকচারের কিছু সংকলক র‌্যামে অনুলিপিগুলি অনুলিপি করেন - সাধারণত ফ্ল্যাশ ধ্রুবকগুলিতে অ্যাক্সেস ধীর / শক্ত (যেমন: এভিআর) হয় যখন আইআআর এর এভিআর সংকলকটিতে একটি ধ্রুবক র‌্যামে অনুলিপি না করার জন্য _ _ ফ্ল্যাশ কোয়ালিফার প্রয়োজন হয় )


ধন্যবাদ মাইক হ্যাঁ আমি ইতিমধ্যে এটি পরীক্ষা করে দেখেছি - এটি এম 16 ​​সি আইএআর সি সংকলকটির জন্য 'লিখনযোগ্য কনস্ট্যান্টস' বিকল্প বলে called এটি ROM থেকে র‌্যামে কনস্ট্যান্টগুলি অনুলিপি করে। এই প্রকল্পটি আমার প্রকল্পের জন্য চেক করা নেই। তবে সত্যই বৈধ চেক! ধন্যবাদ।
ইন্টেলিচিক

1

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

কিছু প্রসেসরের কলিং কনভেনশন রয়েছে যা কিছু পরামিতি-পাসিং শৈলীগুলি অন্যদের চেয়ে আরও দক্ষ করে তুলতে পারে। উদাহরণস্বরূপ, পিআইসি 18 কন্ট্রোলারগুলিতে, যদি কোনও রুটিন একটি একক বাইট প্যারামিটার নেয়, তবে এটি কোনও রেজিস্টারে পাস হতে পারে; যদি এর চেয়ে বেশি লাগে তবে সমস্ত পরামিতি অবশ্যই র‍্যামে পাস করতে হবে। যদি একটি রুটিন দুটি ওয়ান-বাইট পরামিতি নেয়, তবে এটি বিশ্বব্যাপী ভেরিয়েবলের মধ্যে একটি "পাস" করা এবং তারপরে অন্যটিকে পরামিতি হিসাবে পাস করা সবচেয়ে কার্যকর। ব্যাপকভাবে ব্যবহৃত রুটিনগুলির সাহায্যে সঞ্চয়গুলি আরও বাড়তে পারে। এগুলি বিশেষত তাৎপর্যপূর্ণ হতে পারে যদি বিশ্বব্যাপী প্রদত্ত প্যারামিটারটি একটি একক-বিট পতাকা হয়, বা তবে এর মান 0 বা 255 হয় (যেহেতু বিশেষ নির্দেশাবলীতে 0 বা 255 র‌্যামে সংরক্ষণ করার জন্য বিদ্যমান)।

এআরএম-তে, বৈশ্বিক ভেরিয়েবলগুলি যা প্রায়শই এক কাঠামোর সাথে একসাথে ব্যবহৃত হয় তা কোডের আকারকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে এবং কার্য সম্পাদনকে উন্নত করতে পারে। যদি এ, বি, সি, ডি, এবং ই পৃথক বৈশ্বিক চলক হয়, তবে যে কোডগুলির মধ্যে সমস্তটি ব্যবহার করে সেগুলি অবশ্যই প্রতিটি নিবন্ধের মধ্যে ঠিকানা লোড করতে হবে; যদি পর্যাপ্ত রেজিস্টার না থাকে তবে সেই ঠিকানাগুলি একাধিকবার পুনরায় লোড করা প্রয়োজন হতে পারে। বিপরীতে, যদি তারা একই বৈশ্বিক কাঠামো মাই স্টাফের অংশ হয়, তবে মাইস্টাফ.এ, মাই স্টাফ.বি ইত্যাদি ব্যবহার করে এমন কোডগুলি কেবল একবার মাই স্টাফের ঠিকানা লোড করতে পারে। বড় জয়.


1

1. যদি আপনার কোড অনেকগুলি কাঠামোর উপর নির্ভর করে তবে নিশ্চিত হয়ে নিন যে কাঠামোর সদস্যরা কমপক্ষে সবচেয়ে বেশি মেমরি দখল করে এমনগুলি থেকে আদেশ পেয়েছেন।

উদা: "uint32_t uint8_t uint8_t" "uint16_t uint8_t uint32_t" এর পরিবর্তে

এটি ন্যূনতম কাঠামোর প্যাডিং নিশ্চিত করবে।

2. প্রযোজ্য ভেরিয়েবলের জন্য কনস্টের ব্যবহার করুন। এটি নিশ্চিত করবে যে সেই পরিবর্তনশীলগুলি রমে থাকবে এবং র‌্যাম খাবে না


1

কয়েকটি গ্রাহকের কোড সংকুচিত করতে আমি কয়েকটি (সম্ভবত স্পষ্ট) কৌশল সফলভাবে ব্যবহার করেছি:

  1. বিট ক্ষেত্র বা বিট মাস্কগুলিতে কমপ্যাক্ট পতাকা। এটি উপকারী হতে পারে কারণ সাধারণত বুলিয়ানগুলি এইভাবে স্মৃতি নষ্ট করার জন্য পূর্ণসংখ্যা হিসাবে সংরক্ষণ করা হয়। এটি র্যাম এবং রম উভয়ই সাশ্রয় করবে এবং সাধারণত সংকলক দ্বারা সম্পন্ন হয় না।

  2. কোডে অপ্রয়োজনীয় সন্ধান করুন এবং বারবার বিবৃতি কার্যকর করতে লুপ বা ফাংশন ব্যবহার করুন।

  3. if(x==enum_entry) <assignment>এনাম এনট্রিগুলি অ্যারে সূচক হিসাবে ব্যবহার করা যেতে পারে সেদিকে খেয়াল রেখে আমি কোনও সূচকযুক্ত অ্যারের সাথে ধ্রুবকদের অনেক স্টেটমেন্ট প্রতিস্থাপন করে কিছু রম সংরক্ষণ করেছি care


0

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


1
যে কোনও শালীন সংকলককে ফ্যানসিটনের জন্য এটি স্বয়ংক্রিয়ভাবে করা উচিত যা কেবল একবার ডাকা হয়।
mikeselectricstuff

5
আমি খুঁজে পেয়েছি যে ইনিলাইনিং সাধারণত গতি অপ্টিমাইজেশনের জন্য বেশি কার্যকর এবং সাধারণত বর্ধিত আকারের দামে।
ক্রেগ ম্যাককুইন

ইনলাইনিং সাধারণত কোড আকার বাড়িয়ে তুলবে, তুচ্ছ ফাংশন ব্যতীতint get_a(struct x) {return x.a;}
দিমিত্রি গ্রিগরিয়েভ

0

স্থানীয় ভেরিয়েবলগুলি আপনার সিপিইউ নিবন্ধকের একই আকার হিসাবে পরিবর্তন করুন।

যদি সিপিইউ 32-বিট হয় তবে 32-বিট ভেরিয়েবলগুলি ব্যবহার করুন এমনকি সর্বাধিক মানটি কখনই 255 এর উপরে না আসবে I

প্রথম স্থানটি আমি দেখতে চাইছি হ'ল ফর-লুপ ভেরিয়েবলগুলি।

for( i = 0; i < 100; i++ )

এটি 8-বিট ভেরিয়েবলের জন্য ভাল জায়গা বলে মনে হতে পারে তবে 32-বিট ভেরিয়েবল কম কোড তৈরি করতে পারে।


এটি কোড সংরক্ষণ করতে পারে তবে এটি র‍্যাম খাবে।
মাইকেলেক্ট্রিক স্টাফ

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

2
সাধারণত এটি স্থানীয় ভেরিয়েবল সরবরাহ করে। যদি র‌্যামের সংক্ষিপ্ততা থাকে তবে গ্লোবাল ভারগুলির আকার, বিশেষত অ্যারেগুলি সঞ্চয়গুলি সন্ধানের জন্য ভাল জায়গা।
mikeselectricstuff

1
আর একটি সম্ভাবনা, মজার বিষয় হ'ল স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত ভেরিয়েবলগুলি প্রতিস্থাপন করা। যদি কোনও সংকলক একটি 32-বিট রেজিস্ট্রারে স্বাক্ষরবিহীন সংক্ষিপ্তটিকে সর্বোত্তম করে তোলে, এটির মান অবশ্যই 65535 থেকে শূন্যের মধ্যে আবৃত হবে তা নিশ্চিত করার জন্য এটি কোড যুক্ত করতে হবে। তবে, কম্পাইলার যদি একটি রেজিস্ট্রারে স্বাক্ষরিত সংক্ষিপ্তটিকে অনুকূল করে তোলে তবে এ জাতীয় কোনও কোডের প্রয়োজন নেই। একটি সংক্ষিপ্ত পরিমাণ 32767 এর বাইরে বাড়ানো হলে কী হবে তার কোনও গ্যারান্টি নেই বলেই, কম্পাইলাররা এটি মোকাবেলায় কোড নির্গত করতে হবে না। কমপক্ষে দু'টি এআরএম সংকলককে আমি দেখেছি, স্বাক্ষরযুক্ত-শর্ট কোড স্বাক্ষরযুক্ত-শর্ট কোডের চেয়ে ছোট কারণ হতে পারে।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.