PDA

View Full Version : علت پایین بودن سرعت نمایش اطلاعات درون listView ؟



md3848
سه شنبه 24 شهریور 1394, 14:32 عصر
سلام:لبخندساده:
من کلی محاسبات ریاضی با c# انجام میدم اما وقتی میخوایم این اطلاعات رو تو listView نشون بدم سرعت کار و اجرای کد های خیلی خیلی میاد پاین(یعنی میشه گفت 1 به 10 میشه....شاید هم بیشتر)

بعد اومدم تو listView گفتم عدد 1 رو شون بده مثلا.....بازم فرقی نکرد:گریه:


چرا سرعت نمایش اطلاعات تو listView پایینه....جیکارش کنم؟؟؟؟


از چه کامپوننتی استفاده کنم که این مشکل رو نداشته باشه (مثل listView قابلیت ستون بندی داشت باشه


منتظر نظرات و پیشنهادات شما دوستان و اساتید هستم.:لبخندساده:

md3848
سه شنبه 24 شهریور 1394, 23:30 عصر
آقا من از گرید ویو استفاده میکنم الان..........ولی بازم مشکل کم شدن سرعت نمایش اطلاعات هنگام اجرای این تابع بازم وجود داره

این گرید ویو من 5 تا ستون داره(که نتیجه حاصل از یه سری ضرب و تقسیم قراره توش نمایش داده بشه) که تقریبا باید 1-10 هزار مورد توش نشون بدم............کاری نمیشه کرد سرعت نمایش اطلاعات بره بالا؟
یا این که از روش دیگه ای استفاده کرد


جان داش راهنمایی کنید ....:گریه:

ژیار رحیمی
سه شنبه 24 شهریور 1394, 23:49 عصر
دوست گرامی کدتونو بزارید تا بشه در مورد مشکل حرف زد

md3848
چهارشنبه 25 شهریور 1394, 12:30 عصر
ممنون از شما
راسش کدش چیز خاصی نیست....فقط چون تعداد مواردی که باید نشون بده میشه گفت بالای 10 هزار تا هستش...به این علت سرعت میاد پایین.

این گرید ویو من 5 تا ستون دارم...، که برا این که تعداد اطلاعات قابل نمایش تو گرید ویو رو کاش بدم باید ببینم به ازای OCRn_Round های یکسان اونی رو انتخاب کنم و نمایش بدم که ErrorFrequence کمتر باشه.....میشه این کارو کرد؟؟؟؟ چطور؟؟؟
dataGridViewX1.Rows.Add(N[i], ErrorClock, ErrorFrequence, OCRn_Round, j);



یه راه که به ذهنم میرسه اینه که این اطلاعات به جای نمایش تو گرید ویو تو یه حافظه ذخیره بشه و بعد جست و جوی مورد نظر انجام بشه(که در بالا نحوه کارش رو گفتم) و بعد تو گرید ویو نمایش داده بشه......این کار عملیه.؟؟؟

راه بهتری اگه هستش ممنون میشم بگید.


اینم از کدهام

for (int j = 2; j < OCRn; j++)
{
OCRn_Broken = OCRn / j;
OCRn_Round = (Int64)Math.Round(OCRn_Broken, 0);
ErrorClock = (OCRn_Broken - OCRn_Round) * j; // Clock
ErrorFrequence = (Fm / ((2 * N[i]) * (1 + OCRn_Broken * j))) - (Fm / ((2 * N[i]) * (1 + OCRn_Round * j)));


if (checkb_OCRn_Range.Checked == true && OCRn_Round >= OCRn_Max / 2)
if (OCRn_Round <= OCRn_Max - 1)
dataGridViewX1.Rows.Add(N[i], ErrorClock, ErrorFrequence, OCRn_Round, j);
if (checkb_OCRn_Range.Checked == false)
if (OCRn_Round <= OCRn_Max - 1)
dataGridViewX1.Rows.Add(N[i], ErrorClock, ErrorFrequence, OCRn_Round, j);
}

ژیار رحیمی
چهارشنبه 25 شهریور 1394, 14:32 عصر
دوست گرامی با توجه به کد شما بهتره موازی سازی انجام بدی با استفاده از Task انچه متوجه شدم میتوان بازه حلقه for رو به چندین قسمت تقسیم کرد و هر قسمت رو بصورت مجزا و همزمان با اجرای قسمت های دیگه اجرا کرد.
بهتره از متغیرهای کمکی بهره گیری کنی الان تو کد نویسی شما این بخش از کد شما دو بار محاسبه میشه بهتره یه بار محاسبه و نتیجه آن در یه متغییر نگداری و به جای این قسمت از اون متغییر استفاده کنی

(2 * N[i])


در تعداد بالا این این اصلاح تاثیری در زمان اجرا خواهد داشت

var tmp=(2 * N[i]);
ErrorFrequence = (Fm / (tmp * (1 + OCRn_Broken * j))) - (Fm / tmp * (1 + OCRn_Round * j)));


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

