2016-10-11 1 views
0

私は非常に単純なテストケースを持っていますが、スケーラビリティは問題ありません。いくつかのリソースにアクセスする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を呼び出すためのオーバーヘッドがありますか?そうでない場合、なぜ実行が遅くなるのでしょうか?何か助けをありがとう、ありがとう。

注:私は、本番システムのパフォーマンスを測定するのが最善の方法ではないことを知っています。しかし、それは各テストケースにどのくらいの時間を費やしたかを示しています。

答えて

2

はい、少しのオーバーヘッドがAwait.resultになりますが、実際にはそれほど多くはありません。 Future {}はExecutionContext(スレッドプールまたはスレッド作成者)を暗黙のスコープで必要とするため、デフォルトの実行コンテキスト(単にスレッドを生成する)やその他のコンテキストをインポートせずに正常に使用することはできません。たとえば、デフォルトの実行コンテキストを使用している場合、コンテキスト切り替えのためのオーバーヘッドを伴うスレッドではなく、2つのスレッドがあります。それはあまりないはずです。 「2倍遅い」とは、20秒ではなく40ミリ秒を意味する場合、恐らくそれは心配する価値がありません。

+0

もっと時間を費やしているのは、Await.result callまたはスレッドプールから未来を得ることですか?私は実際に、将来の操作のための正しいユースケースを特定する方法を疑問視しています。時間のかかる操作は、非同期に実行して、処理を高速化するためにはどうすればよいでしょうか? –

+0

Await.resultは、未来がバックグラウンドスレッドで完了するまで、現在のスレッドをブロックします。スレッドプールからスレッドを取得するのにかかる時間は、使用しているExecutionContextの種類によって異なります。 これらは一般に超高速であり、I/Oの処理時間は1桁長くなります。 –

関連する問題