5

私は、scalaz Futures がどのように機能するかを完全には理解していないと思います。あるプロジェクトをscala futuresからscalazの実装に移植しようとしているのですが、問題はscalaz Futureの方がパフォーマンスが低いことです。最も単純な例は、Spray を使用した認証要求でプロファイルをロードすることです。

関数自体:

def loadProfile[A: CollectionProvider: JsonFormat](id: String) = future {
  remote.findOne[A]("id" :> id) match {
    case Some(profile) ⇒ \/-(profile)
    case None          ⇒ -\/(ProfileNotFoundRejection(id))
  }
}

scalaz のバージョンは 1 つのシンボルだけが異なりFuture.applyますscalaz.concurrent。そして今、いくつかのhtmlページをロードするSprayルート:

get {
  path("profile" / "id" ~ Segment) { id ⇒
    onSuccess(loadProfile[User](id)) {
      case \/-(profile) ⇒ complete(html.page(profile))
      case -\/(pnfr)    ⇒ reject(pnfr)
    }
  }
}

と同様にloadProfile、scalaz のバージョンはメソッド呼び出しのみが異なります。

get {
  path("profile" / "id" ~ Segment) { id ⇒
    ctx => loadProfile[User](id).runAsync {
      case \/-(profile) ⇒ ctx.complete(html.page(profile))
      case -\/(pnfr)    ⇒ ctx.reject(pnfr)
    }
  }
}

しかし、scala Future バージョンのリクエストは (約) 143msで完了しますが、scalaz バージョンは260msで完了します。だから私はこの特定の要求についてはあまり心配していませんが、非同期実行と一般的なサービスのスケーラビリティについては、scalaz Future で理解しているように、実行を別のスレッドに手動でフォークする必要があるため、順次実行されますか? scalaz Future の使用法についての良いイントロ/チュートリアルはありますか?

4

1 に答える 1