私は非常に単純なテストケースを持っていますが、スケーラビリティは問題ありません。いくつかのリソースにアクセスする2つの実装を提供しています。テストケースでオーバーヘッドが発生する
テストケース:
"ResourceLoader" must
"successfully initialize resource" in {
/async code test
noException should be thrownBy Await.result(ResourceLoader.initializeRemoteResourceAsync(credentials, networkConfig), Duration.Inf)
}
"ResourceLoader" must
"successfully sync initialize remote resources" in {
noException should be thrownBy ResourceLoader.initializeRemoteResource(credentials, networkConfig)
}
これは、いくつかのリモートリソース
同期バージョン
def initializeRemoteResource(credentials: Credentials, absolutePathToNetworkConfig: String): Resource = {
//some code accessing remote server
}
非同期バージョン
にアクセスする異なるコードをテストするテスト私は将来ベースのバージョンは、同期バージョンを2回遅くなることがわかりIDEAテスト]タブでdef initializeRemoteResourceAsync(credentials: Credentials, absolutePathToNetworkConfig: String): Future[Try[Resource]] = {
Future {
//the same code as in sync version
}
}
、私の質問は、明示的にAwait.result
を呼び出すためのオーバーヘッドがありますか?そうでない場合、なぜ実行が遅くなるのでしょうか?何か助けをありがとう、ありがとう。
注:私は、本番システムのパフォーマンスを測定するのが最善の方法ではないことを知っています。しかし、それは各テストケースにどのくらいの時間を費やしたかを示しています。
もっと時間を費やしているのは、Await.result callまたはスレッドプールから未来を得ることですか?私は実際に、将来の操作のための正しいユースケースを特定する方法を疑問視しています。時間のかかる操作は、非同期に実行して、処理を高速化するためにはどうすればよいでしょうか? –
Await.resultは、未来がバックグラウンドスレッドで完了するまで、現在のスレッドをブロックします。スレッドプールからスレッドを取得するのにかかる時間は、使用しているExecutionContextの種類によって異なります。 これらは一般に超高速であり、I/Oの処理時間は1桁長くなります。 –