提问人:TeaDrivenDev 提问时间:5/7/2015 更新时间:5/7/2015 访问量:1141
(错误)理解 Seq.cache
(Mis)understanding Seq.cache
问:
我有以下代码(在一个更大的函数中,但这并不重要):
let ordersForTask = Dictionary<_, _>()
let getOrdersForTask task =
match ordersForTask.TryGetValue task with
| true, orders -> orders
| false, _ ->
let orders =
scenario.Orders
|> Seq.filter (fun (order : Order) -> order.Tasks.Contains(task))
|> Seq.cache
ordersForTask.Add(task, orders)
orders
据我了解,这应该导致对每对 and 值只调用一次,无论使用相同值调用的频率如何,因为输入序列只迭代(最多)一次。然而,情况似乎并非如此。如果我为我拥有的所有值调用函数时间,则分析显示对 的调用。order.Tasks.Contains()
order
task
getOrdersForTask
task
n
task
n * number of orders * number of tasks
Contains()
替换为具有我预期的效果,但我想避免产生 的成本。Seq.cache
Seq.toList
Seq.toList
我在使用它时误解了什么或做错了什么?Seq.cache
答: 暂无答案
评论
task
属于在上游 C# 代码中某处定义的普通 CLR 类。Task = int
orders = int seq
n -> n % 5 == 0