C# почему хэш-набор медленный в моем тесте. Пожалуйста, помогите мне понять

#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», который является первым элементом вашего диапазона, линейный поиск будет успешным после тестирования только первого элемента и вернет успех.