Không chắc chắn liệu tôi có quyền này hay không hoặc liệu có cách nào hay hơn hoặc thư viện hiện có đang giải quyết vấn đề này.Thời gian để ghi nhớ trực tiếp trong F #
Đặc biệt, tôi không chắc liệu CAS có cần hàng rào bộ nhớ hay không ... Tôi nghĩ là không tốt hơn.
Tôi cũng đã thử với một tác nhân và từ điển có thể thay đổi nhưng trực giác của tôi rằng nó sẽ chậm hơn được xác nhận và việc triển khai có liên quan nhiều hơn.
module CAS =
open System.Threading
let create (value: 'T) =
let cell = ref value
let get() = !cell
let rec swap f =
let before = get()
let newValue = f before
match Interlocked.CompareExchange<'T>(cell, newValue, before) with
| result when obj.ReferenceEquals(before, result) ->
newValue
| _ ->
swap f
get, swap
module Memoization =
let timeToLive milis f =
let get, swap = CAS.create Map.empty
let evict key =
async {
do! Async.Sleep milis
swap (Map.remove key) |> ignore
} |> Async.Start
fun key ->
let data = get()
match data.TryFind key with
| Some v -> v
| None ->
let v = f key
swap (Map.add key v) |> ignore
evict key
v
Bạn đã thử nghiệm chưa? Nó có hoạt động không? – Daniel
Dường như hoạt động rất tốt. –
Điều đó có vẻ ổn với tôi. Tôi không nghĩ rằng bạn cần một rào cản bộ nhớ với 'CompareExchange'. Nitpick: phải là 'millis'. Bạn có thể so sánh sự hoàn hảo của 'ConcurrentDictionary'. – Daniel