今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间

total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)
#传输结束所消耗的总时间
dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)
#从发起请求到DNS解析完成所消耗的时间
connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)
#从发起请求到建立连接所消耗的时间
redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)
#从发起请求到重定向所消耗的时间
ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)
#从发起请求到SSL建立握手时间
pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)
#从发起请求到准备传输所消耗的时间
starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)
#从发起请求到接收第一个字节的时间

最后发现,dns_time+connect_time+......+starttrans_time远远大于total_time。

查看man curl(pycurl基于curl开发的),发现各个阶段时间是从客户端发起URL请求时到某个阶段的时间差,而不是某个阶段开始时间到结束时间差。

为了求得某个阶段的执行时间,需要对这些值进行计算。

pycurl的各个阶段(根据pycurl.*_TIME统计)依次为

DNS解析-->TCP连接-->跳转【如有】-->SSL握手【如有】-->客户端准备-->服务器响应-->数据传输

代码如下:

#! /usr/bin/python
#coding:utf-8
#-*- coding : utf-8 -*- import sys,pycurl request_url = sys.argv[1]
curl_obj = pycurl.Curl()
#创建一个curl对象 curl_obj.setopt(pycurl.CONNECTTIMEOUT, 5)
#连接的等待时间,设置为0则不等待
curl_obj.setopt(pycurl.TIMEOUT, 5)
#最大下載时间
curl_obj.setopt(pycurl.NOPROGRESS, 1)
#是否屏蔽下载进度条,非0则屏蔽
curl_obj.setopt(pycurl.MAXREDIRS, 0)
#指定HTTP重定向的最大数
curl_obj.setopt(pycurl.FORBID_REUSE, 1)
#完成交互后强制断开连接,不重用
curl_obj.setopt(pycurl.FRESH_CONNECT,1)
#强制获取新的连接,即替代缓存中的连接
curl_obj.setopt(pycurl.DNS_CACHE_TIMEOUT,1)
#设置保存DNS信息的时间,默认为120秒
curl_obj.setopt(pycurl.URL,request_url)
#指定请求的URL import StringIO
strio = StringIO.StringIO()
curl_obj.setopt(pycurl.WRITEFUNCTION, strio.write) try :
curl_obj.perform()
err_mess = ''
except Exception as e:
err_mess = str(e)
#访问页面 total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)
#传输结束所消耗的总时间
dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)
#从发起请求到DNS解析完成所消耗的时间
connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)
#从发起请求到建立连接所消耗的时间
redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)
#从发起请求到重定向所消耗的时间
ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)
#从发起请求到SSL建立握手时间
pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)
#从发起请求到准备传输所消耗的时间
starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)
#从发起请求到接收第一个字节的时间 print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
print '发起请求到TCP连接完成时间: %.3f ms' %(connect_time*1000)
print '发起请求到跳转完成时间: %.3f ms' %(redirect_time*1000)
print '发起请求到SSL建立完成时间 : %.3f ms' %(ssl_time*1000)
print '发起请求到客户端发送请求时间: %.3f ms' %(pretrans_time*1000)
print '发起请求到客户端接受首包时间: %.3f ms' %(starttrans_time*1000)
print '总时间为: %.3f ms' %(total_time*1000)
print '' transfer_time = total_time - starttrans_time
#传输时间
serverreq_time = starttrans_time - pretrans_time
#服务器响应时间,包括网络传输时间
if ssl_time == 0 :
if redirect_time == 0 :
clientper_time = pretrans_time - connect_time
#客户端准备发送数据时间
redirect_time = 0
else :
clientper_time = pretrans_time - redirect_time
redirect_time = redirect_time - connect_time
ssl_time = 0
else :
clientper_time = pretrans_time - ssl_time if redirect_time == 0 :
ssl_time = ssl_time - connect_time
redirect_time = 0
else :
ssl_time = ssl_time - redirect_time
redirect_time = redirect_time - connect_time connect_time = connect_time - dns_time print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
print 'TCP连接消耗时间 : %.3f ms' %(connect_time*1000)
print '跳转消耗时间: %.3f ms' %(redirect_time*1000)
print 'SSL握手消耗时间 : %.3f ms' %(ssl_time*1000)
print '客户端发送请求准备时间: %.3f ms' %(clientper_time*1000)
print '服务器处理时间: %.3f ms' %(serverreq_time*1000)
print '数据传输时间: %.3f ms' %(transfer_time*1000)

经过多次测试,终于dns_time+connect_time+......+starttrans_time=total_time

最新文章

  1. 七牛整合PHP上传文件
  2. PHP memory_get_usage()管理内存
  3. ZLL主机接口的信息处理流程
  4. 内网穿透利器 Ngrok 使用教程
  5. Trigger Execution Sequence Of Oracle Forms
  6. js dom
  7. go语言实现的目录共享程序
  8. EMA计算的C#实现(c# Exponential Moving Average (EMA) indicator )
  9. OAuth2.0基本流程
  10. 提领NULL指针
  11. P1034
  12. 完美实现身份证校验 js正则
  13. 如何实现VM框架中的数据绑定
  14. Python 简单聊天室
  15. docker启动,重启,停止容器
  16. 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
  17. 集合各个实现类的底层实现原理 ----- 原文地址:https://blog.csdn.net/qq_25868207/article/details/55259978
  18. arcgis10.2 sde配置
  19. 利用jTessBoxEditor工具进行Tesseract-OCR样本训练
  20. net-snmp 安装与trap调试

热门文章

  1. 利用js阻止表单提交
  2. 如何过滤adb logcat输出
  3. windows批处理 打开exe后关闭cmd
  4. [oldboy-django][2深入django]浏览器同源策略 + JSONP + cros
  5. 常用JS整理
  6. github 下载部分文件夹
  7. IIS8 不能在此路径中使用此配置节。如果在父级别上锁定了该节
  8. [WC2013][luogu4074] 糖果公园 [树上带修改莫队]
  9. BZOJ 4827 [Hnoi2017]礼物 ——FFT
  10. git本地仓库关联远程仓库