Замеры времени исполнения методов - C#
Формулировка задачи:
Есть задача.
Написать методы поиска элементов в массиве (например, поиск всех положительных элементов) в
виде:
1. метода, непосредственно реализующего поиск;
2. метода, которому условие поиска передаётся через экземпляр делегата;
3. метода, которому условие поиска передаётся через делегат в виде анонимного метода;
4. метода, которому условие поиска передаётся через делегат в виде лямбда-выражения;
5. LINQ-выражения
Сравнить скорость выполнения вычислений.
Примечания:
1. Не забывайте, что LINQ-выражения выполняются в отложенном режиме, так что если вы
вдруг получили 0, не удивляйтесь: вы не то измеряете.
2. Для выполнения временных замеров стоит использовать класс Stopwatch.
3. Выберите размер поискового массива с запасом. Лучше поставить размер не менее
нескольких сотен элементов.
4. Выполните каждое измерение в цикле не менее нескольких десятков раз. Определите
медиану измерений (значение, расположенное посередине, если результаты измерений
отсортировать по возрастанию или убыванию).
Подскажите пожалуйста как решать.
Решение задачи: «Замеры времени исполнения методов»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace Delegates { class Program { static int[] array; delegate bool Comparison(int number); static void Main(string[] args) { Init(500000); Stopwatch sw = new Stopwatch(); List<int> result = new List<int>(); List<long> timing = new List<long>(); for(int i = 0; i < 100; i++) { sw.Reset(); sw.Start(); // 1. Метод, непосредственно реализующий поиск result = FindPositive(); timing.Add(sw.ElapsedMilliseconds); } Console.WriteLine("Method 1 average: {0} msec", timing.Average()); timing.Clear(); for (int i = 0; i < 100; i++) { sw.Reset(); sw.Start(); // 2. Через экземпляр делегата Comparison comp = new Comparison(IsPositive); result = Find(comp); timing.Add(sw.ElapsedMilliseconds); } Console.WriteLine("Method 2 average: {0} msec", timing.Average()); timing.Clear(); for (int i = 0; i < 100; i++) { sw.Reset(); sw.Start(); Comparison comp = new Comparison(IsPositive); // 3. Через анонимный метод result = Find(delegate (int number) { return number > 0; }); timing.Add(sw.ElapsedMilliseconds); } Console.WriteLine("Method 3 average: {0} msec", timing.Average()); timing.Clear(); for (int i = 0; i < 100; i++) { sw.Reset(); sw.Start(); Comparison comp = new Comparison(IsPositive); // 4. Через лямбду result = Find(number => number > 0); timing.Add(sw.ElapsedMilliseconds); } Console.WriteLine("Method 4 average: {0} msec", timing.Average()); timing.Clear(); for (int i = 0; i < 100; i++) { sw.Reset(); sw.Start(); Comparison comp = new Comparison(IsPositive); // 5. Через LINQ result = (from number in array where number > 0 select number).ToList(); timing.Add(sw.ElapsedMilliseconds); } Console.WriteLine("Method 5 average: {0} msec", timing.Average()); Console.ReadKey(); } static void Init(int size) { array = new int[size]; Random rnd = new Random(); for(int i = 0; i < size; i++) { array[i] = rnd.Next(-10, 10); } } static List<int> FindPositive() { List<int> result = new List<int>(); foreach(int elem in array) { if (elem > 0) result.Add(elem); } return result; } static List<int> Find(Comparison comp) { List<int> result = new List<int>(); foreach (int elem in array) { if (comp(elem)) result.Add(elem); } return result; } static bool IsPositive(int number) { return number > 0; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д