PDA

View Full Version : struct یا HashTable



ali_72
شنبه 22 فروردین 1394, 08:13 صبح
سلام
در یک پروژه برای نگهداری اطلاعات کلاینت های متصل به سرور از struct استفاده کردم در خیلی از مثال ها در لینک های مختلف دیدم که از HashTable برای اینکار استفاده می کنند.
کاربرد و مفهوم HashTable رو میدونم.
سوالم اینه که استفاده از کدوم بهتره؟ از نظر حافظه و کارایی و ...
کدومو پیشنهاد می کنید؟

SabaSabouhi
شنبه 22 فروردین 1394, 09:10 صبح
سلام
در یک پروژه برای نگهداری اطلاعات کلاینت های متصل به سرور از struct استفاده کردم در خیلی از مثال ها در لینک های مختلف دیدم که از HashTable برای اینکار استفاده می کنند.
کاربرد و مفهوم HashTable رو میدونم.
سوالم اینه که استفاده از کدوم بهتره؟ از نظر حافظه و کارایی و ...
کدومو پیشنهاد می کنید؟

سلام
حافظه مهم نیست، چون تعداد کلاینت‌ها احتمالاً به اندازه‌ای زیاد نیست که نگران کننده باشه، ضمن این که حافظه‌ها الان
به اندازه‌ی کافی زیاد هستن. اما کارایی مهمه.
در ضمن struct برای نگهداری یک رکورد هست نه تمام رکوردها، این structها رو کجا نگهداری می‌کنی؟
در کل استفاده از کلاس خیلی به‌تر از struct هست.
و برای نگهداری می‌تونی از ساختارهایی مثل Dictionary هم استفاده کنی.

صبا صبوحی

Hamid2547
شنبه 22 فروردین 1394, 09:25 صبح
این دو با هم قابل مقایسه نیستن، استراکت برا زمانی هست که نمیخایم از کلاس استفاده کنیم و دیتا تایپ مورد نظر خیلی کوچک هست در نتیجه داده جای اینکه بره توی هیپ روی استک میمونه (چون استراکت ولیو تایپ هست)، و استک هم سریع تر از هیپ هست (هیپ رفرنس تایپ هست)، مثل ذخیره یک نقطه x و y یا نگاه کنید به نوع int و double و...، هش تیبل زمانی استفاده میشه که توی برنامه لازم باشه مقدار زیادی داده سرچ بشه، در این مورد هر داده ذخیره شده یه هش کد میگیره و اطلاعات بر این اساس سرچ میشن و مثل کالکشن های دیگه از اول تا اخر آرایه سرچ نمیشه، در ضمن برای زمان هایی که تکراری بودن داده براتون مهم باشه هش تیبل متد های جالبی برای مانور دادن روی این قضیه داره.

SabaSabouhi
شنبه 22 فروردین 1394, 13:45 عصر
این دو با هم قابل مقایسه نیستن، استراکت برا زمانی هست که نمیخایم از کلاس استفاده کنیم و دیتا تایپ مورد نظر خیلی کوچک هست در نتیجه داده جای اینکه بره توی هیپ روی استک میمونه (چون استراکت ولیو تایپ هست)، و استک هم سریع تر از هیپ هست (هیپ رفرنس تایپ هست)، مثل ذخیره یک نقطه x و y یا نگاه کنید به نوع int و double و...، هش تیبل زمانی استفاده میشه که توی برنامه لازم باشه مقدار زیادی داده سرچ بشه، در این مورد هر داده ذخیره شده یه هش کد میگیره و اطلاعات بر این اساس سرچ میشن و مثل کالکشن های دیگه از اول تا اخر آرایه سرچ نمیشه، در ضمن برای زمان هایی که تکراری بودن داده براتون مهم باشه هش تیبل متد های جالبی برای مانور دادن روی این قضیه داره.

سلام
البته باید توجه داشته باشی که ValueType به شرطی روی Stack می‌شینه که توی یک بلوک ( مثل یک متد ) تعریف شده باشه، در غیر این صورت
اون هم توی Heap ایجاد می‌شه.
ضمن این که وجود یک شی توی Heap یا Stack تفاوت سرعت خاصی ندارن.

صبا صبوحی

Hamid2547
یک شنبه 23 فروردین 1394, 09:50 صبح
سلام
البته باید توجه داشته باشی که ValueType به شرطی روی Stack می‌شینه که توی یک بلوک ( مثل یک متد ) تعریف شده باشه، در غیر این صورت
اون هم توی Heap ایجاد می‌شه.
ضمن این که وجود یک شی توی Heap یا Stack تفاوت سرعت خاصی ندارن.

صبا صبوحی
خوب اون دیگه اصلا ولیو تایپ حساب نمیشه، چون در قالب یک کلاس و آبجکت رفته روی هیپ، در مورد تفاوت سرعت هم اشتباه میکنید، زمانی که دسترسی به داده زیاد تکرار بشه یا در موقعیتی باشیم که از کلاس استفاده کردیم و داده باید باکس و آنباکس بشه، استک سریع تر هست، ولی برای نرم افزار های روزمره و معمولی این تفاوت سرعت احساس نمیشه.
اطلاعات بیشتر (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)

SabaSabouhi
یک شنبه 23 فروردین 1394, 12:26 عصر
خوب اون دیگه اصلا ولیو تایپ حساب نمیشه، چون در قالب یک کلاس و آبجکت رفته روی هیپ، در مورد تفاوت سرعت هم اشتباه میکنید، زمانی که دسترسی به داده زیاد تکرار بشه یا در موقعیتی باشیم که از کلاس استفاده کردیم و داده باید باکس و آنباکس بشه، استک سریع تر هست، ولی برای نرم افزار های روزمره و معمولی این تفاوت سرعت احساس نمیشه.
اطلاعات بیشتر (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)

سلام
دوست عزیز، متاسفانه با شما موافق نیستم.
1. چرا گمان می‌کنی که اگه یه ساختاری تو قالب کلاس بره دیگه ValueType نیست؟ مهم نیست که یه ساختار کجا تعریف می‌شه. وقتی به صورت struct تعریف می‌کنیم هنگام
ارسال این ساختار به یه متد به صورت Call by value عمل می‌شه.
2. و اما در مورد تفاوت سرعت، من هرگز نگفتم که سرعت یکی هست، دقیقاً گفتم «تفاوت سرعت خاصی ندارن» شما می‌تونی عملاً هم تست کنی، اختلاف زمانی به حدی
ناچیز هست که به راحتی قابل صرف‌نظر هست. مگه تو برنامه‌های خیلی خاص، که حجم کار خیلی بالا هست و زمان خیلی مهم که اگه واقعاً این‌طور باشه، اصولاً به‌تره سراغ
زبان‌های سریع‌تر بریم مثل ++C که native کامپایل می‌شه.

صبا صبوحی