Замеры времени исполнения методов - 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;
}
}
}