۱۳۹۰ اردیبهشت ۳۱, شنبه

تجربه ای بد از .NET کند

مدتی است روی نرم افزاری کار می کنم که کندی .NET  را به وضوح برایم روشن ساخت. در این نرم افزار قرار بود یک تصویر 16 بیتی خاکستری (Grayscale) از روی سنسور یک دوربین خاص تحقیقاتی به روی حافظه کامپیوتر دانلود شود. سپس عملیاتی روی تصویر انجام شود تا تصویر قابل نمایش باشد. سنسور دوربین یک CCD 16 مگاپیکسل با پیکسلهای 16 بیتی بود که در مجموع تشکیل 32 مگابایت اطلاعات را می داد. این اطلاعات به واسطه SDK دوربین که با C++ unmanaged نوشته شده بود از دوربین گرفته می شد. این در حالی بود که صاحبان این دوربین از من خواسته بودند تا نرم افزار را با یکی از زبانهای .NET بنویسم و با وجود هشدارهایم مبنی بر پایین آمدن سرعت نرم افزار، از خواسته خود کوتاه نیامدند.

اطلاعات توسط تابعی سطر به سطر از روی سنسور خوانده می شد و در بلوکی از حافظه قرار می گرفت که اشاره گری به ابتدای آن برگردانده می شد. تا اینجای کار که دانلود اطلاعات به حافظه سیستم، توسط کد unmanaged درون SDK و Marshalling آن توسط CLR انجام می شد مشکلی وجود نداشت و سرعت نرم افزار قابل قبول بود. مشکل آنجا بود که اطلاعات پیکسلهای هر سطر 16 بیتی بودند. از آنجایی که سخت افزار لازم برای نمایش تصویر 16 بیت خاکستری در کامپیوترهای خانگی وجود ندارد، به ناچار این پیسکلهای 16 بیتی باید به پیکسلهای 8 بیت تبدیل می شدند. به بیان دیگر بیش از 16 میلیون پیسکسل 16 بیتی باید یک به یک به معادل 8 بیتی تبدیل می شدند. پس از پایان کد نویسی این قسمت و تست نرم افزار، مشاهده شد که کل این عمل  با سریعترین الگوریتم و با یک سخت افزار متوسط بیش از 40 ثانیه به طول می انجامد که با توجه به تجربه های قبلی ام در کار با همین حجم داده در C++ بسیار زیاد بود. گرچه کارفرمایان از این سرعت ابراز رضایت می کردند اما دلم راضی نشد. به سرم زد تا کل عملیات تبدیل تصویر 16 بیت به 8 بیت را با C++ بنویسم و بعد داده خروجی را به حافظه managed مارشال (Marshal) کنم.  گرچه هنوز فرآیند کد نویسی آن به اتمام نرسیده اما تست های اولیه بسیار امیدوار کننده هستند و امیدوارم زمان اجرای این فرآیند از بیش از 40 ثانیه به زیر 5 ثانیه کاهش یابد.

.NET فرآیند کد نویسی را ساده تر کرده است. هم به واسطه استفاده از حافظه مدیریت شده (Managed) و هم به خاطر کلاسهای غنی خود که بسیاری از فرایندهای پیچیده و الگوریتمهای طولانی را به بهترین شکل و ساده ترین و آماده ترین حالت در اختیار برنامه نویس قرار می دهد. اما وای به روزی که بخواهید خود کد مربوط به یک پردازش بزرگ داده را بنویسید. به نظرم در چنین حالتهایی و یا جاهایی که نیاز به ارتباط تنگاتنگ با سخت افزار وجود دارد، ترکیب کد managed و unmanaged بهترین گزینه است.

هیچ نظری موجود نیست:

ارسال یک نظر