完全性を実現するためにコードを最適化
4477 ワード
「照会が遅い」をより具体的な言い方に変えると、問題を解決することもある.
会社のコードを書くとき、よくデータベースに行くコードは少し憂鬱です.何も考えずに隣の先輩に「調べが遅いようです」と言ったら、先輩がそれをもっと具体的な表現に変えてくれました.
問題を定義することが問題解決の鍵である場合がある.問題が発生したコードは,8回のデータベースクエリを経て,前から1つずつ要求されているため,ネットワークIOを待つのに多くの時間を浪費している.
この時は時間を測って、解決策を適用して、それから時間を測って、もう一度比較したほうがいいです.
この問題は、1回目のクエリの結果を用いて2~8回目のクエリを行うため、1回目のクエリを保持し、2~8回目のクエリを並列に送信することが望ましいと思います.
Cottlinのcoutineでの最適化を考えると,async awaitよりも完全なFutureの方がよいと考え,完全なFutureを用いた.
dbがキャッシュヒットしていない場合、平均パフォーマンスは2375ミリ秒から1448ミリ秒に向上し、約40%向上します.
db端でcacheヒットが発生した場合,平均956 msから285 msに向上し,性能は約70%向上した.
質問する
会社のコードを書くとき、よくデータベースに行くコードは少し憂鬱です.何も考えずに隣の先輩に「調べが遅いようです」と言ったら、先輩がそれをもっと具体的な表現に変えてくれました.
問題を定義することが問題解決の鍵である場合がある.問題が発生したコードは,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%向上した.
Reference
この問題について(完全性を実現するためにコードを最適化), 我々は、より多くの情報をここで見つけました https://velog.io/@gyunghoe/CompletableFuture로-데이터베이스-코드-최적화하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol