#c# #hashset
Вопрос:
Время прохождения теста хэш-набора:5.38
Время выполнения теста Linq:0,64
Время выполнения теста для каждого цикла ime:0,32
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace _08_ArrayCheck
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
var a = Enumerable.Range('a','z'-'a' 1).Select(c=>(char)c).ToArray();
double sTime = 0;
double fTime = 0;
sTime = sw.Elapsed.TotalMilliseconds;
Hashset(a,'a');
fTime = sw.Elapsed.TotalMilliseconds;
Console.WriteLine("Hashset test Elapsed time:" string.Format("{0:0.##}",(fTime-sTime)));
sTime = sw.Elapsed.TotalMilliseconds;
Linq(a,'a');
fTime = sw.Elapsed.TotalMilliseconds;
Console.WriteLine("Linq test Elapsed ime:" string.Format("{0:0.##}",(fTime-sTime)));
sTime = sw.Elapsed.TotalMilliseconds;
Foreachloop(a,'a');
fTime = sw.Elapsed.TotalMilliseconds;
Console.WriteLine("Foreach loop test Elapsed ime:" string.Format("{0:0.##}",(fTime-sTime)));
sw.Stop();
}
public static bool Hashset(char[] a, char x)
// isn't hashset supposed to be'faster code performance wise
{
HashSet<char> hashSearch = new HashSet<char>(a);
return hashSearch.Contains(x);
}
public static bool Linq(char[] a, char x)//linq solution
{
return a.Contains(x);
}
public static bool Foreachloop(char[] a, char x)//foreach loop
{
foreach(char s in a)
{
if(s==x) return true;
}
return false;
}
}
}
пожалуйста, помогите мне понять, что я не мог понять. мой учитель кодирования сказал нам, что хэш-набор должен быть быстрее.
но в моем тестовом коде выше доказано, что это не так
или что — то не так с тем, как я это делаю?
Комментарии:
1. Поставьте
HashSet<char> hashSearch = new HashSet<char>(a);
вне теста. Поиск хэша выполняется быстрее, чем поиск массива, но создание хэша займет дополнительное время.2. Кроме того, при измерении производительности таких быстрых операций повторите несколько раз и вычислите среднее время, скажем, повторите операцию 1 миллион раз и измерьте время этого миллиона, а затем разделите затраченное время. Измерение таких коротких интервалов времени имеет большую неточность из-за разрешения таймера и помех от работы системы.
3. да, я понял, спасибо…
Ответ №1:
Вы измеряете время для создания хэш-набора и поиска в нем. Попробуйте измерить только время поиска.
Кроме того, вы ищете «a», который является первым элементом вашего диапазона, линейный поиск будет успешным после тестирования только первого элемента и вернет успех.