PDA

View Full Version : سربار ناشی از پاس دادن پارامتر



spring69
جمعه 15 مهر 1390, 02:19 صبح
سلام.
سرباری که از پاس دادن یک ساختمان داده( مثلا یک جنریک لیست با 1000 آیتم) بر روی برنامه ایجاد میشه چقدره؟
تعریف ساختمان داده به صورت عمومی بصرفه تره یا مثلا 3 بار پاس دادن به متودهای مختلف؟
با تشکر...

exlord
جمعه 15 مهر 1390, 12:10 عصر
میتونید به صورت reference پاس بدین ...
public void Method( ref List<MyClass> list)

spring69
جمعه 15 مهر 1390, 12:38 عصر
ممنون از پاسختون.
مزیت پاس دادن با آدرس چیه؟
آیا اگر بخوایم فقط از مقادیر اون استفاده کنیم و قصدمون تغییر در لیست و انعکاس لیست تغییر داده شده نباشه بازم تو کارایی تاثیر مثبت داره؟
آیا اینکه هر پارامتری رو با آدرس ارجاع بدیم درسته؟
مثلا فرض کنید یه ساختمان داده رو به یک متود که وظیفه اون ذخیره این ساختمان داده در فایل هست رو میخوایم پاس بدیم. در این مورد ارجاع به آدرس درسته؟

یک سوال دیگه اینکه: پاس دادن با مقدار ( یعنی بدون استفاده از کلمه ref) باعث ساختن یک کپی از اون میشه و سربار زیادی رو روی برنامه ایجاد میکنه؟

محسن شامحمدی
جمعه 15 مهر 1390, 17:16 عصر
مزیت پاس دادن با آدرس چیه؟
خب معلومه.دیگه نیازی نیست از این حجم دیتای شما توی رم کپی ایجاد بشه.


آیا اگر بخوایم فقط از مقادیر اون استفاده کنیم و قصدمون تغییر در لیست و انعکاس لیست تغییر داده شده نباشه بازم تو کارایی تاثیر مثبت داره؟
بالا گفتم.چون از اطلاعات حجیم کپی نمی شه توی رم کارایی به مراتب بالاتره.



آیا اینکه هر پارامتری رو با آدرس ارجاع بدیم درسته؟
مثلا فرض کنید یه ساختمان داده رو به یک متود که وظیفه اون ذخیره این ساختمان داده در فایل هست رو میخوایم پاس بدیم. در این مورد ارجاع به آدرس درسته؟

این بیشتر برمی گرده به دید شما.
اگر شما بیشتر به سرعت و کارایی اهمیت بدید خب می تونید از این روش استفاده کنید.
ولی اگر دنبال این هستید که به هر قیمتی استاندارد کد بنویسید حتی به قیمت از دست رفتن سرعت برنامه و همچنین استفاده شدید برنامه از حافظه Ram می تونید از همون روش کپی استفاده کنید.

FastCode
جمعه 15 مهر 1390, 17:39 عصر
من پاسختون رو به دو بخش تقسیم میکنم.
1.
class
2.
struct

اگر یک کلاس رو پاس بدید سرباری وجود نداره.اگر با ref پاس بدید سرباری که وجود نداره تقریباً دو برابر میشه که میشه در نظر نگرفت.

اگر یک struct رو پاس بدید چون کپی میشه سربار بسیار زیادی به وجود میاره
برای جلوگیری از سربار میتونید یک pointer پاس بدید یا از ref استفاده کنید.
فراموش نکنید که اگر با ref پاس بدید اگر دوباره assign کنید کپی میشه.

http://stackoverflow.com/questions/13049/whats-the-difference-between-struct-and-class-in-net
پاسخ دوم دقیقاً پاسخ شوال شماست(چیزی اضافه نداره)

اگر C++‎ بلدید یه سری به std::move بزنید.