PDA

View Full Version : حرفه ای: چه تفاوتی بین کد Linq زیر با حالت قدیمی هست



ebrahim.rayatparvar
چهارشنبه 20 مرداد 1395, 11:41 صبح
سلام دوستان و مهندسهای عزیز انجمن.

ظاهرا که رو عنوان یه کوچیک غلط املایی دارم :لبخند: تفاوتی نه تفوتی
میخواستم تفاوت این کد زیر :


var rowsToDelete = dt.AsEnumerable()
.Where(r => r.Field<string>("name") == "1")
.ToList();

foreach (var row in rowsToDelete)
dt.Rows.Remove(row);


که برای برای پاک کردن مقدارهایی در DataTable هست که بر اساس شرطی که روی فیلد Name گذاشتم میاد سطر های مورد نظر رو پاک میکنه حالا به نظر شما این کد بالا بهتر از اینه که بیام یه حلقه for بزارم و تک تک سطر ها رو چک کنم و پاک کنم؟؟؟
چون تو sql تا جایی که من خوندم مثلا برای کار های خودش نمیاد سطر به سطر این کار رو بکنه و چون ساختار B-Tree داره خیلی سریع جستجوهای خودش رو انجم میده حالا Linq هم همین کار رو میکنه یا نه تفاوتی با همون حالت یه حلقه for بزاریم و تک تک چک کنیم نداره

nunegandom
چهارشنبه 20 مرداد 1395, 12:48 عصر
سلام
کلا قسمت sql performance و linq performance بستگی به کد نویسی تون داره
تویه linq راحت تر و سریع تر کارتون راه میوفته ولی خوب همیشه sql سریع تره (نظر شخصی)
اینو شما یه مطالعه بکن (http://www.codeproject.com/Articles/38174/How-to-improve-your-LINQ-query-performance-by-5-X)
قسمت sql هم کلی مکافات داره در بهینه سازی که باید از اساتید همون قسمت سوال کنید

ebrahim.rayatparvar
چهارشنبه 20 مرداد 1395, 13:06 عصر
الان جواب من مشخص نشد یعنی سرعت کار کردن به روش Linq روی DataTable سریع تر از اینه که من کد :




var rowsToDelete = dt.AsEnumerable()
.Where(r => r.Field<string>("name") == "1")
.ToList();

foreach (var row in rowsToDelete)
dt.Rows.Remove(row);



بیام یه حلقه for بزرام و تک تک سطر ها رو چک کنم و اگر شرط بر قرار بود اون سطر رو پاک کنم؟؟؟
کلا با SQL کاری ندارم چون دارم رو مقداری رو dataTable کار میکنم فقط میخواستم بودم Linq موقع پیدا کردن از روش سطر به سطر استفاده میکنه کدی که با حلقه for زده میشه یا نه مثل SQL

bomb23
چهارشنبه 20 مرداد 1395, 15:42 عصر
سلام
سرعت linq کمتره!
http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html

ebrahim.rayatparvar
چهارشنبه 20 مرداد 1395, 17:12 عصر
من امدم یه پروژه برای خودم تست زدم و تو DataTable به صورت دستی 10 میلیون سطر درج کردم و بعد امدمم هر دو روش چه لینک و چه for ساده گفتم بیا فلان عدد که رکورد آخر بود رو پیدا کن که تو روش لینک 2.1 ثانیه طول کشید و حلقه for بیشتر از 2 برابر طول کشید 4.8 ثانیه طول کشیده بعد امدم گفتم 5 میلیون رو پیدا کن که وسط در وسط بود باز لینک همون 2.1 و حلقه for هم تقریبا همین عدد بود و تست آخر رو زدم که گفتم 1 میلیون رو پیدا که که سطر 1 میلیون DataTable ما بود باز هم لینک 2.1 بود ولی for خیلی بهتر یعنی 0.8 ثانیه طول کشید منطقیه ولی لینک چرا براش فرقی نداشت در هر صورت همون 2 ثانیه طول میکشید

nunegandom
پنج شنبه 21 مرداد 1395, 00:46 صبح
اگه اینطور در نظر بگیریم که کد نویسی به صورت صحیح انجام بشه sql سریعتر عمل میکنه
چندین برابر هم سریعتر عمل میکنه
توی اینترنت مقایسه زیاده compare between linq and SQL
از دید اینکه linq باید با sql ارتباط برقرار کنه خوب وقتی یک رابط کمتر بشه سرعت کارمون هم بیشتر میشه

hamid_hr
پنج شنبه 21 مرداد 1395, 10:47 صبح
یک سوال
الان مقایسه بین linq to sql هست با بقیه روشها مثل ado, ef, .....
یا مقایسه بین linq to object هست با for, foreach

ebrahim.rayatparvar
پنج شنبه 21 مرداد 1395, 12:39 عصر
مهندسین عزیز مهشکل من این بود که میخوام روی DataTable دادهایی رو واکشی کنم و پاک کنم از Linq استفاده کنم یا با حلقه for سطر به سطر چک کنم که تو تاپیک بالا گفتم خودم تست کردم و تو تعداد سطر های میلیونی تو یه Datatable که هیچ وقت برام پیش نمیاد linq در هر صورت 2 ثانیه طول میکشید مثل sql چه داده اولین باشه یا داده آخرین چون از روش B-Tree استفاده میکنه همون قدر طول میکشه ولی حلقه for خیلی فرق اگه اول باشه درجا جواب میده ولی آخری خیلی طول میکشه که اینجور مشخصه لینک بهتره چون داده های من کمن در سرعت فرقی نداره که لینک باشه یا for ولی در کل linq بهتر بود

hamid_hr
پنج شنبه 21 مرداد 1395, 14:00 عصر
میشه روش تست خودتونو برام بزارین؟
همون کدهایی که برا تست این روش ها نوشتین رو میگم