نهان سازی درخط

دانشنامه عمومی

نهان سازی در خط یک تکنیک بهینه سازی است که در زمان اجرا انجام می شود، و در ابتدا برای زبان اسمال تاک پیاده سازی شده است. [ ۱] هدف از نهان سازی در خط سرعت بخشیدن به یافتن تابع مورد نظر به وسیله ذخیره سازی نتایج جستجوی قبلی به طور مستقیم در نقطه فراخوانی است. نهان سازی در خط به طور خاص مورد استفاده زبان های گونه پویا است که بیشتر یا تمام جستجوی تابع های آن ها در زمان اجرا اتفاق می افتد. در این موارد جداول توابع مجازی معمولاً قابل استفاده نیست.
تابع اکما اسکریپت زیر یک شیء را به عنوان ورودی دریافت می کند، تابع toString را فراخوانی کرده و نتایج را در صفحه ای که اسکریپت در آن تعبیه شده است نشان می دهد.
function dump ( obj ) { document. write ( obj. toString ( ) ) ; } از آنجایی که نوع شیء مشخص نشده است و احتمال استفاده از قابلیت method overloading وجود دارد، تصمیم گیری آن که در لحظه کدام تابع toString در اصل باید اجرا شود، غیر ممکن است. در عوض، یک جستجوی پویای تابع باید در زمان اجرا انجام شود. در زبان هایی که در زمان اجرا از نهان سازی استفاده نمی کنند، با هر بار رسیدن به نقطه فراخوانی، این جستجوی پویای تابع دوباره انجام می شود. از آنجا که ممکن است زنجیره وراثت وجود داشته باشد و توابع در کلاس پدرهای شیء پیاده سازی شده باشند، هر جستجوی پویای تابع می تواند یک عمل هزینه بر در زمان اجرا تلقی شود.
برای دستیابی به عملکرد بهتر، بسیاری از زبان ها در زمان اجرا از نوعی نهان سازی غیر در خط ( none_online ) استفاده می کنند به این صورت که نتایج تعداد محدود و مشخصی از جستجوهای پویای تابع در ساختار داده ای مناسب ذخیره می شوند. این کار می تواند عملکرد را مقدار خوبی بهبود ببخشد به شرطی که نهان سازی برای برنامه های اجرا شده به صرفه باشد ( یعنی تعداد محدودی از توابع وجود داشته باشد که به طور مکرر مورد استفاده قرار بگیرد ) . این ساختار داده معمولاً به عنوان حافظه نهان جستجوی تابع سطح اول نامیده می شود. [ ۱]
مفهوم نهان سازی در خط مبتنی بر این مشاهده تجربی است که اشیاء مورد استفاده در یک نقطه فراخوانی خاص معمولاً از یک نوع هستند. در این موارد ، با ذخیره کردن نتیجه جستجوی تابع به صورت "در خط"، یعنی مستقیماً در نقطه فراخوانی، می توان عملکرد را مقدار خوبی بهبود بخشید. برای تسهیل این فرایند، به نقاط فراخوانی وضعیت های مختلفی اختصاص داده می شود. در ابتدا، به یک نقطه فراخوانی وضعیت "ناشناخته" نسبت داده می شود. هنگامی که اجرای برنامه به یک نقطه فراخوانی خاص با وضعیت ناشناخته رسید، یک جستجوی پویای تابع انجام می شود و نتیجه را در نقطه فراخوانی ذخیره می کند و وضعیت آن نقطه فراخوانی به "تک ریخت" تغییر پیدا می کند. اگر اجرای برنامه دوباره به همان نقطه فراخوانی برسد، پذیرنده اصلی ( تابع مقصد، تابعی که واقعاً باید اجرا شود و ممکن است در کلاس پدر شیء مورد نظر پیاده ساری شده باشد ) را از آن بازیابی می کند و مستقیماً بدون انجام هرگونه جستجوی بیشتر، آن را فراخوانی می کند. برای آن که احتمال وجود انواع مختلفی از اشیاء در یک نقطه فراخوانی وجود دارد، زبان برنامه نویسی در زمان اجرا باید شرایط محافظت را درون کد وارد کند ( چک کند که نوع شیءای که تابع آن فراخوانی شده با نوع قبلی و مورد انتظار آن برابر باشد ) . به طور معمول برای پیاده سازی این موارد از نقطه فراخوانی استفاده نمی شود و در بخشی به نام مقدمه پذیرنده ( بخشی که پیش از اجرای تابع مقصد، فراخوانی می شود ) قرار می گیرند تا بتوان از پیش بینی کننده پرش بهتری استفاده کرد. با این کار به جای چندبار کپی کردن در نقاط فراخوانی مختلف یک بار شرایط محافظت در مقدمه پذیرنده قرار می گیرد در نتیجه فضای کمتری اشغال می شود. اگر نقطه فراخوانی در وضعیت "تک ریخت" با نوع دیگری شیء، غیر از آنچه انتظار دارد مواجه شود، باید مجدداً به حالت "ناشناخته" تغییر یابد و دوباره یک جستجوی پویای تابع انجام شود.
عکس نهان سازی درخط
این نوشته برگرفته از سایت ویکی پدیا می باشد، اگر نادرست یا توهین آمیز است، لطفا گزارش دهید: گزارش تخلف

پیشنهاد کاربران

بپرس