Замеры времени исполнения методов - 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;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д