일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 사용법
- 클린아키텍쳐
- 안드로이드 익명클래스
- zeplin
- 제플린
- #android #안드로이드 #glide #gif #이미지다운로드
- 안드로이드 메모리릭
- 키스토어
- 안드로이드
- #리사이클러뷰
- 구글맵안돼요
- #안드로이드 개발자 #안드로이드 신입 #개발자 이직 #안드로이드 면접 #신입 개발자
- retrofi
- #안드로이드
- #ContentProvider #App DataShare
- 레트로핏
- 리사이클러뷰 체크박스
- 안드로이드 아키텍쳐
- #리사이클러뷰 어댑터
- retrofit2
- 빗버킷 #bitbucket #authorization failed #깃
- MVVM
- 안드로이드해상도
- 메모리릭
- #SMS API #안드로이드 SMS #SMS Retriever
- retrofit
- Today
- Total
땀이 삐질삐질 나는 개발 일기
[안드로이드] 심심해서 찍어본 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
'개발 Tip' 카테고리의 다른 글
DI(Dependency Injection)이란? 맛만 이라도 보자! (0) | 2020.06.03 |
---|---|
[안드로이드] 아키텍쳐? 패턴 ? 처음엔 아무것도 모른다면 이것 만이라도.. (0) | 2020.04.30 |
[안드로이드] 기본적인 Recyclerview ViewType으로 홀더 나누기, 다른 Layout만들기 (0) | 2020.04.16 |
[안드로이드] 익명클래스가 메모리릭을 유발하는 EU(이유) (0) | 2020.03.12 |
[안드로이드] Recyclerview 제대로 알고 쓰자 ! (7) | 2020.03.10 |