مقایسه عملکرد فیلتر تارشدگی گاوسی VLC در C و C# با استفاده از Native AOT — C vs. C#: racing VLC's Gaussian blur
خلاصه
این مقاله عملکرد یک پلاگین ویدئویی در مدیا پلیر VLC را که یک بار با زبان C و بار دیگر به صورت خط به خط با C# و فناوری .NET Native AOT پیادهسازی شده، مقایسه میکند. نتایج نشان میدهد که C# با بهینهسازیهای مناسب میتواند به کارایی بسیار نزدیک به C دست یابد و پردازش ویدئوی سنگین را به خوبی مدیریت کند.
برنامهنویسان اغلب تصور میکنند که نوشتن کدهای پردازش تصویر و ویدئوی سنگین با زبانهای مدیریتشده مانند C# به دلیل وجود ابزارهای مدیریت حافظه یا تفاوتهای کامپایلری کارایی مناسبی ندارد. در همین راستا، یک آزمایش جالب انجام شده است تا فیلتر تارشدگی گاوسی یا همان Gaussian blur در مدیا پلیر محبوب VLC که به زبان C نوشته شده، خط به خط به C# پورت شود و سرعت اجرای این دو روی فریمهای یکسان مقایسه گردد.
پسزمینه و نحوه کار فیلتر
تارشدگی گاوسی یکی از قدیمیترین افکتهای پردازش تصویر است که پیکسلها را با میانگین وزنی همسایگانشان جایگزین میکند تا تصویری شبیه به لنز خارج از فوکوس ایجاد شود. این فیلتر به صورت افقی و عمودی اعمال میشود و در VLC به صورت پیشفرض با کدهای بهینه C پیادهسازی شده است.
برای مقایسه عادلانه، نسخه C# با استفاده از فناوری .NET Native AOT کامپایل شد تا به صورت یک فایل DLL بومی (Native) مستقیماً توسط VLC بارگذاری شود. از آنجا که در این کد از اشارهگرهای خام (Raw Pointers) استفاده شده و هیچ شیء جدیدی در هیپ مدیریتشده (Managed Heap) تخصیص داده نمیشود، زبالهروب یا همان Garbage Collector عملاً کاری برای انجام دادن ندارد.
مراحل مقایسه و نتایج عملکرد
این آزمایش در سه مرحله انجام شد:
- دور اول (پیادهسازی خط به خط): در ابتدا نسخه C# حدود ۲۳ درصد کندتر از نسخه C اجرا شد. بررسی کدهای ماشین تولیدشده نشان داد که کامپایلر LLVM در زبان C کدهای بهینهتری نسبت به موتور RyuJIT در داتنت برای حلقهها تولید میکند. با اعمال دو تغییر کوچک شامل ذخیره محدودههای حلقه در متغیرهای محلی و استفاده از نوع داده nint برای ایندکسها، فاصله عملکرد C# تا ۸ درصد C کاهش یافت.
- دور دوم (بهینهسازی الگوریتم مشترک): با اعمال بهینهسازیهایی مانند جایگزینی تقسیم با ضرب، خواندن ترتیبی حافظه و استفاده از تقارن منحنی، هر دو نسخه بسیار سریعتر شدند. نسخه C# همچنان حدود ۲۴ درصد عقبتر بود زیرا کامپایلر Clang کدهای C را به طور خودکار به دستورات SIMD تبدیل میکرد.
- دور سوم (بهینهسازی حداکثری با SIMD): در این مرحله هر دو نسخه از دستورات برداری AVX2 استفاده کردند. پس از تنظیم دقیق کدهای C# تا کامپایلر داتنت خروجی مشابهتری با Clang تولید کند، عملکرد دو زبان در سطوح تارشدگی مختلف تقریباً برابر شد و نسخه C# تنها حدود ۹ درصد کندتر ظاهر شد.
چرا این بررسی برای مهندسان اهمیت دارد؟
نتیجه کلیدی این آزمایش این است که C# یک انتخاب کاملاً واقعبینانه و کارآمد برای توسعه پلاگینهای پردازشی پردازنده محور در نرمافزارهایی مانند VLC است. نسخه C# توانست ویدیوی 1080p را با سرعت مناسبی پردازش کند.
هزینه واقعی استفاده از C# در چنین سناریوهایی، نیاز به شناخت نحوه تولید کد توسط کامپایلر داتنت و گاهی بازنویسی دستی کد برای نزدیک شدن به خروجی بهینهسازهای C است. اگرچه برای آخرین ده درصد بهینهسازی مطلق هنوز زبان C انتخاب اول است، اما برای سایر موارد، بهرهوری بالاتر زبان C# در کنار یک الگوریتم خوب میتواند نتایج فوقالعادهای به همراه داشته باشد.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل