最近在研究比較通用的adb效能測試,自己參考網上的許許多多**,寫了各種抓cpu\記憶體\fps等資料的方法。
方法寫好以後,放到真機上跑了一下,發現功能是實現了,但**的效能很有問題:
以下面這段**為例:
def get_totalmemory(self):
command = adb + " -s {} shell dumpsys meminfo ".format(self.get_mdevice())
print(command)
memory=os.popen(command)
res = memory.read()
totalram=0
for line in res.splitlines():
line=line.strip()
list = line.split(":")
if list[0]=="total ram":
if self.get_androidversion()== 5 or self.get_androidversion()== 6:
totalram = format(int(list[1].split(" ")[1])/1024,".2f")
elif self.get_androidversion()== 7 or self.get_androidversion()== 8:
totalram = format(int(list[1].split("k")[0].replace(",",""))/1024,".2f")
break
return totalram
這段是抓裝置總記憶體的。總體思路是先拼接adb shell命令,獲得當前裝置的meminfo資料,然後呼叫os.popen()執行該命令,然後再遍歷執行結果,解析字串,找到「total ram」一項字段,然後根據不同的安卓版本,切割字串,獲得最終的記憶體值。
執行結果如下:
可以看到,執行**花費了5、6秒鐘。
通過逐行打點計時,定位到問題在這麼一段**:
res=memory.read()這行花費了3.7秒以上。
通過查閱資料,發現python使用read()/readline()/readlines()三個方法來讀取內容。
具體見
我反覆地除錯這3個方法,結果並沒有什麼區別。均需要花費3、4秒時間才能解析adb dump資料。
一籌莫展之際,我突然想到,我為什麼要去read這個dump檔案呢?我直接從dump裡面查值不就好了麼?
修改**如下
去除掉read()的操作,同時也去掉了相應的splitlines()操作,直接在dump返回值裡進行for迴圈。
**效率瞬間提高了好幾倍。
兩台裝置均在1秒內就返回了所需要的adb dump資訊。
注:62001使用安卓7的os,執行時間穩定在0.8-1.0秒,
62025使用安卓5的os,執行時間穩定在0.4-0.5秒。
這樣,使通過adb dump進行實時資訊的記錄成為可能。
如何從SLB故障中快速恢復
3月14日17 32 19 10時段,阿里雲杭州區可用區e的大量slb出現服務不可用的問題,疑似健康檢查系統出現故障,所有後端節點不論是否監控都一律都被標記為 異常 導致tcp slb的服務connection failed,http slb出現502錯誤。小博無線線上業務系統完全基於阿里雲搭建,在...
快速排序 從右邊開始
先給出快速排序的 void quicksort vector nums,int left,int right nums left nums i nums i temp quicksort nums,left,i 1 quicksort nums,i 1,right 以nums left 作為基數te...
從調包到工程實戰,如何快速掌握機器學習技能
基礎技能是必備的 一方面是因為機器學習本身的體系十分龐大,當然只是教sklearn調個模型顯然不是在認真講機器學習。學習路徑的設計 知識點難易度的把握,案例的選取,內容的深入程度 等細節都做了大量延伸和重點打磨。既要易於理解,也要兼顧深度 掌握那部分核心技能,並在實際的案例中輸出結果 比如系統的微積...