Выбор типа для результатов поиска в C # - PullRequest
2 голосов
/ 26 мая 2010

У меня есть набор результатов, который никогда не будет превышать 500;результаты, возвращаемые из веб-службы, присваиваются объекту результатов поиска.

Данные из веб-службы составляют около 2 МБ;бит, который я хочу использовать, составляет около трети каждой записи, так что это позволяет мне кэшировать и быстро манипулировать им.

Я хочу иметь возможность сортировать и фильтровать результаты с наименьшими затратами и какнастолько быстро, насколько возможно, поэтому я использовал временной класс VCSKICKS, чтобы измерить их производительность

              Average        Total (10,000)
Type       Create  Sort      Create  Sort
HashSet    0.1579  0.0003    1579    3
IList      0.0633  0.0002    633     2
IQueryable 0.0072  0.0432    72      432

Измеряется в секундах с использованием http://www.vcskicks.com/algorithm-performance.php

Я создал хэш-набор с помощью цикла for в сети-service-ответ (добавление в хэш-набор).

Список и IQueryable были созданы с использованием LINQ.

Вопрос Я могу понять, почему для создания HashSet требуется больше времени (foreachпетля против linq);но почему для сортировки IQueryable требуется больше времени, чем для двух других;и, наконец, есть ли лучший способ назначить HashSet.

Спасибо

Актуальная программа

public class Program
{
    private static AuthenticationHeader _authHeader;
    private static OPSoapClient _opSession;
    private static AccommodationSearchResponse _searchResults;

    private static HashSet<SearchResults> _myHash;
    private static IList<SearchResults> _myList;
    private static IQueryable<SearchResults> _myIQuery;

    static void Main(string[] args)
    {
        #region Setup WebService
        _authHeader = new AuthenticationHeader { UserName = "xx", Password = "xx" };
        _opSession = new OPSoapClient();


        #region Setup Search Results

        _searchResults = _opgSession.SearchCR(_authHeader, "ENG", "GBP", "GBR");

        #endregion Setup Search Results

        #endregion Setup WebService


        // HASHSET
        SpeedTester hashTest = new SpeedTester(TestHashSet);
        hashTest.RunTest();
        Console.WriteLine("- Hash Test \nAverage Running Time: {0}; Total Time: {1}", 
            hashTest.AverageRunningTime, 
            hashTest.TotalRunningTime);

        SpeedTester hashSortTest = new SpeedTester(TestSortingHashSet);
        hashSortTest.RunTest();
        Console.WriteLine("- Hash Sort Test \nAverage Running Time: {0}; Total Time: {1}",
            hashSortTest.AverageRunningTime,
            hashSortTest.TotalRunningTime);

        // ILIST
        SpeedTester listTest = new SpeedTester(TestList);
        listTest.RunTest();
        Console.WriteLine("- List Test \nAverage Running Time: {0}; Total Time: {1}",
            listTest.AverageRunningTime,
            listTest.TotalRunningTime);

        SpeedTester listSortTest = new SpeedTester(TestSortingList);
        listSortTest.RunTest();
        Console.WriteLine("- List Sort Test \nAverage Running Time: {0}; Total Time: {1}",
            listSortTest.AverageRunningTime,
            listSortTest.TotalRunningTime);

        // IQUERIABLE
        SpeedTester iqueryTest = new SpeedTester(TestIQueriable);
        iqueryTest.RunTest();
        Console.WriteLine("- iquery Test \nAverage Running Time: {0}; Total Time: {1}",
            iqueryTest.AverageRunningTime,
            iqueryTest.TotalRunningTime);

        SpeedTester iquerySortTest = new SpeedTester(TestSortableIQueriable);
        iquerySortTest.RunTest();
        Console.WriteLine("- iquery Sort Test \nAverage Running Time: {0}; Total Time: {1}",
            iquerySortTest.AverageRunningTime,
            iquerySortTest.TotalRunningTime);
    }

    static void TestHashSet()
    {
        var test = _searchResults.Items;

        _myHash = new HashSet<SearchResults>();

        foreach(var x in test)
        {
            _myHash.Add(new SearchResults
                                     {
                                         Ref = x.Ref,
                                         Price = x.StandardPrice
                                     });
        }

    }

    static void TestSortingHashSet()
    {
        var sorted = _myHash.OrderBy(s => s.Price);
    }



    static void TestList()
    {
        var test = _searchResults.Items;

        _myList = (from x in test
                   select new SearchResults
                              {
                                  Ref = x.Ref,
                                  Price = x.StandardPrice
                              }).ToList();
    }

    static void TestSortingList()
    {
        var sorted = _myList.OrderBy(s => s.Price);
    }

    static void TestIQueriable()
    {
        var test = _searchResults.Items;

        _myIQuery = (from x in test
                     select new SearchResults
                                {
                                    Ref = x.Ref,
                                    Price = x.StandardPrice
                                }).AsQueryable();

    }

    static void TestSortableIQueriable()
    {
        var sorted = _myIQuery.OrderBy(s => s.Price);
    }

}

=== Прямой вывод из консоли ===

- Hash Test
Average Running Time: 0.154; Total Time: 1540
- Hash Sort Test
Average Running Time: 0.0003; Total Time: 3
- List Test
Average Running Time: 0.0601; Total Time: 601
- List Sort Test
Average Running Time: 0.0002; Total Time: 2
- iquery Test
Average Running Time: 0.0003; Total Time: 3
- iquery Sort Test
Average Running Time: 0.0399; Total Time: 399
- IEnum Test
Average Running Time: 0.0002; Total Time: 2
- IEnum Sort Test
Average Running Time: 0.0001; Total Time: 1
Press any key to continue . . .

Очевидно, что времена меняются в зависимости от того, что делал мой компьютер в то время, как правило, вы можете сделать какое-то суждение, исходя из размера разницы, но, поскольку «ответ» заявляет, что несправедливо судить о IQueryableтак же.

1 Ответ

2 голосов
/ 26 мая 2010

Я думаю, IQueryable откладывал создание до тех пор, пока не была выполнена сортировка, где IList выполнил создание заранее, а затем выполнил сортировку на нем.

Так же, как и IList, создание HashSet не было отложено и, следовательно, большие первоначальные затраты.

Итак, сначала нужно создать HashSet и IList, что требует времени, которое вы записываете. Затем вы записываете сортировку по ним, которая, вероятно, незначительна. IQueryable отложил время создания до тех пор, пока вы не выполнили сортировку, поэтому создание и сортировка выполняются во время сортировки. Сортировка для IQueryable на самом деле не заняла больше времени, она выглядит просто так, потому что создание происходит одновременно с вашим тестированием. Я подозреваю, что разница во времени всех трех сортов незначительна.

Я думаю, что в любом случае можно использовать любой из них в зависимости от того, как вы хотите, чтобы вывод использовался или расширялся в случае IQueryable.

...