دستگاه داف

در علوم رایانه دستگاه یا روش داف نام یک کلک برنامه‌نویسی است که برای سرعت بخشیدن به یک زنجیره از دستورهای پشت سر هم استفاده می‌شود. دستگاه داف را یکی از کارمندان شرکت لوکاس فیلم به نام تام داف در نوامبر سال ۱۹۸۳ ابداع کرد. پایهٔ این روش استفادهٔ هوشمندانه از ویژگی‌های دستور سوئیچ در زبان برنامه‌نویسی C است.

 طرز کار 
در ساده‌ترین حالت، برای اجرای یک زنجیره از فرمان‌های پشت سر هم از یک حلقه استفاده می‌شود.

do {
  *dest = *src++
} while (--count> 0)

در این مثال می‌خواهیم محتویات آرایهٔ src را به ترتیب در مکان ثابت dst رونویسی کنیم (مثلاً برای ورودی/خروجی حافظه‌نگاشتی). در زمان اجرای این برنامه به ازای هر رونویسی می‌بایست یک بار count کاهش داده شود و شرط مثبت بودن آن بررسی شود. زمان صرف شده برای این بررسی می‌تواند قابل ملاحظه باشد. برای کاهش این زمان می‌توان این حلقه را باز کرد، به این معنی که آن را یکراست با count بار رونویسی جایگزین کرد.

*dest = *src++
*dest = *src++
*dest = *src++
/* count times */
*dest = *src++

این روش حجم برنامه را بالا می‌برد و کاستی‌هایی دارد، از جمله این که باید تعداد رونوشت‌ها را از پیش دانست. دستگاه داف راهی میانی برای این مسئله ارائه می‌دهد.

 register n = (count + 7) / 8;
 switch (count % 8) {
 case 0: do { *to = *from++;
 case 7:   *to = *from++;
 case 6:   *to = *from++;
 case 5:   *to = *from++;
 case 4:   *to = *from++;
 case 3:   *to = *from++;
 case 2:   *to = *from++;
 case 1:   *to = *from++;
 } while (--n> 0);

 شرح برنامه 
در این روش عملیات در ابتدا به دسته‌های ۸ تایی تقسیم می‌شود. با این کار شرط پایان را تنها ۱/۸ اوقات بررسی می‌کنیم. در اجرای اول حلقه باقیماندهٔ تعداد عملیات به ۸ حساب می‌شود و این تعداد باقی‌مانده اول اجرا می‌شود. برای مثال اگر count برابر ۱۹ (که خارج‌قسمت آن بر ۸ برابر ۲ و باقیماندهٔ آن ۳ است) باشد، در اجرای اول دستور سوئیچ برنامه را به برچسب شمارهٔ ۳ منتقل می‌کند. در ادامه عمل رونویسی ۳ بار اجرا می‌شود. تا پس از رسیدن به دستور while اجرای برنامه به برچسب ۰ منتقل شود. در ادامه ۲ بار ۸ عمل رونویسی به طور معمول در حلقه انجام می‌شود.
 منابع 

رده:زبان برنامه‌نویسی سی
رده:فرهنگ مردمی برنامه‌نویسی رایانه‌ای
رده:فرهنگ مردمی رایانه
رده:مقاله‌های ایجادشده توسط ایجادگر
رده:ویکی‌سازی رباتیک
رده:کد منبع