বিকাশ এবং ডিবাগিং পর্যায়ের সময়গুলি কী এটি সত্যই অনুশীলনযোগ্য অপ্টিমাইটিজেশন অক্ষম করে?


15

আমি সি তে 16-বিট পিআইসি মাইক্রোকন্ট্রোলারগুলি প্রোগ্রামিং পড়েছি এবং বইটিতে এই নিশ্চয়তা রয়েছে:

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

আমি স্বীকার করি আমি কিছুটা বিভ্রান্ত ছিলাম। আমি বুঝতে পারিনি যে লেখক সি 30 মূল্যায়ন সময়ের কারণে বা এটি সত্যিই একটি ভাল অনুশীলন বলেছিল ।

আমি জানতে চাই আপনি আসলে এই অনুশীলনটি ব্যবহার করেন কিনা এবং কেন?

উত্তর:


16

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

এটি বুঝতে পারে যে আপনি এমন একটি সংখ্যা গণনা করছেন যা অতিরিক্ত লেখার আগে আপনি কিছু করেন না। সেক্ষেত্রে এটি অকেজো গণনা দূর করতে পারে।

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

তবে আপনার কোডের উপর নির্ভর করে আপনার এই বিষয়ে সতর্কতা অবলম্বন করা উচিত, অপ্টিমাইজেশান জিনিসগুলি ভেঙে দিতে পারে! সঠিকভাবে কার্যকর অপ্টিমাইজার দ্বারা বিভক্ত সাধারণ কোডটিতে আসলে কিছুটা বগি কোড যা কোনও কিছু থেকে দূরে চলেছে, তাই আপনি সাধারণত অপ্টিমাইজারটি কেন এটি ভেঙে দেয় তা নির্ধারণ করতে চান want


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

আমি এই সম্পর্কে আরও কোথায় জানতে পারি?
ড্যানিয়েল গ্রিলো

আমি সি 30 সংকলকটির সাথে কাজ করি নি তবে সি 18 সংকলকটির জন্য সংকলকটির জন্য একটি অ্যাপ নোট / ম্যানুয়াল ছিল যা এটি অনুকূলিত করে যা অপ্টিমাইজেশন সমর্থন করে।
চিহ্নিত করুন

@ ও এঞ্জেনিহিরো: এটি কী অপটিমাইজেশন সমর্থন করে তার জন্য আপনার সংকলক ডক্স পরীক্ষা করুন। সংকলক, গ্রন্থাগার এবং টার্গেট আর্কিটেকচারের উপর নির্ভর করে অপটিমাইজেশন বুনোভাবে পরিবর্তিত হয়।
মাইকেল কোহেন

আবার, সি 30 সংকলকের জন্য নয়, জিসিসি বিভিন্ন অপ্টিমাইজেশনের একটি দীর্ঘ তালিকা প্রকাশ করে যা প্রয়োগ করা যেতে পারে। আপনি অক্ষত রাখতে চান এমন একটি নির্দিষ্ট নিয়ন্ত্রণ কাঠামো ক্ষেত্রে যদি আপনি সূক্ষ্ম দানাযুক্ত অপ্টিমাইজেশন পেতে এই তালিকাটিও ব্যবহার করতে পারেন। তালিকাটি এখানে: gcc.gnu.org/onlinesocs/gcc/Optimize-Options.html
কেভিন

7

আমি এই প্রশ্নটি জ্যাক গ্যানসেলের কাছে প্রেরণ করেছি এবং তিনিই আমাকে উত্তর দিয়েছেন:

ড্যানিয়েল,

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

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

সব সেরা, জ্যাক


আমি মনে করি এই প্রতিক্রিয়াতে দুটি অনুচ্ছেদের মধ্যে একটি অবিচ্ছিন্ন পার্থক্য রয়েছে। টেস্টিং এমন একটি প্রক্রিয়া বোঝায় যা নরম, দৃ ,় এবং / অথবা শক্ত জিনিস সঠিকভাবে কাজ করে তা প্রমাণ করার জন্য। ডিবাগিং হ'ল প্রক্রিয়াটি যেখানে কোডটি নির্দেশনা দ্বারা নির্দেশের মাধ্যমে পদক্ষেপ নেওয়া হচ্ছে তা কেন কাজ করছে না তা দেখার জন্য [এখনও]।
কেভিন ভার্মির

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

