সি # সংকলক নিজেই নির্গমনিত আইএলকে রিলিজ বিল্ডে কোনও বড় পরিবর্তন করে না। উল্লেখযোগ্য এটি হ'ল এটি আর এনওপি অপকোডগুলি বের করে না যা আপনাকে কোঁকড়া ধনুর্বন্ধনী উপর একটি ব্রেকপয়েন্ট সেট করতে দেয়। বড়টি হ'ল অপটিমাইজার যা জেআইটি সংকলকটিতে অন্তর্নির্মিত। আমি জানি এটি নিম্নলিখিত অপ্টিমাইজেশন করে:
ইনলাইনিং পদ্ধতি। পদ্ধতির কোড ইনজেকশন দ্বারা একটি পদ্ধতি কল প্রতিস্থাপন করা হয়। এটি একটি বড়, এটি সম্পত্তির অ্যাক্সেসরগুলি মূলত বিনামূল্যে করে।
সিপিইউ নিবন্ধনের বরাদ্দ। স্থানীয় ভেরিয়েবল এবং পদ্ধতির আর্গুমেন্টগুলি কোনও স্টু ফ্রেমে সংরক্ষণ না করে (বা কম ঘন ঘন) সিপিইউ রেজিস্টারে সংরক্ষণ করা যেতে পারে। এটি একটি বড়, ডিবাগিং অপটিমাইজড কোডটিকে এত কঠিন করার জন্য উল্লেখযোগ্য। এবং উদ্বায়ী কীওয়ার্ড একটি অর্থ প্রদান।
অ্যারে সূচি পরীক্ষা নির্মূল। অ্যারে নিয়ে কাজ করার সময় একটি গুরুত্বপূর্ণ অপ্টিমাইজেশন (সমস্ত। নেট সংগ্রহের ক্লাসগুলি অভ্যন্তরীণভাবে অ্যারে ব্যবহার করে)। যখন জেআইটি সংকলকটি যাচাই করতে পারে যে কোনও লুপ কখনই সীমা ছাড়িয়ে কোনও অ্যারে সূচী করে না তবে তা সূচক চেকটি সরিয়ে ফেলবে। বড় একটা.
লুপ আনরোলিং। ছোট দেহের সাথে লুপগুলি শরীরে 4 বার পর্যন্ত কোডটি পুনরাবৃত্তি করে এবং কম লুপ করে উন্নত হয়। শাখার ব্যয় হ্রাস করে এবং প্রসেসরের সুপার-স্ক্যালারের কার্যকরকরণ বিকল্পগুলি উন্নত করে।
ডেড কোড নির্মূলকরণ। যদি (মিথ্যা) like / ... / like এর মত বিবৃতি সম্পূর্ণরূপে নির্মূল হয়ে যায়। ধ্রুবক ভাঁজ এবং ইনলাইনিংয়ের কারণে এটি ঘটতে পারে। অন্যান্য ক্ষেত্রে হ'ল জেআইটি সংকলক নির্ধারণ করতে পারে যে কোডটির কোনও সম্ভাব্য পার্শ্ব-প্রতিক্রিয়া নেই। এই অপটিমাইজেশনটি হ'ল প্রোফাইলিং কোডটি এতটাই জটিল।
কোড উত্তোলন একটি লুপের ভিতরে কোড যা লুপ দ্বারা প্রভাবিত হয় না সেটিকে লুপের বাইরে সরিয়ে নেওয়া যায়। সি সংকলকটির অপ্টিমাইজারটি উত্তোলনের সুযোগগুলি খুঁজে পেতে আরও অনেক বেশি সময় ব্যয় করবে। তবে প্রয়োজনীয় ডেটা প্রবাহ বিশ্লেষণের কারণে এটি একটি ব্যয়বহুল অপ্টিমাইজেশন এবং জিটারটি সময় বহন করতে পারে না তাই কেবল সুস্পষ্ট কেস উত্তোলন করে। .NET প্রোগ্রামারদের আরও ভাল উত্স কোড লিখতে এবং নিজেরাই উত্তোলনের জন্য বাধ্য করা।
সাধারণ উপ-এক্সপ্রেশন বর্জন। x = y + 4; z = y + 4; z = x হয়; গন্তব্য [ix + 1] = src [ix + 1] এর মত বিবৃতিতে খুব সাধারণ; কোনও সহায়ক ভেরিয়েবলের প্রবর্তন না করে পাঠযোগ্যতার জন্য রচিত written পাঠ্যতার সাথে আপোস করার দরকার নেই।
অবিচ্ছিন্ন ভাঁজ x = 1 + 2; এক্স = 3 হয়; এই সাধারণ উদাহরণটি প্রথমটি সংকলক দ্বারা ধরা পড়ে, তবে জেআইটি সময়ে ঘটে যখন অন্যান্য অপ্টিমাইজেশন এটি সম্ভব করে তোলে।
কপি প্রচার। x = ক; y = x; y = a; এটি নিবন্ধকের বরাদ্দকারীকে আরও ভাল সিদ্ধান্ত নিতে সহায়তা করে। এটি x86 জিটারে একটি বড় ব্যাপার কারণ এটিতে কাজ করার জন্য খুব কম রেজিস্টার রয়েছে। এটি সঠিকভাবে নির্বাচন করা নিখুঁত গুরুত্বপূর্ণ।
এই অত্যন্ত গুরুত্বপূর্ণ অপ্টিমাইজেশন করে একটি দিতে পারে মহান যখন, উদাহরণস্বরূপ, যদি আপনি আপনার অ্যাপ্লিকেশনের ডিবাগ বিল্ড প্রোফাইল এবং এটি রিলিজ বিল্ড তুলনা পার্থক্য চুক্তি। যে শুধুমাত্র সত্যিই গুরুত্বপূর্ণ যদিও যখন কোডটি আপনার জটিল পথ চালু থাকে, তখন কোডের 5 থেকে 10% আপনি যে লিখতে আসলে আপনার প্রোগ্রাম জন্য perf প্রভাবিত করে। জেআইটি অপ্টিমাইজার কী সমালোচনা করছে তা জানার পক্ষে যথেষ্ট স্মার্ট নয়, এটি কেবলমাত্র সমস্ত কোডের জন্য "এগারটি তে পরিণত করুন" ডায়াল প্রয়োগ করতে পারে।
আপনার প্রোগ্রামের সম্পাদনার সময় এই অপ্টিমাইজেশনের কার্যকর ফলাফল প্রায়শই অন্য কোথাও চলে এমন কোড দ্বারা প্রভাবিত হয়। একটি ফাইল পড়া, একটি dbase ক্যোয়ারী সম্পাদন, ইত্যাদি কাজ JIT অপ্টিমাইজার তৈরি সম্পূর্ণ অদৃশ্য। যদিও এতে কিছু মনে হয় না :)
জেআইটি অপ্টিমাইজারটি বেশ নির্ভরযোগ্য কোড, বেশিরভাগ কারণেই এটি কয়েক মিলিয়নবার পরীক্ষা দেওয়া হয়েছিল। আপনার প্রোগ্রামটির রিলিজ বিল্ড সংস্করণে সমস্যা হওয়া চরম বিরল। এটি তবে ঘটে। X64 এবং x86 উভয় জিটটারে স্ট্রাক্টগুলির সাথে সমস্যা ছিল। এক্স ৮86 জিটারটিতে ভাসমান পয়েন্টের ধারাবাহিকতায় সমস্যা রয়েছে, যখন ভাসমান পয়েন্ট গণনার মধ্যস্থতিকে এফপিইউ রেজিস্ট্রারে রাখা হয় স্মৃতিতে প্রবাহিত হওয়ার পরিবর্তে 80০-বিট নির্ভুলতায় রাখা হয়।