땀이 삐질삐질 나는 개발 일기

[안드로이드] 심심해서 찍어본 Retrofit 동기 / 비동기 Feat.Rx 본문

개발 Tip

[안드로이드] 심심해서 찍어본 Retrofit 동기 / 비동기 Feat.Rx

삐질 2020. 4. 22. 20:46

 

안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.
 

오늘은 그냥 제가 심심해서 동기와 비동기의 시간차이 측정을 해봤습니다.

 

 

별 내용은 없습니다 만, 관찰 결과를 포스팅 합니다.

 

 

실험 주제: 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)

            }, {

            })
    )
}
1회차
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초

 

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

 

Comments