অকাল-আলোচনা সন্নিবেশ করান-সমস্ত-অশুভ বক্তৃতা-এর-মূল-মূল
এটি বলেছিল, অপ্রয়োজনীয় দক্ষতা এড়ানোর জন্য আমি কিছু অভ্যাসগুলি গ্রহণ করেছি এবং কিছু ক্ষেত্রে আমার কোডটিকে আরও সহজ এবং আরও সঠিক করে তুলেছি।
এটি সাধারণ নীতিগুলির আলোচনা নয়, তবে কোডে অপ্রয়োজনীয় অদক্ষতার পরিচয় দেওয়া এড়াতে কিছু বিষয় সম্পর্কে সচেতন হতে হবে।
আপনার বিগ-ও জানুন
এটি সম্ভবত উপরের দীর্ঘ আলোচনায় মার্জ করা উচিত। এটি বেশ সাধারণ জ্ঞান যে একটি লুপের ভিতরে একটি লুপ, যেখানে অভ্যন্তরীণ লুপটি গণনার পুনরাবৃত্তি করে, এটি ধীর হয়ে যায়। উদাহরণ স্বরূপ:
for (i = 0; i < strlen(str); i++) {
...
}
স্ট্রিংটি সত্যিই দীর্ঘ হলে এটি একটি ভয়াবহ সময় গ্রহণ করবে, কারণ লুপটির প্রতিটি পুনরাবৃত্তিতে দৈর্ঘ্যটি পুনঃ গণনা করা হচ্ছে। নোট করুন যে জিসিসি প্রকৃতপক্ষে এই কেসটিকে অনুকূল করে কারণ strlen()
একটি খাঁটি ফাংশন হিসাবে চিহ্নিত রয়েছে।
যখন মিলিয়ন 32-বিট পূর্ণসংখ্যার বাছাই করা হয় তখন বুদ্বুদ সাজানোর পক্ষে ভুল পথ হবে । সাধারণভাবে, ও (এন * লগ এন) সময়ে বাছাই করা যেতে পারে (বা আরও ভাল, র্যাডিক্স সাজানোর ক্ষেত্রে), সুতরাং আপনি যদি না জানেন যে আপনার ডেটা ছোট হতে চলেছে, একটি অ্যালগরিদম সন্ধান করুন যা কমপক্ষে ও (এন) * লগ এন)
একইভাবে, ডাটাবেসগুলির সাথে কাজ করার সময় সূচী সম্পর্কে সচেতন হন। যদি আপনার SELECT * FROM people WHERE age = 20
এবং আপনার লোকের (বয়স) কোনও সূচক না থাকে তবে এটির জন্য খুব দ্রুত ও (লগ এন) সূচক স্ক্যানের চেয়ে ও (এন) অনুক্রমিক স্ক্যানের প্রয়োজন হবে।
পূর্ণসংখ্যার গাণিতিক শ্রেণিবিন্যাস
সি তে প্রোগ্রামিং করার সময়, মনে রাখবেন যে কয়েকটি গাণিতিক ক্রিয়াকলাপ অন্যের চেয়ে ব্যয়বহুল। পূর্ণসংখ্যার জন্য, শ্রেণিবিন্যাসটি এরকম কিছু হয় (কমপক্ষে ব্যয়বহুল আগে):
মঞ্জুর, সংকলকটি সাধারণত আপনি মূলধারার কম্পিউটারটিকে টার্গেট n / 2
করা থাকলে n >> 1
স্বয়ংক্রিয়ভাবে পছন্দ করার মতো জিনিসগুলি অনুকূল করে তুলবেন তবে আপনি যদি এমবেডেড ডিভাইসটিকে লক্ষ্য করে দেখছেন তবে আপনি সেই বিলাসিতা পাবেন না।
এছাড়াও, % 2
এবং & 1
বিভিন্ন শব্দার্থবিজ্ঞান আছে। বিভাগ এবং মডুলাস সাধারণত শূন্যের দিকে ঘুরতে থাকে তবে এটি বাস্তবায়ন সংজ্ঞায়িত হয়। ভাল ওল ' >>
এবং &
সর্বদা নেতিবাচক অনন্তের দিকে ঘোরা, যা (আমার মতে) অনেক বেশি অর্থবোধ করে। উদাহরণস্বরূপ, আমার কম্পিউটারে:
printf("%d\n", -1 % 2); // -1 (maybe)
printf("%d\n", -1 & 1); // 1
অতএব, বোঝার জন্য ব্যবহার করুন। আপনি % 2
যখন লিখতে যাবেন ঠিক তখন ব্যবহার করে আপনি ভাল ছেলে হবেন না & 1
।
ব্যয়বহুল ভাসমান পয়েন্ট অপারেশন
ভারী ভাসমান পয়েন্ট অপারেশনগুলি এড়িয়ে চলুন যেমন কোডে pow()
এবং কোডগুলিতে log()
সত্যই তাদের প্রয়োজন হয় না, বিশেষত পূর্ণসংখ্যার সাথে ডিল করার সময়। উদাহরণস্বরূপ, একটি সংখ্যা পড়ুন:
int parseInt(const char *str)
{
const char *p;
int digits;
int number;
int position;
// Count the number of digits
for (p = str; isdigit(*p); p++)
{}
digits = p - str;
// Sum the digits, multiplying them by their respective power of 10.
number = 0;
position = digits - 1;
for (p = str; isdigit(*p); p++, position--)
number += (*p - '0') * pow(10, position);
return number;
}
এই ব্যবহারটি কেবল pow()
(এবং int
<-> double
রূপান্তরগুলি ব্যবহার করার প্রয়োজন) নয় কেবল ব্যয়বহুল, তবে এটি নির্ভুল ক্ষতির জন্য একটি সুযোগ তৈরি করে (ঘটনাক্রমে, উপরের কোডটিতে যথাযথ সমস্যা নেই)। এই কারণেই আমি যখন গাণিতিক প্রসঙ্গে ব্যবহৃত এই ধরণের ফাংশনটি দেখি w
এছাড়াও লক্ষ্য করুন যে নীচের "চালাক" অ্যালগরিদমটি যা প্রতিটি পুনরাবৃত্তিতে 10 দ্বারা গুণিত হয়, উপরের কোডের তুলনায় আসলে আরও সংক্ষিপ্ত:
int parseInt(const char *str)
{
const char *p;
int number;
number = 0;
for (p = str; isdigit(*p); p++) {
number *= 10;
number += *p - '0';
}
return number;
}