@ ভিস্যাটাকুর উত্তরটি বেশ বিস্তৃত। একটি অতিরিক্ত বিষয় লক্ষণীয় হ'ল প্রোগ্রাম এবং ডেটা মেমরি সহ আই / ও অ্যাক্সেস করার সময় সিপিইউ ওয়েট স্টেটগুলিতে (স্থবির সিপিইউ চক্র) চলতে পারে ।
উদাহরণস্বরূপ, আমরা একটি টিআই F28335 ডিএসপি ব্যবহার করছি; র্যামের কিছু অঞ্চল প্রোগ্রাম এবং ডেটা মেমরির জন্য 0-অপেক্ষার স্থিতি থাকে, সুতরাং আপনি যখন র্যামে কোড চালাবেন, তখন এটি প্রতি নির্দেশ 1 টি চক্রের সাথে চালিত হয় (সেই নির্দেশিকাগুলি যা 1 টির বেশি চক্র গ্রহণ করে except আপনি যখন FLASH মেমরি থেকে কোড নির্বাহ করেন (অন্তর্নির্মিত EEPROM, আরও কম), তবে, এটি পুরো 150MHz এ চালাতে পারে না এবং এটি বেশ কয়েকগুণ ধীর হয়।
উচ্চ-গতির বিঘ্নিত কোডের প্রতি সম্মান সহ, আপনাকে অবশ্যই বেশ কয়েকটি জিনিস শিখতে হবে।
প্রথমত, আপনার সংকলকটির সাথে খুব পরিচিত হন। যদি সংকলকটি একটি ভাল কাজ করে তবে বেশিরভাগ জিনিসের জন্য এটি হ্যান্ড-কোডেড অ্যাসেমব্লির চেয়ে ধীর হওয়া উচিত নয়। (যেখানে "এত ধীর গতিতে": আমার দ্বারা 2 এর একটি ফ্যাক্টর ঠিক হয়ে যাবে; 10 এর একটি ফ্যাক্টর গ্রহণযোগ্য হবে না) আপনাকে কীভাবে (এবং কখন) সংকলক অপ্টিমাইজেশন পতাকা ব্যবহার করতে হবে তা শিখতে হবে এবং একবারে একবারে আপনাকে দেখতে হবে এটি কীভাবে হয় তা দেখতে কম্পাইলারের আউটপুট এ।
স্পিডআপ কোডের জন্য আপনার সংকলকটি করতে পারেন এমন আরও কিছু জিনিস:
ইনলাইন ফাংশনগুলি ব্যবহার করুন (সি এটি সমর্থন করে কিনা তা মনে করতে পারে না বা এটি কেবলমাত্র একটি সি ++ - আইএসএম) উভয়ই ছোট ফাংশনের জন্য এবং কেবল একবার বা দু'বার কার্যকর করা হবে এমন ফাংশনগুলির জন্য। ডাউনসাইড হ'ল ইনলাইন ফাংশনগুলি ডিবাগ করা শক্ত, বিশেষত যদি সংকলক অপ্টিমাইজেশন চালু থাকে। তবে তারা আপনাকে অপ্রয়োজনীয় কল / রিটার্ন সিকোয়েন্সগুলি সংরক্ষণ করে, বিশেষত যদি "ফাংশন" বিমূর্ততা কোড প্রয়োগের পরিবর্তে ধারণাগত ডিজাইনের উদ্দেশ্যে হয়।
এটির অভ্যন্তরীণ ফাংশন রয়েছে কিনা তা দেখতে আপনার সংকলকের ম্যানুয়ালটি দেখুন - এটি সংকলক-নির্ভর অন্তর্নির্মিত ফাংশন যা প্রসেসরের সমাবেশ নির্দেশিকায় সরাসরি ম্যাপ করে; কিছু প্রসেসরের সমাবেশ সংক্রান্ত নির্দেশনা রয়েছে যা দরকারী জিনিসগুলি যেমন ন্যূনতম / সর্বোচ্চ / বিট বিপরীত করে এবং আপনি এটি করে সময় সাশ্রয় করতে পারেন।
আপনি যদি সংখ্যার গণনা করছেন, তা নিশ্চিত করুন যে আপনি অকারণে গণিত-গ্রন্থাগার ফাংশন কল করছেন না। আমাদের একটি কেস ছিল যেখানে কোডটি এমন y = (y+1) % 4
কাউন্টারের মতো ছিল যা 4 পিরিয়ড ছিল, সংকলকটি 4 মডেলটিকে বিটওয়াইস-এন্ড হিসাবে বাস্তবায়ন করবে বলে আশা করেছিল। পরিবর্তে এটি গণিত গ্রন্থাগার বলা হয়। তাই আমরা y = (y+1) & 3
যা চেয়েছিলাম তা করার জন্য প্রতিস্থাপন করেছি।
বিট-টুইডলিং হ্যাক্স পৃষ্ঠাটির সাথে পরিচিত হন । আমি গ্যারান্টি দিচ্ছি আপনি প্রায়শই এর মধ্যে কমপক্ষে একটি ব্যবহার করবেন।
কোড এক্সিকিউশন সময় পরিমাপ করতে আপনার সিপিইউর টাইমার পেরিফেরালগুলি ব্যবহার করা উচিত - তাদের বেশিরভাগের টাইমার / কাউন্টার রয়েছে যা সিপিইউ ঘড়ির ফ্রিকোয়েন্সি চালানোর জন্য সেট করা যেতে পারে। আপনার সমালোচনামূলক কোডের শুরু এবং শেষের দিকে কাউন্টারটির একটি অনুলিপি ক্যাপচার করুন এবং আপনি দেখতে পারেন যে এটি কতক্ষণ সময় নেয়। যদি আপনি এটি না করতে পারেন তবে অন্য বিকল্পটি হ'ল আপনার কোডের শুরুতে একটি আউটপুট পিনটি কমিয়ে আনা এবং শেষে এটিকে উত্থাপন করা এবং মৃত্যুর সময় নির্বাহের সময় একটি অসিস্কলকে এই আউটপুটটি দেখুন। প্রতিটি পদ্ধতির ট্রেড অফ রয়েছে: অভ্যন্তরীণ টাইমার / কাউন্টারটি আরও নমনীয় (আপনি বেশ কয়েকটি জিনিসের সাথে সময় কাটাতে পারেন) তবে তথ্য আউট করা আরও শক্ত, যেখানে কোনও আউটপুট পিন সেট / ক্লিয়ারিং কোনও সুযোগে তত্ক্ষণাত দৃশ্যমান হয় এবং আপনি পরিসংখ্যান ক্যাপচার করতে পারেন তবে একাধিক ইভেন্টের পার্থক্য করা শক্ত।
অবশেষে, একটি অত্যন্ত গুরুত্বপূর্ণ দক্ষতা রয়েছে যা অভিজ্ঞতার সাথে আসে - উভয়ই সাধারণ এবং নির্দিষ্ট প্রসেসর / সংকলক সংমিশ্রণগুলি: কখন কখন অনুকূলিত হবে না তা জেনে । সাধারণভাবে উত্তরটি অনুকূলিত হয় না। ডোনাল্ড নথের উদ্ধৃতি স্ট্যাকওভারফ্লোতে সাধারণত পোস্ট করা হয় (সাধারণত কেবলমাত্র শেষ অংশ):
আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলুন: অকাল অনুকূলতা হ'ল সমস্ত মন্দের মূল
তবে আপনি এমন পরিস্থিতিতে আছেন যেখানে আপনি জানেন যে আপনাকে কোনও ধরণের অপ্টিমাইজেশন করতে হবে, তাই বুলেটটি কামড়ানোর এবং অনুকূলিতকরণের (বা একটি দ্রুত প্রসেসর বা উভয়ই পেতে হবে) সময় এসেছে। না না সমাবেশ আপনার পুরো ISR লিখুন। এটি প্রায় একটি গ্যারান্টিযুক্ত দুর্যোগ - যদি আপনি এটি করেন তবে কয়েক মাস বা সপ্তাহের মধ্যে আপনি কী করেছেন এবং কেন কিছু করেছেন তা ভুলে যাবেন এবং কোডটি সম্ভবত খুব ভঙ্গুর এবং পরিবর্তন হতে পারে। সেখানে আপনার কোড অংশ হওয়ার সম্ভাবনা যে, তবে, হয় সমাবেশ জন্য ভাল প্রার্থী।
আপনার কোডের অংশগুলি সমাবেশ-কোডিংয়ের জন্য উপযুক্ত Sign
- ফাংশনগুলি যা ভালভাবে অন্তর্ভুক্ত রয়েছে, ভাল-সংজ্ঞায়িত ছোট রুটিনগুলি পরিবর্তনের সম্ভাবনা নেই
- সুনির্দিষ্ট সমাবেশ নির্দেশাবলী (ন্যূনতম / সর্বাধিক / ডান শিফট ইত্যাদি) ব্যবহার করতে পারে এমন ফাংশন
- যে ফাংশনগুলি বহুবার কল করা হয় (আপনি একটি গুণক পাবেন: আপনি যদি প্রতিটি কলটিতে 0.5 ইউসেক সংরক্ষণ করেন এবং এটি 10 বার কল করা হয় যা আপনাকে 5 ব্যবহারকারের সাশ্রয় করে যা আপনার ক্ষেত্রে গুরুত্বপূর্ণ)
আপনার সংকলকের ফাংশন কলিং কনভেনশনগুলি শিখুন (যেমন এটি নিবন্ধগুলিতে আর্গুমেন্ট রাখে এবং কোনটি এটি সংরক্ষণ / পুনরুদ্ধারগুলিতে নিবন্ধভুক্ত করে) যাতে আপনি সি-কলযোগ্য সমাবেশের রুটিন লিখতে পারেন।
আমার বর্তমান প্রকল্পে, আমাদের কাছে সমালোচনামূলক কোড সহ একটি চমত্কার বৃহত কোডবেস রয়েছে যা 10 কেএইচজেড বিঘ্নিতভাবে চালাতে হবে (100 কাস্ক - পরিচিত শব্দ?) এবং অ্যাসেমব্লিতে লেখা অনেকগুলি ফাংশন নেই। সেগুলি হ'ল সিআরসি গণনা, সফ্টওয়্যার সারি, এডিসি লাভ / অফসেট ক্ষতিপূরণের মতো জিনিস।
শুভকামনা!