「 毫秒級 」的應用啓動速度評測

前言python


啓動速度是一項重要的應用性能指標。以手機輸入法爲例,用戶每次嘗試鍵入時,均會直觀感知到輸入法鍵盤的調起速度,若速度過慢則會頻繁影響用戶體驗。
web


爲了可以更準確地獲取到鍵盤調起速度的具體數據,小編編寫了基於Python視頻及圖像處理模塊的評測腳本,下面以其中部分函數爲例,爲你們介紹一下實現思路和流程。
shell


鍵盤調起自動化
ruby


首先須要確認的是,在手機上執行輸入法切換與鍵盤調起等操做的自動化命令——咱們能夠在找出設備屏幕上的相應座標後,經過如下adb命令進行實現:微信


def turn_up_swtich(self): # 切換到百度輸入法 inputmethod_pkgnames_list = ["com.baidu.input/.ImeService", "com.sohu.inputmethod.sogou/.SogouIME"] command_swtichInput = "adb shell ime set " + inputmethod_pkgnames_list[0] os.system(command_swtichInput) # 點擊輸入框,嘗試調起鍵盤 command_turnUp = "adb shell input swipe 500 500 500 500 50" os.system(command_turnUp) # 關閉百度輸入法鍵盤 command_turnDown = "adb shell input swipe 660 750 660 750 50" os.system(command_turnDown) # 切換到搜狗輸入法 command_swtichInput = "adb shell ime set " + inputmethod_pkgnames_list[1] os.system(command_swtichInput)


其後,咱們經過一個簡單的多進程應用,將鍵盤調起的過程以視頻形式記錄。爲便於後續的視頻處理,須要在錄製前開啓手機「開發者選項」中的「指針位置」與「顯示觸摸操做」。
markdown


# 視頻錄製命令def start_screenrecord(self): command = "adb shell screenrecord /sdcard/Movies/ScreenCaptures/SDvideo_data.mp4 --time-limit 5 --size 720x1280" os.system(command)
# 搜狗輸入法鍵盤調起def click_action(self): time.sleep(0.5) command_turnUp = "adb shell input swipe 500 500 500 500 50" os.system(command_turnUp)
# 多進程使鍵盤調起與視頻錄製同時進行def make_video(self, video_path, runNum): p1 = Process(target=self.start_screenrecord) p2 = Process(target=self.click_action) p1.start() p2.start() p2.join() p1.join() time.sleep(0.5) # 導出並保存視頻 dest_path = video_path + "/" + str(runNum) + ".mp4" self.get_file("adb pull /sdcard/Movies/ScreenCaptures/SDvideo_data.mp4 ", dest_path) return dest_path


這樣,經過一個「切換輸入法」、「鍵盤調起並錄屏」的循環,便可獲得多個視頻素材,以期在後續的視頻處理、結果輸出時,經過多個數據的均值來消弭偏差:
app


def run(self):# 啓動帶有輸入框的測試app command_start = "adb shell am start -n com.sogou.inputtest/.MainActivity" os.system(command_start) for runNum in range(0,50): # 每次循環先切換到其餘輸入法,再進行搜狗輸入法鍵盤調起錄製 self.turn_up_swtich() dest_path = self.make_video(self.video_path, runNum) # 視頻處理解析 self.parse(dest_path ,runNum) # 輸出耗時數據 return self.turnUp_speed


視頻處理解析
編輯器


針對視頻素材,須要經過視頻處理模塊sk-video將其逐幀解析,並對每幀畫面加以識別——獲得「點擊輸入框,嘗試調起鍵盤」與「鍵盤調起完成」兩個事件所發生畫面之間的幀數差值,用來計算鍵盤調起耗時。

下面給出完整方法,對其中判斷環節的說明可見註釋及後續內容:
ide


# 視頻解析——傳入視頻文件與當前循環次數def parse(self, video_file, runNum): # 以60幀加載處理視頻 output_dict = {"-r": str(60)} evaluation_video = skvideo.io.vreader(video_file, outputdict=output_dict) # 當前幀數 num = 0 has_keydown = False self.is_turn_up_img = None for frame in evaluation_video: # 獲取每幀畫面寬高 self.img_size_width = int(frame.shape[1]) self.img_size_height = int(frame.shape[0]) # 畫面中搜狗輸入法標識區域 target_img = frame[self.target_pos] # 畫面中屏幕頂部色塊區域 block_img = frame[self.block_pos] # 根據色塊顏色變化狀況判斷是否發生按下輸入框 if self.is_key_down(block_img, num): has_keydown = True # 記錄發生按下輸入框畫面的幀數 is_key_down_num = num  if has_keydown: # 由發生按下輸入框開始,保存標識處圖片 cv2.imwrite(".\\key\\cand\\turnup_" + str(runNum) + "\\" + str(num) + ".png", target_img)      # 標識移動到預設位置(已完成調起鍵盤),記錄畫面幀數 if self.is_turn_up(target_img, num): has_turn_up_num = num - 1 # 計算耗時,寫入列表 turnup_time = int(has_turn_up_num - is_key_down_num)*16.6 self.turnUp_speed.append(turnup_time) return  num += 1


首先,根據設備在執行自動化鍵盤調起時的表現——模擬按下輸入框時,屏幕頂部色塊的顏色變紅(以下圖),便可經過圖像處理模塊cv2,對畫面相應座標處的顏色變化進行監控,由此定位到視頻中哪一幀畫面發生了「點擊輸入框,嘗試調起鍵盤」:


def is_key_down(self, block_img):    # 識別色塊處顏色變化    r, g, b = cv2.split(block_img) red_num = 0 for x in range(0, r.shape[0], 5): for y in range(0, r.shape[1], 5): if r[x, y] > 200 and g[x, y] < 100 and b[x, y] < 100: red_num += 1 total_num = r.shape[0] / 5 * r.shape[1] down_filter_num = total_num / 20 up_filter_num = total_num / 100    # 根據色塊顏色(變紅)判斷髮生按下 if self.key_state['is_key_down']: if red_num < up_filter_num: self.key_state['is_key_down'] = False else: if red_num > down_filter_num: self.key_state['is_key_down'] = True return True return False


同理,以「搜狗輸入法標識徹底上升到相應位置」爲鍵盤調起完成的標誌,在鍵盤調起、標識逐漸上升的過程當中(以下圖),對每幀畫面中相應座標處的顏色變化進行識別,以期獲得此刻幀數:函數



# 搜狗標識顏色變化識別def is_turn_up(self, target_img): b, g, r = cv2.split(target_img) speed_num = 0 for x in range(0, r.shape[0], 5): for y in range(0, r.shape[1], 5): if b[x, y] < 200 and g[x, y] < 200 and r[x, y] < 200: speed_num += 1 if self.is_turn_up_img: if speed_num == self.is_turn_up_img: return True # 以標識圖片顏色變化達到必定程度爲限 if speed_num >= 2: self.is_turn_up_img = speed_num return False


最終,將本輪腳本執行得出的兩個幀數間差值乘以每幀耗時(16.67ms)後寫入結果列表,並在預設的循環次數完成後,取得列表中的數據均值,即是當前輸入法鍵盤調起速度的評測結果了。



結語


相比於主觀感知,根據這樣的應用啓動(鍵盤調起)速度評測實現方案,無疑可以得出更爲準確、可靠的數據結果,而此方案亦可推廣到其餘各式應用的評測當中。歡迎各位一同溝通、學習。





搜狗測試微信號:Qa_xiaoming

搜狗測試QQ粉絲羣:459645679




本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索