PDA

View Full Version : سرعت بسیار کند سی شارپ در مقایسه با دلفی



esmit61
جمعه 30 خرداد 1393, 21:25 عصر
سلام. من قطعه کد زیر رو با C#‎‎‎ نوشتم. زمان اجراش روی کامپیوتر من حدود 80 ثانیه هست.
ولی وقتی معادل همین کد رو با دلفی اجرا میکنم حدود 10 ثانیه زمان میبره.(توی دلفی از AdoConnection استفاده میکنم)
احساس میکنم یه جای کارم اشکال داره. ممنون میشم راهنمایی کنید SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI");
conn.Open();
Random rnd = new Random();
string squery="123";
SqlCommand sc = new SqlCommand(squery, conn);
Stopwatch sw = Stopwatch.StartNew();
string s = string.Empty;
progressBar1.Maximum = 10000;
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 5; j++)
{
byte ch = (byte)rnd.Next(65, 91);
s = s + ch.ToString();
}
squery = "Insert into t1 values('"+s+"')";
sc.CommandText = squery;
sc.ExecuteNonQuery();
++progressBar1.Value;
s = string.Empty;
}
sw.Stop();
long Duration= sw.ElapsedTicks;
MessageBox.Show(Duration.ToString());



این هم کد دلفی:


startTime:= GetTickCount;
ProgressBar1.Max:= 10000;
for i := 0 to 10000 do begin
s:='';
for j:=0 to 5 do begin
ch:= RandomRange(65,91);
s:=s+IntToStr(ch);
end;
ADOQuery1.SQL.Text:='Insert into t1 values('+QuotedStr(s)+')';
ADOQuery1.ExecSQL;
ProgressBar1.Position:= ProgressBar1.Position+1;
end;
endTime:= GetTickCount;
ShowMessage(IntToStr(endTime-startTime));

mojtaba0912433
شنبه 31 خرداد 1393, 09:29 صبح
من هم با دلفی کار کردم در مقایسه با سی شارپ به خصوص در ارتباط با بانک اطلاعاتی دارای سرعت بسیار بیشتری است،ولی خوب از لحاظ مسائل فنی دیگه اطلاعاتی ندارم دوستان دیگه باید نظر بدن

hamid_hr
شنبه 31 خرداد 1393, 09:39 صبح
اگه سرعت درج زیاد هست میتونید این کار رو انجام بدین


for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 5; j++)
{
byte ch = (byte)rnd.Next(65, 91);
s = s + ch.ToString();
}
squery += "Insert into t1 values('" + s + "') ";

++progressBar1.Value;
s = string.Empty;
}
sc.CommandText = squery;
sc.ExecuteNonQuery();
sw.Stop();
long Duration = sw.ElapsedTicks;


اینطوری همه اطلاعاتو یک بار با هم درج میکنه

plus
شنبه 31 خرداد 1393, 12:08 عصر
کدهای اضافه رو حذف کنید و فقط معادل این کد رو بنویسید ببینید باز هم اختلاف 8 برابر هست؟

SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI");
conn.Open();
SqlCommand sc = new SqlCommand(squery, conn);
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++) {
sc.CommandText = "Insert into t1 values(1, 2, 3)";
sc.ExecuteNonQuery();
}
sw.Stop();
long Duration = sw.ElapsedTicks;
MessageBox.Show(Duration.ToString());

توی کدها من چیز دیگه ای جز اجرای Query نمیبینم که بتونه عامل تاخیر بشه. البته، بهتره بجای عملگر + برای رشته ها از کلاس StringBuilder استفاده کنید ولی به هر حال فکر نمیکنم این عامل دلیل این اختلاف باشه.
البته شما کد دلفی مروبط به Connection رو نگذاشتین.

esmit61
شنبه 31 خرداد 1393, 13:17 عصر
کد دلفی اتصال با استفاده از AdoConnection هست. یعنی:
AdoConnection1.ConnectionString:='Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI'

کدهای اضافه هم که حذف میشن تغییری حاصل نمیشه
من تازه از ذلفی دارم مهاجرت میکنم به سی شارپ. برنامه ای هم که دارم مینویسم سرعت کار با پایگاه داده برام خیلی مهمه.

plus
شنبه 31 خرداد 1393, 13:23 عصر
من هم مثل شما به نظرم یک جای کار میلنگه اما برام امکانش نیست که هر دو رو تست کنم...ممکنه ADO.NET کندتر باشه اما این اختلاف به هر حال عجیب هست...
در هر صورت، اجرای جدا جدای چند هزار دستور SQL هم منطقی نیست.همونطور که یکی از دوستان گفتن بهتره همه رو یکجا اجرا کنید..

esmit61
شنبه 31 خرداد 1393, 16:30 عصر
همونطور که یکی از دوستان گفتن بهتره همه رو یکجا اجرا کنید
برنامه ای که دارم مینویسم از چند تا thread تشکیل میشه که هر thread فضای پردازشی خاص خودش رو داره. در هر ترد هم به صورت مرتب در یک حلقه داره دستور ثبت در پایگاه میاد. اینکه بخوام همه رو با هم تجمیع کنم و یکباره بدم به پایگاه ساختار منطقی thread ها رو دچار اشکال میکنه. ضمن اینکه وقتی با دلفی این قضیه داره خیلی خوب جواب میده چرا نباید با سی شارپ قابل پیاده سازی باشه؟
شما توی برنامه هاتون تا حالا به مشکل کندی سرعت کار با پایگاه بر نخوردید؟ (البته زمانی که حجم زیادی از اطلاعات در واحد زمان قراره ثبت بشن- بحث Bulk insert هم نیست)
باز هم ممنون از پیگیریتون

plus
شنبه 31 خرداد 1393, 16:56 عصر
من نمیدونم دارین چکار میکنید اما شاید بتونید با مدیریت صحیح روشی برای اجرای یکجای دستورات (تا یه حد مشخص، مثلا هر 100 تا) پیدا کنید.
طبیعتا زمانی که حجم زیادی از اطلاعات قراره از پروسه برنامه به پروسه SQL Server بره، در هر محیطی، این عمل زمانبر هست و اصلا هم غیر طبیعی نیست.موضوع این هست که شما با #C و Delphi زمان های خیلی متفاوتی بدست میارین.من شک دارم که شرایط در یک جایی که خودتون متوجه نیستین برابر نیست وگرنه این اختلاف وجود نداشت.

hamid_hr
شنبه 31 خرداد 1393, 17:22 عصر
من تست کردم 13 ثانیه طول کشید تا درج کنه همشو :متفکر:

esmit61
یک شنبه 01 تیر 1393, 10:33 صبح
مشکل پیدا شد. من برنامه رو از توی IDE دات نت اجرا میکردم. وقتی فایل مستقیم Exe رو اجرا کردم زمان اجرا از 55 ثانیه به حدود هفت ثانیه رسید.

nazanin366
یک شنبه 01 تیر 1393, 10:58 صبح
مشکل پیدا شد. من برنامه رو از توی IDE دات نت اجرا میکردم. وقتی فایل مستقیم Exe رو اجرا کردم زمان اجرا از 55 ثانیه به حدود هفت ثانیه رسید.
برای اجرای بهتر باید به جای debug کردن،نرم افزار رو release کنید

mortezamhd
یک شنبه 01 تیر 1393, 11:47 صبح
یک نظر کاملا شخصی

من توی یک سازمان مجبور بودم با اوراکل کار کنم (جهت واکشی تصاویر نامه در اتوماسیون اداری) و میتونم بگم دلفی در زمینه بانک اطلاعاتی واقعا سر تره (هم سرعت،هم سادگی کار)