# فعال سازی Multicore JIT

Multicore JIT یکی از قابلیت‌های کلیدی در دات نت 4.5 می‌باشد که در واقع راه حلی برای بهبود سرعت اجرای برنامه‌های دات نتی است. قبل از معرفی این قابلیت ابتدا اجازه دهید نحوه کامپایل یک برنامه دات نتی را 

- Published: 2014-07-19
- Language: fa
- Tags: DNTips
- Canonical: https://sirwan.info/blog/fa/dntips-1845

---

> این نوشته نخستین بار در [دات‌نت تیپس](https://www.dntips.ir/post/1845) منتشر شده است.

<div class="postBody">Multicore JIT یکی از قابلیت‌های کلیدی در دات نت 4.5 می‌باشد که در واقع راه حلی برای بهبود سرعت اجرای برنامه‌های دات نتی است. قبل از معرفی این قابلیت ابتدا اجازه دهید نحوه کامپایل یک برنامه دات نتی را بررسی کنیم.<div>انواع compilation</div> <div>در حالت کلی دو نوع فرآیند کامپایل داریم:</div> <div> <ul> <li> <b>Explicit</b> </li> </ul> </div> <div>در این حالت دستورات قبل از اجرای برنامه به زبان ماشین تبدیل می‌شوند. به این نوع کامپایلرها AOT یا Ahead Of Time گفته می‌شود. این نوع از کامپایلرها برای اطمینان از اینکه CPU بتواند قبل از انجام تعاملی تمام خطوط کد را تشخیص دهد، طراحی شده اند.</div> <div> <ul> <li> <b>Implicit</b> <br/> </li> </ul> </div> <div>این نوع compilation به صورت دو مرحله ایی صورت می‌گیرد. در اولین قدم سورس کد توسط یک کامپایلر به یک زبان سطح میانی(IL) تبدیل می‌شود. در مرحله بعدی کد IL به دستورات زبان ماشین تبدیل می‌شوند. در دات نت فریم ورک به این کامپایلر JIT یا Just-In-Time گفته می‌شود.</div> <div>در حالت دوم قابلیت جابجایی برنامه به آسانی امکان پذیر است، زیرا اولین قدم از فرآیند به اصطلاح platform agnostic می‌باشد، یعنی قابلیت اجرا بر روی گستره وسیعی از پلت فرم‌ها را دارد.</div> <div> <br/> <b>کامپایلر JIT</b> </div> <div>JIT بخشی از Common Language Runtime یا CLR می‌باشد. CLR در واقع وظیفه مدیریت اجرای تمام برنامه‌های دات نتی را برعهده دارد.</div> <div> <p> <img src="/img/dntips/b54785e9f5a3a9e46b50.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p>همانطور که در تصویر فوق مشاهده می‌کنید، سورس کد توسط کامپایلر دات نت به exe و یا dll کامپایل می‌شود. کامپایلر JIT تنها متدهایی را که در زمان اجرا(runtime) فراخوانی می‌شوند را کامپایل می‌کند. در دات نت فریم ورک سه نوع JIT Compilation داریم:</p> <p> <b>Normal JIT Compilation</b> <span style="font-size: 9pt; line-height: 1.5em;">  </span> <br/> </p> <p>در این نوع کامپایل، متدها در زمان فراخوانی در زمان اجرا کامپایل می‌شوند. بعد از اجرا، متد داخل حافظه ذخیره می‌شود. به متدهای ذخیره شده در حافظه jitted گفته می‌شود. دیگر نیازی به کامپایل متد jit شده نیست. در فراخوانی بعدی، متد مستقیماً از حافظه کش در دسترس خواهد بود.</p> <p> <img src="/img/dntips/eb0d1348ece1ec9a8c6f.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p> <b>Econo JIT Compilation</b>  <br/> </p> <p>این نوع کامپایل شبیه به حالت Normal JIT است با این تفاوت که متدها بلافاصله بعد از اجرا از حافظه حذف می‌شوند.</p> <p> <img src="/img/dntips/eede7f4ce977b9f3244d.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p> <b>Pre-JIT Compilation</b>  <br/> </p> <p>یکی دیگر از حالت‌های کامپایل برنامه‌های دات نتی Pre-JIT Compilation می باشد. در این حالت به جای متدهای مورد استفاده، کل اسمبلی کامپایل می‌شود. در دات نت می‌توان اینکار را توسط <a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx">Ngen.exe</a> یا (Native Image Generator) انجام داد. تمام دستورالعمل‌های CIL قبل از اجرا به کد محلی(Native Code) کامپایل می‌شوند. در این حالت runtime می‌تواند از native images به جای کامپایلر JIT استفاده کند. این نوع کامپایل عملیات تولید کد را در زمان اجرای برنامه به زمان Installation منتقل می‌کند، در اینصورت برنامه نیاز به یک Installer برای اینکار دارد.</p> <p> <img src="/img/dntips/a855597c4fc52fab0fce.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p> <b>Multicore JIT</b> </p> <p>در دات نت فریم ورک 4.5 یک راه حل جایگزین دیگر برای بهینه سازی و بهبود سرعت اجرای برنامه‌های دات نت وجود دارد. همانطور که عنوان شد Ngen.exe برای در دسترس بودن نیاز به Installer برای برنامه دارد. توسط Multicore JIT متدها بر روی دو هسته به صورت موازی کامپایل می‌شوند، در اینصورت می‌توانید تا 50 درصد از JIT Time صرفه جویی کنید.</p> <p>Multicore JIT همچنین می‌تواند باعث بهبود سرعت در برنامه‌های WPF شود. در نمودار زیر می‌توانید حالت‌های استفاده و عدم استفاده از Multicore JIT را در سه برنامه WPF نوشته شده مشاهده کنید.</p> <p> <img src="/img/dntips/2c6fd5cdf705699e5aec.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p> <b>Multicore JIT در عمل</b> </p> <p>Multicore JIT از دو مد عملیاتی استفاده می‌کند: مد ثبت(Recording mode)، مد بازپخش(Playback mode)</p> <p>در حالت ثبت کامپایلر JIT هر متدی که نیاز به کامپایل داشته باشد را رکورد می‌کند. بعد از اینکه CLR تعیین کند که اجرای برنامه به اتمام رسیده است، تمام متدهایی که اجرا شده اند را به صورت یک پروفایل بر روی دیسک ذخیره می‌کند.</p> <p> <img src="/img/dntips/94d70249c22c3b2fd266.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p>هنگامیکه Multicore JIT فعال می‌شود، با اولین اجرای برنامه، حالت ثبت مورد استفاده قرار می‌گیرد. در اجراهای بعدی، از حالت بازپخش استفاده می‌شود. حالت بازپخش پروفایل را از طریق دیسک بارگیری کرده، و قبل از اینکه این اطلاعات توسط ترد اصلی مورد استفاده قرار گیرد، از آنها برای تفسیر (کامپایل) متدها در پیش‌زمینه استفاده می‌کند.  <br/> </p> <p> <img src="/img/dntips/4dd08e1274119f59bc90.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p>در نتیجه، ترد اصلی به کامپایل دیگری نیاز ندارد، در این حالت سرعت اجرای برنامه بیشتر می‌شود. حالت‌های ثبت و بازپخش تنها برای کامپیوترهایی با چندین هسته فعال می‌باشند.</p> <p> <b>استفاده از Multicore JIT</b> </p> <p>در برنامه‌های 4.5 ASP.NET و 5 Silverlight به صورت پیش فرض این ویژگی فعال می‌باشد. ازآنجائیکه این برنامه‌ها hosted application هستند؛ در نتیجه فضای مناسبی برای ذخیره سازی پروفایل در این نوع برنامه‌ها موجود می‌باشد. اما برای برنامه‌های Desktop این ویژگی باید فعال شود. برای اینکار کافی است دو خط زیر را به نقطه شروع برنامه تان اضافه کنید:</p> <div align="left" dir="ltr">
<pre language="CSharp" name="code">public App() &#10;{&#10;    ProfileOptimization.SetProfileRoot(@"C:\MyAppFolder");&#10;    ProfileOptimization.StartProfile("Startup.Profile");&#10;}</pre>
 </div> <p>توسط متد <a href="http://msdn.microsoft.com/en-us/library/system.runtime.profileoptimization.setprofileroot(v=vs.110).aspx">SetProfileRoot</a> می‌توانیم مسیر ذخیره سازی پروفایل JIT را مشخص کنیم. در خط بعدی نیز توسط متد StartProfile نام پروفایل را برای فعال سازی Multicore JIT تعیین می‌کنیم. در این حالت در اولین اجرای برنامه پروفایلی وجود ندارد، Multicore JIT در حالت ثبت عمل می‌کند و پروفایل را در مسیر تعیین شده ایجاد می‌کند. در دومین بار اجرای برنامه CRL پروفایل را از اجرای قبلی برنامه بارگذاری می‌کند؛ در این حالت Multicore JIT به صورت بازپخش عمل می‌کند.</p> <p>همانطور که عنوان شد در برنامه‌های ASP.NET 4.5 و Silverlight 5 قابلیت Multicore JIT به صورت پیش فرض فعال می‌باشد. برای غیر فعال سازی آن می‌توانید با تغییر فلگ profileGuidedOptimizations به None اینکار را انجام دهید:</p> <div align="left" dir="ltr">
<pre language="CSharp" name="code">&lt;?xml version="1.0" encoding="utf-8" ?&gt; &#10;&lt;configuration&gt;&#10; &lt;!-- ... --&gt;&#10; &lt;system.web&gt; &#10; &lt;compilation profileGuidedOptimizations="None" /&gt; &#10; &lt;!-- ... --&gt; &#10; &lt;/system.web&gt; &#10;&lt;/configuration&gt;</pre>
 </div> </div></div>
