החלטתי להתחיל בטיפ מאוד שימושי:
כאשר יש לנו מערך, רשימה או כל אובייקט שניתן לבצע עליו foreach (אובייקטים שמממשים את IEnumerable),
ניתן לשפר את הביצועים של מעבר על הרשימה על ידי שימוש בכל הCores של המחשב.
בשביל זה אנחנו נשתמש ב TPL – Task Parallel Library , שזאת בעצם ספריה שאחראית על taskים מקבילים.
מה קורה בעצם?
הפעולה מייצרת task לכל אלמנט ברשימה.
למשל, יש לנו 10000000 מספרים במערך, לכן מה שיקרה זה שייווצרו 10000000taskים, שירוצו במקביל תלוי מי הcore הפנוי.
הtaskים יכולים לרוץ בthreadים שונים או באותו thread (לא מחייב שיהיה thread ייעודי כל פעם).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Diagnostics; namespace ForEach { class Program { static void Main(string[] args) { int length = 100000000; List<int> list = new List<int>(); for (int i = 1; i <= length; i++) { list.Add(i); } Stopwatch watch = new Stopwatch(); watch.Start(); int counterBoom7 = 0; foreach (int item in list) { if (item % 7 == 0) { counterBoom7++; } else { if (item.ToString().Contains('7')) { counterBoom7++; } } } watch.Stop(); Console.WriteLine("Time: " + watch.ElapsedMilliseconds); Console.WriteLine("counterBoom7: " + counterBoom7); int counterBoom7Parallel = 0; watch.Restart(); Parallel.ForEach(list, item => { if (item % 7 == 0) { Interlocked.Increment(ref counterBoom7Parallel); } else { if (item.ToString().Contains('7')) { Interlocked.Increment(ref counterBoom7Parallel); } } } //close lambda expression ); //close method invocation watch.Stop(); Console.WriteLine("Time: " + watch.ElapsedMilliseconds); Console.WriteLine("counterBoom7Parallel: " + counterBoom7Parallel); Console.ReadKey(); } } } |
בקוד לדוגמא, אנחנו משחקים משחק 7 בום
החוקים פשוטים:
א. המספר מתחלק ב- 7 ללא שארית
ב. מספר מכיל ספרה 7
בנוסף, הוספתי טיימרים כדי לתזמן את המעבר על הרשימה הרגילה והרשימה המקבילה.
אחרי שמריצים את הקוד, רואים שמעבר על רשימה בצורה מקבילה מהיר פי 3 מרשימה רגילה.
התוצאות של ההרצה תלויות חומרה וכמות הcores
נא לשים לב, שהשימוש בזה יהיה רק כאשר אין חשיבות לסדר!!!
מקווה שהטיפ יהיה שימושי,
אם יש שאלות, תשאירו פה שאלות
או תכתבו למייל
ואני אשמח לענות