ডিবাগ বনাম মুক্তির কর্মক্ষমতা


132

আমি নিম্নলিখিত অনুচ্ছেদের মুখোমুখি হয়েছি:

"ভিজুয়াল স্টুডিওতে আপনার কোডটি সংকলন করার সময় আইডিইতে ডিবাগ বনাম রিলিজ সেটিং কার্য সম্পাদনকে প্রায় কোনও পার্থক্য দেয় না ... উত্পন্ন কোডটি প্রায় একই রকম। সি # সংকলক আসলে কোনও অপ্টিমাইজেশন করে না। সি # সংকলকটি কেবলমাত্র আইএলকে স্পিট করে ... এবং রানটাইমের সময় এটি জিতার যা সমস্ত অপ্টিমাইজেশন করে। JITer এর একটি ডিবাগ / রিলিজ মোড রয়েছে এবং এটি পারফরম্যান্সে একটি বিশাল পার্থক্য করে। তবে আপনি কী আপনার প্রকল্পের ডিবাগ চালনা বা মুক্তি কনফিগারেশন চালিয়ে যাবেন না, এটি কোনও ডিবাগার সংযুক্ত কিনা তা বন্ধ করে দেয় ”

উত্সটি এখানে এবং পডকাস্ট এখানে

কেউ আমাকে এমন কোনও মাইক্রোসফ্ট নিবন্ধের দিকে পরিচালিত করতে পারেন যা বাস্তবে এটি প্রমাণ করতে পারে?

Googling " সি ডিবাগ বনাম মুক্তি কর্মক্ষমতা # " বেশিরভাগ বলার অপেক্ষা রাখে না "ফলাফল ফেরৎ ডিবাগ কর্মক্ষমতা হিট অনেক আছে ", " মুক্তি অপ্টিমাইজ করা হয় ", এবং " উৎপাদন ডিবাগ স্থাপন না "।



উইন 7-এক্স 86 এ নেট 4 সহ, আমার একটি সিপিইউ সীমিত প্রোগ্রাম রয়েছে যা আমি লিখেছি যে মূল লুপটিতে কোনও দাবী / ইত্যাদি না দিয়ে ডিবাগের চেয়ে মুক্তি পেতে প্রায় 2x দ্রুত চলে।
বেনজি

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

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

উত্তর:


99

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

  • অব্যবহৃত ভেরিয়েবলগুলি মোটেই সংকলিত হয় না
  • কিছু লুপ ভেরিয়েবলগুলি আক্রমণকারী হিসাবে প্রমাণিত হলে সংকলক দ্বারা লুপ থেকে বাইরে নিয়ে যায়
  • #debug ডিরেক্টরিতে লিখিত কোড অন্তর্ভুক্ত নয়, ইত্যাদি etc.

বাকীটি জেআইটি-র উপর।

এখানে এরিক লিপার্টের সৌজন্যে অপ্টিমাইজেশনের সম্পূর্ণ তালিকা ।


10
এবং ডিবাগ.এসার্টস সম্পর্কে ভুলবেন না! DEBUG বিল্ডে, যদি তারা ব্যর্থ হয় তবে তারা থ্রেডটি থামিয়ে একটি বার্তা বাক্স পপ আপ করবে। মুক্তিতে তারা মোটেও সংকলিত হয় না। এটি [শর্তাধীন অ্যাট্রিবিউট] থাকা সমস্ত পদ্ধতির জন্য প্রযোজ্য।
ইভান জ্লাতানোভ

13
সি # সংকলক টেল কল অপ্টিমাইজেশন করে না; বিড়বিড় করে অপ্টিমাইজ স্যুইচ চালু থাকাকালীন আপনি সি # সংকলকটি
এরিক লিপার্ট

63

কোনও পারফরম্যান্স প্রশ্ন সম্পর্কে "প্রমাণিত" কোন নিবন্ধ নেই। পরিবর্তনের পারফরম্যান্স প্রভাব সম্পর্কে দৃser়তা প্রমাণের উপায় হ'ল উভয় উপায়ে চেষ্টা করা এবং এটি বাস্তব-তবে-নিয়ন্ত্রিত অবস্থার অধীনে পরীক্ষা করা।

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

এবং তদুপরি, আপনি অর্থবহ ফলাফল পেতে সক্ষম হবেন। "ধীর" অর্থহীন কারণ এটি মাইক্রোসেকেন্ড ধীর বা বিশ মিনিট ধীর কিনা তা পরিষ্কার নয়। "বাস্তবসম্মত পরিস্থিতিতে 10% ধীর" আরও অর্থবহ ful

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


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

11

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


