بهینه‌سازی برنامه
سطح بهینه‌سازی

بهینه‌سازی می‌تواند در سطوح مختلف رخ دهد. به‌طور معمول، سطوح بالاتر تأثیر بیشتری دارند و بعداً در یک پروژه تغییر می‌کنند و نیاز به تغییرات قابل توجهی دارند و اگر مجبور باشند تغییرات لازم را انجام دهند بازنویسی کامل خواهند شد؛ بنابراین بهینه‌سازی می‌تواند به‌طور معمول از طریق پالایش از بالا به پایین ادامه یابد، با دستاوردهای بزرگ‌تر اولیه و با کار کمتر به دست می‌آید، و پس از آن دستاوردهای کوچکتر و نیاز به کار بیشتر. با این حال، در برخی موارد عملکرد کلی بستگی به عملکرد بخش‌های بسیار پایین برنامه دارد و تغییرات کوچک در مراحل اولیه در مورد جزئیات پایین سطح می‌تواند تأثیرات ناخوشایندی داشته باشد. به‌طور معمول به بهره‌وری در یک پروژه توجه می‌شود - هرچند که این تغییرات قابل توجه است - اما بهینه‌سازی عمده اغلب به عنوان یک پالایش در نظر گرفته می‌شود که دیر یا زود انجام شود. در پروژه‌های در حال اجرا دیگر، به‌طور معمول چرخه بهینه‌سازی وجود دارد، در حالیکه بهبود یک منطقه محدودیت‌های دیگری را نشان می‌دهد و معمولاً زمانی کاهش می‌یابد که عملکرد قابل قبول باشد یا سودو هزینه بیش از حد کوچک باشد.
عملکرد بخشی از مشخصات برنامه است - یک برنامه که آهسته باشدبه‌طور غیرقابل اجتناب برای هدف مناسب نیست: یک بازی ویدیویی با ۶۰ هرتز (فریم در ثانیه) قابل قبول است، اما ۶ فریم در ثانیه غیرقابل قبول و خسته‌کننده است - عملکرد از ابتدا مورد بررسی قرار می‌گیرد تا اطمینان حاصل شود که سیستم قادر به ارائه عملکرد کافی می‌باشد و سیستم نهایی (با بهینه‌سازی) به عملکرد قابل قبول دست می‌یابد. این موضوع گاهی اوقات اینطور برداشت می‌شود که بهینه‌سازی همیشه می‌تواند دیر تر انجام شود، و در نتیجه سیستم‌های نمونه اولیه که - اغلب به میزان زیاد یا بیشتر هستند - و حتی سیستم‌هایی که در نهایت خرابی هستند، زیرا از لحاظ معماری نمی‌توانند به عملکردی که هدف خود قرار داده‌اند دست یابند. مانند اینتل ۴۳2 (1981)که سال‌ها همکاری را برای دستیابی به یک عملکرد قابل قبول مانند آن که (Java (1995 بتواند عملکرد قابل قبولی را با(HotSpot (1999 داشته باشد را انجام دادند. درجه ای که عملکرد بین نمونه اولیه و سیستم تولیدی را نشان می‌دهد تغییر می‌کند و چگونگی ارتقای آن بهینه‌سازی می‌شود، که می‌تواند منبع مهمی از عدم اطمینان و خطر نمونه باشد.
سطح طراحی
در بالاترین سطح طراحی ممکن است بهینه‌سازی انجام شود تا بهترین استفاده را از منابع موجود، اهداف، محدودیت‌های مورد انتظار داشته باشیم. طراحی معماری یک سیستم عمدتاً بر عملکرد آن تأثیر می‌گذارد. به عنوان مثال، یک سیستم که وابسته به زمان تأخیر شبکه‌ها است (که در آن زمان تأخیر شبکه محدودیت اصلی عملکرد کلی است) بهینه‌سازی می‌شود تا زمان ان را به حداقل برساند، در حالت ایدئال یک درخواست واحد (یا هیچ درخواست، مانند یک پروتکل فشار) به جای چند دور دفعات صورت می‌گیرد در اصل نشان می‌دهد که   انتخاب‌ها به اهداف طراحی بستگی دارد: هنگام طراحی یک کامپایلر، اگر تدوین سریع اولویت کلیدی باشد، طراحی یک کامپایلر یک گذر سریعتر از یک کامپایلر چند گذر (با فرض انجام کار مشابه) انجام می‌شود، اما اگر سرعت خروجی کد هدف باشد، یک کامپایلر چندتایی بهتر به هدف می‌رسد، حتی اگر طول بکشد. انتخاب پلاتفرم و زبان برنامه‌نویسی در این سطح رخ می‌دهد و تغییر آن‌ها اغلب نیازمند بازنویسی کامل است، هرچند یک سیستم ماژولار ممکن است اجازه بازنویسی تنها برخی از مؤلفه‌ها را بدهد - مثلاً یک برنامه پایتون ممکن است بخش‌های عملکردی حیاتی را در C بازنویسی کند. سیستم، انتخاب معماری (مدل سرویس‌گیرنده-رویس‌دهنده
، همتابه‌همتا و غیره) در سطح طراحی رخ می‌دهد و ممکن است دشوار باشد، به خصوص اگر تمام اجزای سازنده را نمی‌توان جایگزین کرد (به عنوان مثال مشتریان قدیمی).
الگوریتم‌ها و ساختارهای داده
با در نظر گرفتن یک طرح کلی، انتخاب خوبی از الگوریتم‌های کارآمد و ساختار داده‌ها و اجرای کارآمد این الگوریتم‌ها و ساختارهای داده‌ها، در ادامه آمده است. پس از طراحی، انتخاب الگوریتم‌ها و ساختارهای داده بر کارایی بیش از هر جنبه دیگر برنامه تأثیر می‌گذارد. به‌طور کلی، ساختار داده‌ها بیشتر از الگوریتم‌ها تغییر می‌کند، زیرا فرضیه ساختار داده‌ها و فرضیه‌های عملکرد آن در طول برنامه استفاده می‌شود، هرچند این می‌تواند با استفاده از انواع داده‌های انتزاعی در تعاریف تابع به حداقل برسد و تعاریف ساختار داده‌ها محدود شود به چند مکان
برای الگوریتم‌ها این به‌طور عمده شامل اطمینان از اینکه الگوریتم‌ها ثابت (O (1، لگاریتمی (O(log n، خطی (O (n یا در برخی موارد (log-line O(n log nدر ورودی (هر دو در فضا و زمان). الگوریتم‌هایی با پیچیدگی درجه دوم(O (n 2 در مقیاس شکست می‌یابند، و حتی الگوریتم‌های خطی باعث می‌شود که مشکلات به صورت مکرر فراخوانی شوند و به‌طور معمول با احتمالات ثابت یا لگاریتمی جایگزین شوند.
فراتر از نظم نسبیت رشد، عوامل پایدار اهمیت دارد: الگوریتم کند تراز الگوریتم سریعتر یا کوچکتر (به عنوان ساده‌تر)، فقط زمانی هر دو با ورودی کوچک مواجه می‌شوند، که در واقعیت اتفاق بیفتد. اغلب الگوریتم ترکیبی بهترین عملکرد را به وجود می‌آورد، به این دلیل که این تغییرات با اندازه تغییر می‌کند.
یک روش کلی برای بهبود عملکرد، اجتناب از کار است. یک مثال خوب استفاده از یک مسیر سریع برای موارد معمول است، بهبود عملکرد با اجتناب از کار غیر ضروری. به عنوان مثال، با استفاده از یک الگوریتم طرح بندی متن ساده برای متن لاتین، تنها تغییر در الگوریتم طرح پیچیده برای اسکریپت‌های پیچیده مانند دیواناگری. یکی دیگر از روش‌های مهم ذخیره‌سازی، به ویژه مموایز کردن، که از محاسبات بیش از حد جلوگیری می‌کند. با توجه به اهمیت ذخیره‌سازی، اغلب سطوح ذخیره‌سازی در یک سیستم وجود دارد که می‌تواند مشکلاتی را از استفاده از حافظه ایجاد کند و مسائل مربوط به صحت از حافظه‌های غیرمجاز.
سطح کد منبع
فراتر از الگوریتم‌ها و اجرای آن‌ها در انتزاعی و ماشین آلات بتن و کد منبع سطح انتخاب می‌تواند تفاوت قابل توجهی است. برای مثال در اوایل C کامپایلر (1) شد و آهسته‌تر از for(;;) به صورت بی قید و شرط حلقه زیرا در حالی که(1) ارزیابی ۱ و سپس یک پرش شرطی که تست شده اگر درست شد در حالی که برای (;;) تا به حال بی قید و شرط پرش. برخی از بهینه‌سازی (مثل این یکی) امروزه می‌توان با بهینه‌سازی کامپایلر. این بستگی به منبع زبان دستگاه مورد نظر زبان و کامپایلر و می‌تواند دشوار به درک یا پیش‌بینی و تغییرات در طول زمان است و این کلید جایی که درک درستی از کامپایلر و کد دستگاه می‌تواند عملکرد را بهبود بخشد. حلقه-ناوردا کد حرکت و بازگشت ارزش بهینه‌سازی نمونه‌هایی از بهینه‌سازی است که کاهش نیاز به کمکی متغیر و حتی می‌تواند منجر به اجرای سریع تر و با اجتناب از دور-در مورد بهینه‌سازی.
سطح ساخت
بین منبع و سطح کامپایل، دستورالعمل‌ها و فلگ‌های ساخت را می‌توان برای تنظیم گزینه‌های عملکرد در کد منبع و کامپایلر به ترتیب استفاده کرد، از جمله استفاده از پیش پردازنده تعریف می‌شود که برای مثال برای غیرفعال کردن ویژگی‌های نرم‌افزار غیر ضروری، بهینه‌سازی برای مدل‌های خاص پردازنده یا قابلیت‌های سخت‌افزاری، یا پیش‌بینی شاخه، سیستم‌های توزیع نرم‌افزار مبتنی بر منبع مانند پورت‌های BSD و انتقال جنتو‌ها و این صورتی ازشکل بهینه‌سازی است.
سطح کامپایل
استفاده از یک کامپایلر بهینه‌سازی شده مستلزم اطمینان از اینکه برنامه اجرایی حداقل به همان اندازه که کامپایلر می‌تواند پیش‌بینی کند بهینه‌سازی شده باشد.
سطح مجمع
در پایین‌ترین سطح، نوشتن کد با استفاده از یک زبان مونتاژ، طراحی شده برای یک پلتفرم سخت‌افزاری خاص می‌تواند کارآمدترین و کمترین کد را تولید کند، در صورتی که برنامه‌نویس از رکورد کامل دستورالعملهای ماشین استفاده کند. به همین دلیل، بسیاری از سیستم عامل‌های مورد استفاده در سیستم‌های جاسازی شده به‌طور سنتی در کد اسمبلر نوشته شده‌اند. برنامه‌ها (به غیر از برنامه‌های بسیار کوچک) به ندرت از زمان شروع و پایان در مونتاژ به علت زمان و هزینه درگیر می‌شوند. اکثر آن‌ها از یک زبان سطح بالا به مونتاژ و دست بهینه شده از آنجا جمع شده‌اند. هنگامی که بازده قطعات مهم‌تر از اندازه هستند، ممکن است در یک زبان سطح بالا نوشته شوند.
با کامپایلرهای پیشرفته تر بهینه‌سازیو پیچیدگی CPUهای اخیر، بیشتر است که کد کارآمدتری را از آنچه که کامپایلر تولید می‌کند، بنویسید و پروژه‌های کوچک به این روش بهینه‌سازی نهایی نیاز دارند.
امروزه کد نوشته می‌شود تا به عنوان ماشین‌های بسیاری بتواند اجرا شود. به عنوان یک نتیجه، برنامه نویسان و کامپایلرها همیشه از دستورالعمل‌های کارآمدتر ارائه شده توسط پردازنده‌های جدیدتر یا پیش فرض مدل‌های قدیمی تر استفاده نمی‌کنند. علاوه بر این، کدهای مونتاژ شده برای یک پردازنده خاص بدون استفاده از چنین دستورالعمل‌های تنظیم شده است که ممکن است در پردازنده دیگری غیرقطعی باشند، و انتظار تنظیم متفاوت از کد را دارند.
به‌طور معمول امروز، به جای اینکه در زبان اسمبلی بنویسیم، برنامه نویسان از یک disassembler برای تجزیه و تحلیل خروجی یک کامپایلر استفاده می‌کنند و کد منبع بالا را تغییر می‌دهند تا بتوان آن را به‌طور مؤثر تر کامپایل کرد یا متوجه شد که چرا آن ناکارآمد است.
زمان اجرا
کامپایلرها فقط در زمان اجرا می‌توانند کد ماشین را بر اساس داده‌های زمان اجرا، تولید کنند. این تکنیک به اولین موتورهای بیان منظم می‌رسد و با Java HotSpot و V8 برای جاوا اسکریپت گسترش پبدا کرده است. در برخی موارد بهینه‌سازی سازگاری ممکن است قادر به انجام بهینه‌سازی زمان اجرا بیش از توانایی کامپایلرهای استاتیک با تنظیم پارامترهای پویا با توجه به ورودی‌های واقعی یا سایر عوامل باشد.
بهینه‌سازی پروفایل هدایت شده یک روش بهینه‌سازی تلفیقی پیش از زمان (AOT) بر اساس پروفایل‌های زمان اجرا است و شبیه به یک متد استاتیکی «مورد متوسط» که از تکنیک پویا بهینه‌سازی سازگاری است.
کد خودمحور می‌تواند در پاسخ به شرایط زمان اجرا به منظور بهینه‌سازی کد تغییر کند. این در برنامه‌های زبان مونتاژ رایج بود.
برخی از طرح‌های CPU می‌توانند برخی از بهینه‌سازی‌ها را در زمان اجرا انجام دهند. بعضی از نمونه‌ها عبارتند Out-of-order execution , Speculative execution ,Instruction pipelines, و Branch predictors .  کامپایلرها می‌توانند به این برنامه کمک کنند که از ویژگی‌های این CPU بهره‌مند شوند، مثلاً از طریق برنامه‌ریزی دستورالعمل.