初始化性能問(wèn)題
我們都知道Dagger 2是一個(gè)優(yōu)化得很好的依賴注入框架。但是即使有這些全部的微優(yōu)化,仍然在依賴注入的時(shí)候存在可能的性能問(wèn)題 - “笨重”的第三方庫(kù)和/或我們那些主線程阻塞的代碼。
依賴注入是在盡可能短的時(shí)間內(nèi)在正確的地方傳遞所請(qǐng)求的依賴的過(guò)程 - 這些都是Dagger 2做得很好的。但是DI也會(huì)去創(chuàng)建各種依賴。如果我們需要花費(fèi)幾百毫秒創(chuàng)建它們,那么以納秒級(jí)的時(shí)間去提供依賴還有什么意義呢?
當(dāng)我們的app創(chuàng)建了一系列繁重的單例并立即由Dagger2提供服務(wù)之后也許可能沒(méi)有這么重要。但是在我們創(chuàng)建它們的時(shí)候仍然需要一個(gè)時(shí)間成本 - 大多數(shù)情況下決定了app啟動(dòng)的時(shí)間。
這問(wèn)題(已經(jīng)給了提示怎么去調(diào)適它)已經(jīng)在我之前的一篇博客中描述地很詳細(xì)了:Dagger 2 - graph creation performance。
在很短的時(shí)間內(nèi),讓我們想象這么一個(gè)場(chǎng)景 - 你的app有一個(gè)初始化的界面(SplashScreen),需要在app啟動(dòng)后立即做一些需要的事情:
初始化所有tracking libs(Goole Analytics, Crashlytics)然后發(fā)送第一份數(shù)據(jù)給它們。
創(chuàng)建用于API和/或數(shù)據(jù)庫(kù)通信的整個(gè)棧。
我們?cè)噲D的交互邏輯(MVP中的Presenters,MVVM中的ViewModels等等)。
即使我們的代碼是優(yōu)化地非常好的,但是仍然有可能有些額外的庫(kù)需要幾十或者幾百毫秒的時(shí)間來(lái)初始化。在我們啟動(dòng)界面之前將展示必須初始化和交付的所有請(qǐng)求的依賴(和它們的依賴)。這意味著啟動(dòng)時(shí)間將會(huì)是它們每一個(gè)初始化時(shí)間的總和。
由 AndroidDevMetrics 測(cè)量的示例堆??赡苋缦滤荆?/p>
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26