عنوان:

‫نکاتی برای کار بهینه‌ی با آرایه‌ها در سی‌شارپ


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۱۳ ۱۰:۰۵
آدرس: www.dntips.ir
مقدمه
در این مقاله، تکنیک‌های کارآمد برای کار با آرایه‌ها در زبان سی‌شارپ (#C) بررسی می‌شود. تمرکز بر استفاده از ArraySegment<T> و Span<T> برای برش آرایه‌ها و بهینه‌سازی عملکرد است. این ابزارها به کاهش مصرف حافظه و بهبود کارایی، به‌ویژه در برنامه‌های حساس به عملکرد، کمک می‌کنند.

برش آرایه‌ها با ArraySegment<T> و Span<T>
برش آرایه‌ها به معنای دسترسی به بخشی از آرایه بدون کپی کردن داده‌ها است. ArraySegment<T> یک ساختار است که بخشی از آرایه را نمایان می‌کند و برای پردازش داده‌ها بدون بار اضافی حافظه مناسب است. مثال زیر نشان می‌دهد چگونه می‌توان با ArraySegment<T> بخشی از آرایه را استخراج کرد:
int[] numbers = { 1, 2, 3, 4, 5 };
var slice = new ArraySegment<int>(numbers, 1, 3); // نتیجه: {2, 3, 4}
با این حال، ArraySegment<T> محدود به آرایه‌های مدیریت‌شده است. در مقابل، Span<T> یک نوع جدیدتر است که نه تنها با آرایه‌های مدیریت‌شده، بلکه با حافظه مبتنی بر پشته و حافظه مدیریت‌نشده نیز کار می‌کند. مثال زیر استفاده از Span<T> را نشان می‌دهد:
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> slice = numbers.AsSpan(1, 3); // برش کارآمد: {2, 3, 4}
Span<T> به دلیل طراحی بهینه، برای سناریوهای نیازمند دسترسی سریع و ایمن به حافظه، مانند پردازش داده‌های بزرگ، مناسب است.

بهینه‌سازی عملکرد باSpan<T>
در برنامه‌های حساس به عملکرد، مانند سرورهای وب، Span<T> با کاهش تعاملات با جمع‌کننده زباله (Garbage Collector) و ارائه دسترسی مستقیم به حافظه، عملکرد را بهبود می‌بخشد. برخلاف ArraySegment<T> که ممکن است سربار داشته باشد، Span<T> سریع‌تر عمل می‌کند و نسخه‌های فقط‌خواندنی مانند ReadOnlySpan<T> برای جلوگیری از تغییرات ناخواسته داده‌ها ارائه می‌دهد.
مقایسه نشان می‌دهد Span<T> برای پردازش همگام (Synchronous) و نیاز به عملکرد بالا ترجیح داده می‌شود، در حالی که ArraySegment<T> برای سازگاری با رابط‌هایی مانند IList<T> یا استفاده از LINQ مناسب‌تر است.

جدول مقایسهArraySegment<T> و Span<T>

ویژگیArraySegment<T>Span<T>
نوع حافظه پشتیبانی‌شدهفقط آرایه‌های مدیریت‌شدهآرایه‌ها، حافظه مبتنی بر پشته، حافظه مدیریت‌نشده
عملکردممکن است سربار داشته باشدبهینه برای برنامه‌های حساس به عملکرد
قابلیت فقط‌خواندنیندارددارد ReadOnlySpan
مورد استفادهسازگاری با APIهای قدیمی، LINQپردازش سریع، سناریوهای همگام




مشاهده مطلب اصلی