Choosing a type for search results in C#
- by Chris M
I have a result set that will never exceed 500; the results that come back from the web-service are assigned to a search results object.
The data from the webservice is about 2mb; the bit I want to use is about a third of each record, so this allows me to cache and quickly manipulate it.
I want to be able to sort and filter the results with the least amount of overhead and as fast as possible so I used the VCSKICKS timing class to measure their performance
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
Measured in Seconds using http://www.vcskicks.com/algorithm-performance.php
I created the hashset through a for loop over the web-service response (adding to the hashset).
The List & IQueryable were created using LINQ.
Question
I can understand why HashSet takes longer to create (the foreach loop vs linq); but why would IQueryable take longer to sort than the other two; and finally is there a better way to assign the HashSet.
Thanks
Actual Program
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);
}
}