我有以下方法:
/// <summary>
/// Calculates the last trade date.
/// </summary>
/// <param name="tradesDictionary">The trades dictionary.</param>
/// <returns>The last trade date.</returns>
public DateTime CalculateLastTradeDate(ConcurrentDictionary<Guid, TradeRecord> tradesDictionary)
{
// Calculate the last trade date
_lastTradeDate = (from tradeRecord in tradesDictionary
where (tradeRecord.Value.OrderRecord.PairRecord.Id == _pairId)
select tradeRecord.Value.Date)
.Max();
// Return _lastTradeDate
return _lastTradeDate;
}
需要+ - 129秒,即 + - 2分钟才能在内存中 21353 对象的ConcurrentDictionary上执行。在上述方法实现的查询中,我能做些什么,大大减少它的执行时间?
任何帮助将不胜感激!
答案 0 :(得分:1)
嗯,首先要注意的是,你 并非真正在ConcurrentDictionary
上执行大部分查询或与之相关的任何事情。您是在列表中的值副本上进行的。
我的第一个停靠点是找出时间进展的地方 - 从查询的其余部分中分离出tradesDictionary.Values.ToList()
来电。虽然4分钟听起来像方式。一旦你找出导致问题的部分,我会考虑使用非并行查询,仅用于比较目的。
除此之外,它实际上取决于记录的各种属性在做什么。他们是在访问数据库还是那样的?您的计算机在这四分钟内是否处于空闲状态,或者它是否正在全速运行?
确实让我觉得你并不需要订购整套装置 - 你只需要找到最小值。但是,这应该只考虑从O(n log n)到O(n)的复杂性,并且在“正常”LINQ到对象或并行LINQ中做起来相对困难。
答案 1 :(得分:1)
TradeRecord.OrderRecord.PairRecord
看起来涉及三个级别的数据库记录。您是否100%确定所有记录都在内存中?您是通过设置datacontext的log属性还是通过检查sql profiler来检查的?
答案 2 :(得分:0)
从这里的信息可以看出,通过查询数据库可以更有效地达到最大交易日期。
SELECT MAX(TradeRecordTable.Date) AS MaxTradeDate
FROM <appropriate table join>
WHERE PairRecordTable.Id = _pairId
如果PairRecordTable中匹配行的数量不大,则应该非常快速地运行。我发现有很多原因可能不适合你。但我也经常看到这个简单的解决方案被忽视了。