[置顶] pycurl检测网站性能,pycurl.*_TIME时间问题
2024-09-01 00:17:08
今天使用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
最新文章
- 七牛整合PHP上传文件
- PHP memory_get_usage()管理内存
- ZLL主机接口的信息处理流程
- 内网穿透利器 Ngrok 使用教程
- Trigger Execution Sequence Of Oracle Forms
- js dom
- go语言实现的目录共享程序
- EMA计算的C#实现(c# Exponential Moving Average (EMA) indicator )
- OAuth2.0基本流程
- 提领NULL指针
- P1034
- 完美实现身份证校验 js正则
- 如何实现VM框架中的数据绑定
- Python 简单聊天室
- docker启动,重启,停止容器
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
- 集合各个实现类的底层实现原理 ----- 原文地址:https://blog.csdn.net/qq_25868207/article/details/55259978
- arcgis10.2 sde配置
- 利用jTessBoxEditor工具进行Tesseract-OCR样本训练
- net-snmp 安装与trap调试
热门文章
- 利用js阻止表单提交
- 如何过滤adb logcat输出
- windows批处理 打开exe后关闭cmd
- [oldboy-django][2深入django]浏览器同源策略 + JSONP + cros
- 常用JS整理
- github 下载部分文件夹
- IIS8 不能在此路径中使用此配置节。如果在父级别上锁定了该节
- [WC2013][luogu4074] 糖果公园 [树上带修改莫队]
- BZOJ 4827 [Hnoi2017]礼物 ——FFT
- git本地仓库关联远程仓库