md3848
چهارشنبه 25 شهریور 1394, 14:52 عصر
بهتره بجای مستقیم نوشتن خروجی تو سلول دیتاگرید از یه لیست کمکی استفاده کنی و نتایج رو تولیست بنویسی و در پایان لیست رو به دیتاگرید بایند کنی(اینم در زمان اجرا تاثیرگذار است)

ممنون از شما، این قسمت رو میشه بیشتر توضیح بدید، متوجه نشدم دقیقا
میگم چطور من میتونم قبل از این که اطلاعات رو تو "گرید ویو" نشون بدم، تو یه حافظه ای ذخیره کنم و بعد نتایج تکرای رو حذف کنم و بعد نتایج باقی مونده رو نشون بدم؟؟؟

ژیار رحیمی
چهارشنبه 25 شهریور 1394, 15:27 عصر
ابتدا یه کلاس کمکی که دران فیلد ها ی لازم برای داده هات تعیرف کن یه نمونه

public class CusRow
{


public int filed1 { get; set; }
public decimal field2 { get; set; }
//
//سایر فیلد ها
}



نمونه سازی از کلاس لیست با نوعی از کلاس ساخته شده

var ListItem=new List<CusRow>();

نحونه اضافه کردن ایتم به لیست در کد

ListItem.Add(new CusRow{par1,par2,});

در آخرم بایند کردن به دیتا گرید

datagrid.DataSource=ListItem.ToList();

ژیار رحیمی
چهارشنبه 25 شهریور 1394, 15:34 عصر
البته استفاده از موازی سازی به مراتب زمان اجرا رو کاهش میده

Salar Ashgi
چهارشنبه 25 شهریور 1394, 23:46 عصر
افت سرعت در این شرایط زیاد هم دور از انتظار نیست چون شما یه لود کردن معمولی ندارید ، اینطور که معلومه الگوریتم سنگینی واسه لود انتخاب شده.بهتره از Thread ها استفاده کنید البته اگه بتونید خوب مدیریت کنید نخ ها رو.موفق باشید ./

md3848
پنج شنبه 26 شهریور 1394, 15:33 عصر
ممنون از شما دوستان:قلب:
این نخ هم چیز باحالیه ها...:لبخند:
برا این محاسبات که مثلا ممکنه اون حلقه for ، تعداد تکرارش به 100 میلیارد برسه:لبخند: به نظرتون از چند نخ استفاده کنم بهتره؟ آیا محدودیتی وجود داره؟
این طور که من تست کردم نخ هر چی بره بالا تر بهتره....البته برا تعداد تکرار کم for استفاده از نخ سرعت رو کم میکنه اما نخ خودشو تو تعداد تکرار بالای for نشون میده اون طور که من تست کردم

md3848
پنج شنبه 26 شهریور 1394, 16:35 عصر
تو ضرب آرایه 4 هزار ر 4هزار
تو حالت عادی : 900 ثانیه تقریبا
نخ 10 : 230 ثانیه تقریبا