完全性を実現するためにコードを最適化

4477 ワード

「照会が遅い」をより具体的な言い方に変えると、問題を解決することもある.

質問する


会社のコードを書くとき、よくデータベースに行くコードは少し憂鬱です.何も考えずに隣の先輩に「調べが遅いようです」と言ったら、先輩がそれをもっと具体的な表現に変えてくれました.
問題を定義することが問題解決の鍵である場合がある.問題が発生したコードは,8回のデータベースクエリを経て,前から1つずつ要求されているため,ネットワークIOを待つのに多くの時間を浪費している.
この時は時間を測って、解決策を適用して、それから時間を測って、もう一度比較したほうがいいです.

前のコード時間測定の最適化


dbにキャッシュがない場合

1st
db query costed 310 ms
db query costed 122 ms
db query costed 87 ms
db query costed 106 ms
db query costed 194 ms
db query costed 411 ms
db query costed 139 ms
db query costed 47 ms
=> 1,416 ms

2nd
db query costed 292 ms
db query costed 184 ms
db query costed 135 ms
db query costed 155 ms
db query costed 223 ms
db query costed 445 ms
db query costed 142 ms
db query costed 42 ms
=> 1,618 ms

3rd
db query costed 389 ms
db query costed 160 ms
db query costed 108 ms
db query costed 161 ms
db query costed 267 ms
db query costed 557 ms
db query costed 2399 ms
db query costed 51 ms
=> 4,092 ms
平均稼働時間=2375ミリ秒

dbエンドキャッシュ時

1st
db query costed 138 ms
db query costed 448 ms
db query costed 100 ms
db query costed 165 ms
db query costed 162 ms
db query costed 36 ms
db query costed 142 ms
db query costed 44 ms
=> 1,235 ms

2nd
db query costed 119 ms
db query costed 161 ms
db query costed 117 ms
db query costed 169 ms
db query costed 162 ms
db query costed 45 ms
db query costed 133 ms
db query costed 45 ms
=> 951 ms

3rd
db query costed 105 ms
db query costed 155 ms
db query costed 102 ms
db query costed 182 ms
db query costed 150 ms
db query costed 30 ms
db query costed 138 ms
db query costed 33 ms
=> 895 ms

4th
db query costed 96 ms
db query costed 111 ms
db query costed 105 ms
db query costed 168 ms
db query costed 162 ms
db query costed 55 ms
db query costed 107 ms
db query costed 28 ms
=> 832 ms

5th
db query costed 111 ms
db query costed 138 ms
db query costed 100 ms
db query costed 149 ms
db query costed 122 ms
db query costed 30 ms
db query costed 156 ms
db query costed 64 ms
=> 870 ms
平均実行時間=956ミリ秒

解決策



この問題は、1回目のクエリの結果を用いて2~8回目のクエリを行うため、1回目のクエリを保持し、2~8回目のクエリを並列に送信することが望ましいと思います.
Cottlinのcoutineでの最適化を考えると,async awaitよりも完全なFutureの方がよいと考え,完全なFutureを用いた.
val 변수 = 쿼리?: 에러 던짐

lateinit var 변수: 타입
val 변수future = CompletableFuture.supplyAsync {
	adUnit = 쿼리?: 에러 던짐
}

...변수& 변수future선언 반복

val combinedFuture = CompletableFuture.allOf(모든 퓨쳐)
combinedFuture.get()

return 결과

最適化後のコード時間の測定


dbにキャッシュがない場合

1st
db query costed 337 ms
병렬 query costed 2263 ms
=> 2,600 ms

2nd
db query costed 443 ms
병렬 query costed 422 ms
=> 865 ms

3rd
db query costed 365 ms
병렬 query costed 515 ms
=> 880 ms
平均実行時間=1448ミリ秒

dbエンドキャッシュ時

1st
db query costed 119 ms
병렬 query costed 199 ms
=> 318 ms

2nd
db query costed 94 ms
병렬 query costed 183 ms
=> 277 ms

3rd
db query costed 101 ms
병렬 query costed 181 ms
=> 282 ms

4th
db query costed 100 ms
병렬 query costed 179 ms
=> 279 ms

5th
db query costed 101 ms
병렬 query costed 172 ms
=> 273 ms
平均稼働時間=285 ms

整理する


dbがキャッシュヒットしていない場合、平均パフォーマンスは2375ミリ秒から1448ミリ秒に向上し、約40%向上します.
db端でcacheヒットが発生した場合,平均956 msから285 msに向上し,性能は約70%向上した.