0

私はF# の最適化に関するこの記事を調べていて、言及している行に興味がありましたTasks.Future.Create。将来的にタスクを作成するようで、Futures and Promisesパターンに従っているようです。同じメソッドは、F#、Java、C# のベンチマークに関するこのスレッドのように、F# コードでも使用されている他の場所でも言及されています。

リンクが切れた場合の参照用にここにコピーされた前述のF#コードは、のようなものとまったく同じように機能するTasks.Task<T>のでしょうか、それとも別のスレッドプリミティブを使用する必要がありますか?

open System.Threading

let inline sort cmp (a: _ array) =
  let inline swap i j =
    let t = a.[i]
    a.[i] <- a.[j]
    a.[j] <- t
  let rec qsort l u =
    if l < u then
      swap l ((l + u) / 2)
      let mutable m = l
      for i=l+1 to u do
        if cmp a.[i] a.[l] < 0 then
          m <- m + 1
          swap m i
      swap l m
      if u-l > 1000 then
        let m = m
        let f = Tasks.Future.Create(fun () -> qsort l (m-1))
        qsort (m+1) u
        f.Value
      else
        qsort l (m-1)
        qsort (m+1) u
  qsort 0 (a.Length-1)

let inline cmp (str: _ array) i j =
  let rec cmp i j =
    if i=str.Length then 1 else
      if j=str.Length then -1 else
        let c = compare str.[i] str.[j] in
        if c<>0 then c else
          cmp (i+1) (j+1)
  cmp i j

let bwt (str: byte array) =
  let n = str.Length
  let a = Array.init n (fun i -> i)
  sort (fun i j -> cmp str i j) a
  Array.init n (fun i -> str.[(a.[i] + n - 1) % n])

注: これは、TPL のプレビュー版のメソッドだったと思います。

4

1 に答える 1

3

あなたが正しい。タスク並列ライブラリの設計に関する論文にさかのぼります。論文の関連部分を引用:

Future はタスクのバリエーションであり、関連付けられたアクションが結果を計算します。

delegate T Func<T>();
class Future<T> : Task{
  Future (Func<T> function);
  T Value{ get; } // does an implicit wait
}

Future は、T がデリゲートの戻り値の型である Func 型を持つデリゲートで構築されます。将来の結果は、タスクが完了し、結果の値が計算されたことを確認するために内部で Wait を呼び出す Value プロパティを介して取得されます。Wait が呼び出されるため、Value を呼び出すと、将来の値の計算中に発生した例外がスローされます。先物は、結果の値または例外的な値のいずれかを返すものと見なすことができます。

TPL では、 Taskクラスを使用してすべてを実行できるようになりました。@ダニエルが言ったように、あなたの例は次のように書くことができます:

let f = Task.Factory.StartNew(fun () -> qsort l (m-1))
qsort (m+1) u
f.Result

複雑な依存関係を持つタスク グラフがある場合は、future パターンがさらに役立つと思います。パターンの詳細については、優れた本Parallel Programming with Microsoft .NET (多くの優れたF# サンプルが含まれています) を参照してください。

于 2013-01-07T20:12:40.197 に答える