@reemrevnivek, আপনি যখন ডিবাগ করছেন, আপনিও পরীক্ষা করছেন না?
ড্যানিয়েল গ্রিলো

@ ও এনজেনহেরো - না। পরীক্ষায় ব্যর্থ হলে আমি কেবল ডিবাগ করি।
কেভিন ভার্মির

6

নির্ভর করে এবং কেবলমাত্র সি 30 নয় সমস্ত সরঞ্জামের ক্ষেত্রে এটি সত্য।

অপ্টিমাইজেশন প্রায়শই বিভিন্ন উপায়ে কোডটি সরিয়ে এবং / অথবা পুনর্গঠন করে। আপনার সুইচ স্টেটমেন্টটি যদি / অন্যটি নির্মাণ করে বা কিছু ক্ষেত্রে সমস্ত একসাথে মুছে ফেলা হতে পারে তবে পুনরায় প্রয়োগ করতে পারে। y = x * 16 ধারাবাহিকভাবে বাম শিফট ইত্যাদির সাথে প্রতিস্থাপন করতে পারে যদিও এই শেষ ধরণের অপ্টিমাইজেশানটি সাধারণত এখনও পদক্ষেপ নেওয়া যেতে পারে, বেশিরভাগ ক্ষেত্রে নিয়ন্ত্রণ বিবৃতিটির পুনর্গঠন যা আপনাকে পেয়ে যায়।

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

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

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

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


5

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

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


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

3

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

একটি সাধারণ ব্যর্থতা মোড হ'ল যখন অপরিবর্তনীয়তা বৃদ্ধির কারণে পূর্বের অদেখা বাগগুলি স্থলভাগের দিকে নিয়ে যায় কারণ আপনার প্রয়োজনীয় পরিবর্তনগুলি অস্থির হিসাবে যেমন ঘোষণা করা হয়নি যেখানে প্রয়োজন হয় - কম্পাইলারটি জানানোর জন্য প্রয়োজনীয় যা কোন বিষয়টিকে 'অনুকূলিত করা উচিত নয়'।


2

আপনি যে ফর্মের সাথে প্রকাশ করতে যাচ্ছেন, ডিবাগার এবং সংকলনের জন্য যে কোনও ফর্ম ব্যবহার করুন আপনি মুক্তির জন্য সংকলন না করা অবধি দেখতে পাবেন না এমন অনেকগুলি বাগ (একটি প্রচুর) আড়াল করে। ততক্ষণে এই বাগগুলি খুঁজে পাওয়া খুব শক্ত, বনাম ডিবাগিং আপনি যাওয়ার সাথে সাথে। 20 এখন কয়েক বছর এবং আমি কখনই কোনও জিডিবি বা অন্য ডিবাগারের মতো ব্যবহার করতে পারি নি, ভেরিয়েবলগুলি বা একক পদক্ষেপ দেখার প্রয়োজন নেই। প্রতিদিন কয়েক হাজার থেকে হাজার লাইনে lines সুতরাং এটি সম্ভব, অন্যথায় ভাবা নেতৃত্ব না।

ডিবাগের জন্য সংকলন করে পরে মুক্তির জন্য সংকলন করতে পারলে দ্বিগুণেরও বেশি সময় লাগবে। যদি আপনি একটি বাঁধাই হয়ে যান এবং কোনও ডিবাগারের মতো কোনও সরঞ্জাম ব্যবহার করতে হয় তবে নির্দিষ্ট সমস্যার মধ্য দিয়ে কাজ করতে ডিবাগারটির জন্য সংকলন করুন, তারপরে আবার স্বাভাবিক ক্রিয়ায় ফিরে যান।

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


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

2

