تفاوت آرایه و لیست در سی شارپ چیست؟
یک آرایه و یک لیست هر دو به عنوان مجموعه ای از مقادیر عمل می کنند، اما در نحوه ذخیره محتوای خود در حافظه و نحوه دسترسی به آنها متفاوت هستند. به منظور استفاده موثر از هر یک از آن ها، باید تفاوت های بین آن ها را درک کنیم تا بتوانیم مناسب ترین مورد را برای اهداف خود انتخاب کنیم.
آرایه در سی شارپ چیست؟
آرایه مجموعه یا دنباله ای از عناصر است و می تواند انواع مختلفی داشته باشد (string، float، int، float و غیره...) اما باید از یک نوع باشند. آرایه اجازه می دهد تا بسیاری از متغیر های یک نوع را در یک متغیر ذخیره کنید.
یکی از ویژگی های اصلی آرایه ها در سی شارپ این است که همیشه طول مشخصی دارند که برابر با تعداد عناصری است که در داخل آن ها قرار می گیرند.
لیست در سی شارپ چیست؟
لیست گروهی از اشیاء است و می تواند انواع مختلفی داشته باشد.
تفاوت اصلی لیست با آرایه در سی شارپ این است که برخلاف آرایه ها طول آن نباید تعریف شود، آن ها می توانند طول متغیر داشته باشند.
در این مقاله قصد داریم Benchmark و کارایی List<T> با سایز داینامیک، List<T> با سایز ثابت و Array ها را بررسی کنیم.
ابتدا یک برنامه کنسول .Net 7.0 ایجاد می کنیم و Benchmark های خودمان را برای تست و ارزیابی List<T>، Array و List<T>(count) می نویسیم.
برای استفاده از Benchmark ابتدا باید پکیج BenchmarkDotNet را نصب کنیم:
dotnet add package BenchmarkDotNet --version 0.13.2
برای بررسی Benchmark لیست در سی شارپ دو سناریو در نظر می گیریم. در سناریوی اول، دو List<T> ایجاد می کنیم که یکی از آنها یک لیست پویا است و در سناریوی دوم ظرفیت لیست را در سازنده لیست تنظیم می کنیم. تعداد ظرفیت های مختلف را به هر دو لیست اضافه می کنیم و نتیجه Benchmark را بررسی می کنیم.
ما یک کلاس "ListCapacityPerformance" ایجاد می کنیم و آن را با ویژگی [MemoryDiagnoser] مزین می کنیم. MemoryDiagnoser امکان اندازه گیری تعداد بایت های اختصاص داده شده و فرکانس garbage collection(جمع آوری زباله) را فراهم می کند.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
[MemoryDiagnoser]
public class ListCapacityPerformance
{
.
.
}
با ویژگی [Params()] می توانیم مجموعه ای از مقادیر را برای ظرفیت لیست مشخص کنیم. مقدارها باید ثابت باشند. در نتیجه، برای هر مقدار نتیجه ای دریافت خواهیم کرد.
[Params(20, 80, 300, 800)]
public int capacity;
در مثال زیر، ما List<> را ایجاد می کنیم اما هیچ ظرفیتی برای آن تنظیم نمی کنیم. سپس ما اعدادی را برای هر متغیر آرایه "count" به این لیست پویا اضافه می کنیم. در پایان، تخصیص حافظه، زمان کل و غیره را بررسی خواهیم کرد.
در مثال دوم، ما " List<int>(capacity)" را با ظرفیت ثابت ایجاد خواهیم کرد. برای هر حلقه، طول لیست را به عنوان مقدار capacity تعیین می کنیم.
برای اجرای بنچمارک ها باید تکه کد زیر را در فایل Program.cs وارد کنیم:
var summary1 = BenchmarkRunner.Run<ListCapacityPerformance>();
کد کامل مربوط به این بنچمارک را می توانید در زیر مشاهده نمایید:
پروژه را در حالت “Release” بیلد می کنیم و سپس آن را به صورت “Start Without Debugging” اجرا می کنیم.
در تصویر زیر مشاهده می کنید که حافظه تخصیص داده شده(allocated) به لیست با ظرفیت ثابت، کمتر و سریع تر است. حتی با مقادیر بزرگتر، این gap بیشتر می شود.
اگر یک مورد را به List<>(x) اضافه کنید که بیش از ظرفیت آن باشد، سی شارپ اندازه لیست را 2 برابر اندازه فعلی برای هر بار اضافه کردن افزایش می دهد. List<> همیشه قبل از اضافه شدن هر مورد، حد خود را بررسی می کند.
مقایسه List و Array در سی شارپ
گاهی اوقات در مقابل بسیاری از مزایای List ها، کار با Array ها می تواند بهتر باشد.
برای بررسی این موضوع مثال زیر را بررسی می کنیم. مانند مثال بالا، ما از 1 تا حداکثر count را به یک لیست و یک آرایه اضافه کرده ایم.
کد کامل مربوط به این بنچمارک را می توانید در زیر مشاهده نمایید:
همانطور که در بنچمارک ها می بینیم Array بسیار سریع تر از List است. می دانیم که بیشتر توسعه دهندگان استفاده از List را به جای Array به دلایل زیر ترجیح می دهند:
List در سی شارپ دارای روش های خاصی برای افزودن، حذف، جستجو و مرتب سازی عناصر است.
List<T> یک ساختار داده پویا است، به این معنی که وقتی آن را ایجاد می کنیم نیازی به دانستن تعداد عناصر نداریم. بنابراین اندازه لیست را می توان در زمان اجرا افزایش داد.
Array ها در سی شارپ نسبت به List ها کمتر مورد استفاده قرار می گیرند، اما بسیار سریع تر هستند. ما می توانیم عناصر یک آرایه را با استفاده از index ها جستجو کنیم. اما لیست نیاز به iteration(تکرار) دارد، این به معنای کندی زمان جستجو برای لیست است. بر خلاف لیست ها، آرایه ها به حافظه کمتری نیاز دارند. اما لیست ها ویژگی های مفید زیادی دارند، بنابراین نسبت به آرایه ها ارجحیت دارند.
دریافت سورس پروژه مقایسه List و Array در سی شارپ در net7
نتیجه گیری:
ساختارهای داده بسیار متفاوتی در سی شارپ وجود دارد. هر ساختار داده دارای نقاط قوت و ضعفی است که بسته به کار بر عملکرد تأثیر می گذارد. ما در این مقاله در مورد آرایه ها و لیست ها صحبت کردیم و آن ها را با هم مقایسه و بررسی کردیم. امیدوارم این مقاله به شما در درک تفاوت های آرایه و لیست در سی شارپ کمک کرده باشد.
برای ثبت نظر باید در سایت ثبت نام یا ورود نمایید