[안드로이드] 심심해서 찍어본 Retrofit 동기 / 비동기 Feat.Rx
오늘은 그냥 제가 심심해서 동기와 비동기의 시간차이 측정을 해봤습니다.
별 내용은 없습니다 만, 관찰 결과를 포스팅 합니다.
실험 주제: Retrofit 동기 / 비동기 콜에 대한 시간 차이 측정
1. 단순 mainThread에서 비동기 Retrofit call
2. Rx에서 비동기 Retrofit call
3. Rx에서 동기 Retrofit call
결과는 아래와 같습니다.
1. 단순 mainThread에서 비동기 Retrofit call
fun asyncApiTestCall() {
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
var nickName = "${Random.nextInt()}"
var pwd = "1234"
var call = apiClss.registUserApi(nickName, pwd)
var start = System.currentTimeMillis()
var callBack = object : Callback<ResultObject> {
override fun onFailure(call: Call<ResultObject>, t: Throwable) {
// Log.e("innerRxAsyncApiTestCall", "onFailure")
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
}
override fun onResponse(
call: Call<ResultObject>,
response: Response<ResultObject>
) {
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
var end = System.currentTimeMillis()
calcTimeDiff(start,end)
// Log.e("innerRxAsyncApiTestCall", "onResponse")
}
}
call.enqueue(callBack)
}
1회차
2020-04-22 20:38:53.693 31375-31375/com.example.rxretrofit2 E/asyncApiTestCall: main / 1587555533693
2020-04-22 20:38:53.844 31375-31375/com.example.rxretrofit2 E/onResponse: main / 1587555533844
2020-04-22 20:38:53.844 31375-31375/com.example.rxretrofit2 E/시간차: 150초
2회차
2020-04-22 20:39:00.633 31375-31375/com.example.rxretrofit2 E/asyncApiTestCall: main / 1587555540633
2020-04-22 20:39:00.782 31375-31375/com.example.rxretrofit2 E/onResponse: main / 1587555540782
2020-04-22 20:39:00.782 31375-31375/com.example.rxretrofit2 E/시간차: 149초
2. Rx에서 비동기 Retrofit call
fun innerRxAsyncApiTestCall() {
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
var start = System.currentTimeMillis()
compositeDisposable.add(
Completable.fromAction {
var nickName = "${Random.nextInt()}"
var pwd = "1234"
var call = apiClss.registUserApi(nickName, pwd)
var callBack = object : Callback<ResultObject> {
override fun onFailure(call: Call<ResultObject>, t: Throwable) {
// Log.e("innerRxAsyncApiTestCall", "onFailure")
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
}
override fun onResponse(
call: Call<ResultObject>,
response: Response<ResultObject>
) {
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
var end = System.currentTimeMillis()
calcTimeDiff(start,end)
// Log.e("innerRxAsyncApiTestCall", "onResponse")
}
}
call.enqueue(callBack)
}
.subscribeOn(Schedulers.io())
.subscribe({
getCurrentThreadName("subscribe/"+Thread.currentThread().stackTrace[2].methodName)
}, {
})
)
}
2회차
2020-04-22 20:39:02.014 31375-31375/com.example.rxretrofit2 E/innerRxAsyncApiTestCall: main / 1587555542014
2020-04-22 20:39:02.015 31375-31449/com.example.rxretrofit2 E/subscribe/run: RxCachedThreadScheduler-1 / 1587555542015
2020-04-22 20:39:02.159 31375-31375/com.example.rxretrofit2 E/onResponse: main / 1587555542159
2020-04-22 20:39:02.160 31375-31375/com.example.rxretrofit2 E/시간차: 146초
3. Rx에서 동기 Retrofit call
fun innerSyncApiTestCall() {
getCurrentThreadName(Thread.currentThread().stackTrace[2].methodName)
var start = System.currentTimeMillis()
compositeDisposable.add(
Completable.fromAction {
var nickName = "${Random.nextInt()}"
var pwd = "1234"
var call = apiClss.registUserApi(nickName, pwd)
var response = call.execute().body()
//Log.e("innerSyncApiTestCall", response.toString())
getCurrentThreadName("fromAction/"+Thread.currentThread().stackTrace[2].methodName)
var end = System.currentTimeMillis()
calcTimeDiff(start,end)
}
.subscribeOn(Schedulers.io())
.subscribe({
getCurrentThreadName("subscribe/"+Thread.currentThread().stackTrace[2].methodName)
}, {
})
)
}
1회차
2020-04-22 20:38:55.598 31375-31375/com.example.rxretrofit2 E/innerSyncApiTestCall: main / 1587555535598
2020-04-22 20:38:55.740 31375-31449/com.example.rxretrofit2 E/fromAction/run: RxCachedThreadScheduler-1 / 1587555535740
2020-04-22 20:38:55.741 31375-31449/com.example.rxretrofit2 E/시간차: 143초
2회차
2020-04-22 20:39:03.042 31375-31375/com.example.rxretrofit2 E/innerSyncApiTestCall: main / 1587555543042
2020-04-22 20:39:03.187 31375-31449/com.example.rxretrofit2 E/fromAction/run: RxCachedThreadScheduler-1 / 1587555543187
2020-04-22 20:39:03.187 31375-31449/com.example.rxretrofit2 E/시간차: 145초
2020-04-22 20:39:03.187 31375-31449/com.example.rxretrofit2 E/subscribe/run: RxCachedThreadScheduler-1 / 1587555543187
보시면 아시겠지만
크게 유의미한 차이는 없습니다. 물론 아주 간단한 API에 대한 테스트였기에 정확도를 논할 수 있을까? 싶기도 하지만
기본적으로 동기와 비동기의 차이라고 해 봤자, API가 응답하는 시간의 차이이기 때문에
같은 네트워크 / 같은 서버의 성능으로 봤을때 아아아아아주 미미한 랜덤한 차이가 발생합니다.
취향에 맞게 사용하시면 될 것 같습니다.
(그래도 Rx 동기가 제일 빠르기는 하네요 ..)
위의 결과는 MiliSeconds의 차이이며 "초"라고 하였지만, 초는 무시해주시면 됩니다.
로깅을 위한 펑션
fun getCurrentThreadName(tag: String?) {
var name = Thread.currentThread().name
Log.e(tag, "${name} / ${System.currentTimeMillis()}")
}
fun calcTimeDiff(start:Long, end:Long){
var diff = end -start
val diffSeconds: Long = diff / 1000 % 60
Log.e("시간차","${diff}초")
}
https://open.kakao.com/o/gn4xqQ6open.kakao.com/o/gH0XvThcopen.kakao.com/o/gH0XvThc