আমি সর্বদা -O0 সহ কোড বিকাশ করি (অপ্টিমাইজেশন বন্ধ করার জন্য জিসিসি বিকল্প)। যখন আমি অনুভব করি যে আমি যে মুহুর্তে জিনিসগুলিকে একটি মুক্তির দিকে এগিয়ে যেতে শুরু করতে চাই, তখন আমি ওএস (আকারের জন্য অনুকূলিতকরণ) দিয়ে শুরু করব কারণ সাধারণত আপনি যত বেশি কোড ক্যাশে রাখতে পারেন তা তত ভাল হবে, এমনকি এটি সুপার-ডুপারটি অনুকূল নয়।

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

যদি সত্যিই আমার প্রয়োজন হয়, আমি -fcata- বিভাগ এবং --fcode- বিভাগগুলিতে --gc- বিভাগ যুক্ত করা শুরু করব, যা লিঙ্কারটিকে পুরো ব্যবহৃত ফাংশন এবং ডেটা বিভাগগুলিকে সরাতে দেয় যা আসলে ব্যবহৃত হয় না। জিনিসগুলি আরও সংকুচিত করার বা জিনিসগুলি দ্রুততর করার চেষ্টা করার জন্য আপনি অনেক ছোট ছোট জিনিস ব্যবহার করতে পারেন তবে এগুলি কেবলমাত্র আমি ব্যবহার করে শেষ করি এবং আরও ছোট বা দ্রুত হতে পারে যেগুলি আমি হাতে করে দেই -একত্রিত করা.


2

হ্যাঁ, ডিবাগিংয়ের সময় অপ্টিমাইজেশানগুলি অক্ষম করা কিছু সময়ের জন্য সেরা অভ্যাস ছিল, তিনটি কারণে:

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

অনেক লোক এই দিকে আরও এগিয়ে যায়, এবং দৃser়তার সাথে জাহাজটি চালু করে


সমাবেশ কোডের মাধ্যমে সিঙ্গেল-স্টেপিং কেসগুলি নির্ণয়ের জন্য খুব কার্যকরী হতে পারে যেখানে উত্স কোডটি দেখতে দেখতে দেখতে অন্যরকম কিছু নির্দিষ্ট করে (যেমন "লংভার 1 & = ~ 0x40000000; লংভার 2 & = ~ 0x80000000;") বা যেখানে সংকলক বগি কোড উত্পন্ন করে । আমি মেশিন-কোড ডিবাগারগুলি ব্যবহার করে কিছু সমস্যা সন্ধান করেছি যা আমি সত্যিই মনে করি না যে আমি অন্য কোনও উপায়ে ট্র্যাক করতে পারতাম।
সুপারক্যাট

2

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


2

বিরতি পয়েন্টগুলির ক্ষেত্রে এটি অবশ্যই বোধগম্য হয় ... কারণ সংকলক প্রচুর পরিমাণে বিবৃতি সরিয়ে ফেলতে পারে যা আসলে স্মৃতিতে প্রভাব ফেলে না।

এরকম কিছু বিবেচনা করুন:

int i =0;

for (int j=0; j < 10; j++)
{
 i+=j;
}
return 0;

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

for (int j=delay; j != 0; j--)
{
    asm( " nop " );
    asm( " nop " );
}
return 0;

1

আপনি যদি ডিবাগার ব্যবহার করছেন তবে আমি অপ্টিমাইজেশন অক্ষম করব এবং ডিবাগ সক্ষম করব।

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


1

আপনার সংকলনটিতে অপ্টিমাইজেশন সক্ষম করার বিরুদ্ধে বেশিরভাগ যুক্তি নীচে নেমে আসে:

  1. ডিবাগিংয়ের সমস্যা (JTAG সংযোগ, ব্রেকপয়েন্টস ইত্যাদি)
  2. ভুল সফ্টওয়্যার সময়
  3. sh * t সঠিকভাবে কাজ করা বন্ধ করে দেয়

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

একাডেমিয়ায় এম্বেড করা ব্লগের অপরিজ্ঞাত আচরণ সম্পর্কে বলার জন্য দুটি বা দুটি কথা রয়েছে এবং সংকলকরা কীভাবে এটি কাজে লাগায় সে সম্পর্কে এই পোস্টটি রয়েছে: http://blog.regehr.org/archives/761


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