আমি এই বিষয়ে আপনার সাথে একমত, কিন্তু এটি মূল প্রশ্নের উত্তর দেয় না
স্যাগি

5
@ সাগি: হ্যাঁ, আমি এটি সম্পর্কে অবহিত কিন্তু আমি ভেবেছিলাম যে বিষয়টি এখনও কার্যকর করার মতো নয়।
কনরাড রুডল্ফ

6

এমএসডিএন সামাজিক থেকে

এটি ভালভাবে নথিভুক্ত করা হয়নি, আমি যা জানি তা এখানে। সংকলকটি System.Diagnostics.DebuggableAttribute এর একটি উদাহরণ প্রকাশ করে। ডিবাগ সংস্করণে, IsJitOptimizerEn सक्षम সম্পত্তিটি সত্য, মুক্তির সংস্করণে এটি মিথ্যা। আপনি এই বৈশিষ্ট্যটি ildasm.exe সহ সমাবেশে প্রকাশ করতে পারেন

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

ফাঁসির ঠিকানাগুলিতে ব্রেকপয়েন্টগুলি ম্যাপিং করা ডিবাগারের কাজ। এটি JIT সংকলক দ্বারা উত্পাদিত .pdb ফাইল এবং তথ্য ব্যবহার করে যা কোড ঠিকানা ম্যাপিংয়ে আইএল নির্দেশনা সরবরাহ করে। আপনি যদি নিজের ডিবাগারটি লিখতে চান তবে আপনি আইসিওরডিবুগকোড :: গেটিলটোনেটেম্যাপিং () ব্যবহার করুন।

জেআইটি সংকলক অপ্টিমাইজেশন অক্ষম থাকায় মূলত ডিবাগ স্থাপনা ধীর হবে।


3

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

স্কট এখানে ইনলাইন পদ্ধতি অপ্টিমাইজেশান একটি ভাল ব্যাখ্যা আছে

এই নিবন্ধটি দেখুন যা সংক্ষেপে ব্যাখ্যা দেয় কেন এটি ডিবাগ এবং রিলিজ সেটিংয়ের জন্য এএসপি.নেট পরিবেশে আলাদা।


3

পারফরম্যান্স সম্পর্কে এবং ডিবাগারটি সংযুক্ত রয়েছে কিনা তা আপনার একটি বিষয় লক্ষ্য করা উচিত, যা আমাদের অবাক করে দিয়েছিল।

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

অপরাধীটি Debug.WriteLineআঁটসাঁট পোশাকগুলির মধ্যে একটি ছিল , যা হাজার হাজার লগ বার্তা ছুঁড়ে ফেলেছিল, কিছুক্ষণ আগে একটি ডিবাগ সেশন থেকে ছেড়ে যায়। দেখে মনে হয় যে ডিবাগারটি সংযুক্ত থাকে এবং এই জাতীয় আউটপুট শোনার সাথে সাথে ওভারহেড জড়িত থাকে যা প্রোগ্রামটি ধীর করে দেয়। এই নির্দিষ্ট কোডের জন্য, এটি নিজের থেকে 0.2-0.3 সেকেন্ডের রানটাইম এবং ডিবাগারটি সংযুক্ত করার সময় 30+ সেকেন্ডের অর্ডারে ছিল।

যদিও সহজ সমাধান, কেবল ডিবাগ বার্তাগুলি সরিয়ে ফেলুন যাগুলির আর প্রয়োজন ছিল না।


2

ইন MSDN সাইট ...

রিলিজ বনাম ডিবাগ কনফিগারেশন

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

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


1

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


1

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

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


"রান মোড" দ্বারা আপনি "মুক্তি" বলতে চাচ্ছেন?
রন ক্লেইন

হ্যাঁ অবশ্যই. রিলিজের সমস্ত ডিবাগ ওভারহেড নেই।
ফ্রান্সিসকো গোল্ডেনস্টাইন

1

ডিবাগ এবং রিলিজ মোডের মধ্যে পার্থক্য রয়েছে। ফুজলিনের একটি সরঞ্জাম রয়েছে : এটি একটি ফাসার যা রজলিনকে এলোমেলো সি # প্রোগ্রাম উত্পন্ন করতে ব্যবহার করে। এটি নেট প্রোগ্রামে এই প্রোগ্রামগুলি চালায় এবং নিশ্চিত করে যে ডিবাগ এবং রিলিজ মোডে সংকলন করার সময় তারা একই ফলাফল দেয়।

এই সরঞ্জামের সাহায্যে এটি পাওয়া গেছে এবং প্রচুর বাগ রিপোর্ট করা হয়েছে।

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