我的结果集永远不会超过500;从Web服务返回的结果将分配给搜索结果对象。
来自网络服务的数据大约是2mb;我想要使用的位大约是每条记录的三分之一,所以这允许我缓存并快速操作它。
我希望能够以最少的开销对结果进行排序和过滤,并且尽可能快,因此我使用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
以秒为单位测量我通过Web服务响应的for循环创建了hashset(添加到hashset)。
The List& IQueryable是使用LINQ创建的。
问题 我可以理解为什么HashSet需要更长的时间来创建(foreach循环vs 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是不公平的。
答案 0 :(得分:2)
我认为IQueryable
推迟了创建,直到执行排序IList
预先创建,然后对其进行排序。
与IList
一样,HashSet
创作并未延期,因此前期费用较高。
因此,必须创建HashSet
和IList
,这需要您记录的时间。然后你记录它们的排序,这可能是微不足道的。 IQueryable
延迟创建时间UNTIL你进行了排序,因此创建和排序都在排序时发生。对于IQueryable
来说它的排序并不需要更长的时间,因为创建是在测试中同时进行的。我怀疑所有3种时间差异都可以忽略不计。
我认为无论哪种方式都可以使用它们,具体取决于您在IQueryable
的情况下如何使用或扩展输出。