作者:Sinsonglew 出处:http://www.cnblogs.com/sinsonglew 欢迎转载,也请保留这段声明。thanks :)
写起来有点操作手册的感觉,望各位园友见谅。
1. 背景
如何测量某个http接口(资源加载)的性能,如何测量多个http接口的性能
2. 工具选型
curl, charles, fiddler ?
curl 无法提取接口时间
charles 不支持批处理
fiddler 支持批量,但不熟悉
3. 如何使用fiddler支持命令行
fiddler支持customize rules, QuickExec命令行(类似浏览器里的console);
customize rules 顾名思义就是支持用户编写脚本来对http请求进行处理。
customize rules, QuickExec位置如下图所示:
cutomize rule 打开是一个类似js脚本的文本文件,找到其中的OnExecAction(sParams: String[])函数,OnExecAction就是对QuickExec里输入的命令行的响应函数;
在OnExecAction函数中存在多个内置的命令case分支,比如dump命令,是删除所有的fiddler的抓包。由此,个人需要的customize操作就是自己写一个新的case分支。
4. 我的catch分支
代码含义如下: 分析一个页面、两个swf文件,1个api接口的请求响应时间,精确到毫秒,把单次请求的数据输出到本地,每次打开一个页面输出1个文件,注:gs_TextCounter是在OnExecAction函数外定义的静态全局变量
case "catch": var s:String = ""; var filter:String[] = new String[sParams.Length-1];//["abcde.html","player.swf","xxx.yyy.zzz/api","ad.swf"]; for(var t = 0; t < filter.Length; ++t) { filter[t] = sParams[t+1]; } var oSessions:Session[] = FiddlerObject.UI.GetAllSessions(); for (var x = 0; x < oSessions.Length; ++x) { for(var y = 0; y < filter.Length; ++y){ if((oSessions[x].url.EndsWith(".html") || oSessions[x].url.EndsWith(".swf") || oSessions[x].url.indexOf("api") > -1) && oSessions[x].responseBodyBytes.Length > 0 && oSessions[x].url.indexOf(filter[y]) > -1) { s = s + filter[y] + ","; //s = s + oSessions[x].Timers.ClientConnected.ToString("hh:mm:ss.fff") + ","; s = s + oSessions[x].Timers.ClientDoneRequest.ToString("hh:mm:ss.fff") + ","; // s = s + oSessions[x].Timers.ServerConnected.ToString("hh:mm:ss.fff") + ","; // s = s + oSessions[x].Timers.ServerGotRequest.ToString("hh:mm:ss.fff") + ","; // s = s + oSessions[x].Timers.ServerBeginResponse.ToString("hh:mm:ss.fff") + ","; // s = s + oSessions[x].Timers.ServerDoneResponse.ToString("hh:mm:ss.fff") + ","; // s = s + oSessions[x].Timers.ClientBeginResponse.ToString("hh:mm:ss.fff") + ","; s = s + oSessions[x].Timers.ClientDoneResponse.ToString("hh:mm:ss.fff") + ","; s = s + oSessions[x].Timers.ClientDoneResponse.Subtract(oSessions[x].Timers.ClientDoneRequest).TotalMilliseconds + "\n"; break; } //s.AppendFormat("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}\n", } } //Utilities.CopyToClipboard(s); try { var sFileName:String = "d:/temp/" + filter[0] + gs_TextCounter + ".txt"; var sw:StreamWriter = new StreamWriter(sFileName, false, Encoding.UTF8); sw.Write(s); sw.Close(); ++gs_TextCounter; } catch (ex:Exception) { MessageBox.Show("Error."); } FiddlerObject.UI.actRemoveAllSessions(); //FiddlerObject.UI.actClearWinINETCache(); //FiddlerObject.UI.actClearWinINETCookies(); return true;
5. 开始batch
批处理脚本为bat文件,win7运行环境, 脚本的用途是发起2次请求,抓取红色字体的4个资源或接口
注: sta.py python 脚本是把n次请求的数据处理为一个表单
start fiddler -quiet timeout 4 for /l %%i in (1,1,2) do ( rem /* Deletes browser cache, history, cookie */ RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351 start iexplore "abcde.html" timeout 10 "C:\Program Files\Fiddler2\ExecAction.exe" "catch abcde.html player.swf xxx.yyy.zzz/api ad.swf " timeout 10 taskkill /im iexplore.exe /f timeout 6 ) rem c:\Python34\python.exe sta.py d:\temp\ abcde exit
6. 参考文献
http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp
Debugging with Fiddler (google book, 可参考大部分fiddler的详细内容): http://books.google.com.hk/books?id=qyWhLU1armgC&pg=PA196&lpg=PA196&dq=FiddlerObject&source=bl&ots=Pr-NulyNv0&sig=LK5UHkbqe2Yh1l0dS2rGP6f-NDI&hl=en&sa=X&ei=GRlXVMeSLIKA8QXJn4LABA&ved=0CCgQ6AEwAw#v=onepage&q&f=false