最近使用systrace做性能測試,在systrace上統計紅綠燈,因爲數到眼殘,所以做了個自動數幀的工具。
主要做法是修改chrome tracing的源碼
話說tracing這麼好用,不出個cmdline真不合理。
幸運的看到了一段代碼
/*./tracing/tracing/extras/android/android_auditor.html*/
pushFramesAndJudgeJank_: function()
一看就知道是在判斷幀的狀態
然後就加了統計代碼
var redFrame = 0;
var yellowFrame = 0;
var greenFrame = 0;
app.process.frames.forEach(function(frame) {
if (frame.totalDuration > EXPECTED_FRAME_TIME_MS * 2) { // 紅幀
badFramesObserved += 2;
frame.perfClass = FRAME_PERF_CLASS.TERRIBLE
redFrame += 1;
} else if (frame.totalDuration > EXPECTED_FRAME_TIME_MS
|| frameMissedDeadline(frame)) { // 黃幀
badFramesObserved++;
frame.perfClass = FRAME_PERF_CLASS.BAD;
yellowFrame += 1;
} else { // 綠幀
frame.perfClass = FRAME_PERF_CLASS.GOOD;
greenFrame += 1;
}
});
最後用log輸出
console.log("%d %d %d",redFrame,yellowFrame,greenFrame);
後面又要搞自動化,就是吧js裏面的東西打出來
有四個思路
- 用nodejs運行,將結果寫文件
- html5寫文件
- 重定向log
- 建本地服務器,用post提交數據
nodejs的很簡單,下了node-webkit的源碼,然後建了個helloword的工程,發現打不開,突然就想到tracing這個東西跟chrome有很強關係,於是用火狐打開trace2html生成的html發現打不開,應該就是隻有chrome能解析systrace的數據
html5的沒怎麼嘗試,因爲寫文件會寫到chrome的安裝目錄上的,無法寫到html文件所在的目錄(安全機制,這個限制是必須的),即使寫出來用法也很奇怪
建本地服務器,這個應該是可以的,感覺就複雜了點,而且流程太多也不好,容易出bug
重定向一開始以爲沒希望,到google查了一下還真有這個用法
用下面的命令可以將許多log包括控制檯的log輸出到錯誤輸出流上
google-chrome --enable-logging=stderr
很奇葩的是錯誤輸出流的重定向好像有點問題
象如下的代碼就輸出不了,以後還得研究下,
google-chrome --enable-logging=stderr $1 2>&1 | grep "\[Frame\]" > log
後來用nodejs移植了tracing,主要用了vm.runInThisContext,來運行tracing的各個模塊,nodejs和javascript有好多不兼容多東西,坑死爹了.
改代碼時用到的一坨正則,匹配html中的js代碼
sed -n '/<script */,/<\/script>/p' base/base.js sed -e 'a#"progressMeter.update"#"}"#g' \
-e 'i#"progressMeter.update"#"if(tr.silent == false) {"#g' \
-e 's#"progressMeter.update"#"console.log"#g' tracing/importer/import.js
trace抓下來的數據是壓縮過的,用下面命令可解壓
zlib-flate -uncompress < trace >out
發現了一個極好多正則表達式
echo "asdfkjasldjkf\"shiner\"df" | sed 's/\(.*\)"\(.*\)"\(.*\)/\2/g'
開始port到windows上了,用的還是nodejs
因爲用到的同步執行命令要求node最新版,所以用下面的命令來安裝最新的工具
curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -
自動化打包的功能,先了解先 Node.js - Zip/Unzip a folder 只能說windows的cmd去屎