PDA

View Full Version : چرا از ArrayList استفاده نکنم؟



اوبالیت به بو
دوشنبه 02 فروردین 1389, 10:53 صبح
سلام
من بارها و بارها تو پست ها دیدم که گفته شده

بهتره از ArrayList استفاده نکنید، چون عمل Boxing/Unboxing هنگام دسترسی به عناصر این لیست، Performance سیستم رو پایین میاره. جاش، از List<T> (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx) استفاده کنید.البته این نقل قول بیشتر دم دست بود این رو گذاشتم. چندین بار به خودم تذکر دادن که از ArrayList استفاده نکن و از لیست جنریک ها استفاده بکن.

از اونجایی که خودم مبحث جنریک ها رو دنبال نکردم (نفهمیدم) می خوام بدونم با توجه به قدرت سیستم های امروزی (سخت افزار قوی) آیا بازم این حرف معنا پیدا می کنه؟ مثلاً هنوز هم (مثل زمان VB6) برای حلقه های کوچک از byte استفاده می کنن؟ مگه الان سیستم ها قوی نشدن؟ دیگه چه تاثیری داره وقتی این همه قدرت پردازش ها بالا رفته؟
سوال دوم اینکه عمل Boxing/UnBoxing چی جوری Performance سیستم رو کاهش می ده؟ منظور چیه؟

sia_2007
دوشنبه 02 فروردین 1389, 11:32 صبح
ببین دوست من، Array List از جنس Object است و مشکلات از همین جا شروع میشود.
ببینید برنامه از دو قسمت تشکیل شده، Stack و Heap
Object در Heap نگه داشته میشود، اما Int32 و Double و Struct هایی که برای نگه داری دیتا خودمان مینویسیم، در Stack نگه داری میشوند.
حال فرض کنید شما با نیت نگه داری Int32 در Array List ، یک آرایه میگیرید.
حال یک حلقه for برای انجام محاسبات روی این آرایه مینویسید.
ابتدا برای خواندن باید دیتا از Heap به Stack بیاید، UnBoxing و سپس در صورت تغییر از Stack به Heap برود Boxing
یک for معمولی که مثلا یک سری دیتای حقوق رو محاسبه میکنه به راحتی به جا به جایی دو مگابایت RAM در سیستم منجر میشه.
این یک مشکل
دومین مشکل این است که خود Heap هم کندتر از Stack است، البته Stack محدودیت فضا دارد و نمیشه کل برنامه رو درون اون ریخت.
سومین مشکل اینه که در همون فرض Int32 ، شما میتوانید در Array List تان هر چیزی بریزید، اعم از Form ، String و هر چیز دیگری که در این صورت Type Safe بودن برنامه شما زیر سوال میرود.
حتی در صورتی که مثلا یک Array List داشته باشید و بخواهید اشیای از جنس Teacher برنامه خودتان را نگه دارید چه ؟
اشیایی مثل Teacher و Student که در Heap نگه داری میشوند و دیگر مشکل Boxing و UnBoxing ندارند.
اما باز هم استفاده از Type Safe، Array List بودن برنامه را از بین میبرد، به نحوی که در Array List ای که مختص Student است میتوان Teacher ریخت و یا Int32 و ... .
List تمام این مشکلات را حل میکند.
حال شاید بگوییم ما میخواهیم در یک آرایه هم Student نگه داری کنیم، هم Teacher !!!
اون وقت یک Interface میسازیم که نه متدی دارد و نه متغییری و اون رو هم در Teacher و هم در Student پیاده سازی میکنیم، و سپس جنس List مان را از جنس آن Interface قرار میدهیم که هم Teacher بگیرد و هم Student و در ضمن مثلا Int32 و یا Person و .. نگیرد.