[置顶] pycurl检测网站性能,pycurl.*_TIME时间问题
今天使用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
[置顶] pycurl检测网站性能,pycurl.*_TIME时间问题的更多相关文章
- [置顶] php检测输入数据是否合法常用的类
<?php class Fun{ function isEmpty($val) { if (!is_string($val)) return false; //是否是字符串类型 if (empt ...
- [置顶] 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
- mysql大于当前时间置顶并按升序排序,小于当前时间的置尾并按降序排序
现在用id来代替时间这样好测试 看一下测试表数据 执行按需求规则排序的sql SELECT * FROM number_generator ORDER BY id < 16 , IF(id &l ...
- YSLOW(一款实用的网站性能检测工具)
概述 YSlow是Yahoo发布的一款基于FireFox的插件,这个插件可以分析网站的页面,并告诉你为了提高网站性能,如何基于某些规则而进行优化. 安装 官网:http://yslow.org/ ...
- [Winform]检测exe是否已经运行,并将其置顶
摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...
- 基于Yahoo网站性能优化的34条军规及自己的见解
1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数,这是提高网页速 ...
- Yahoo!网站性能最佳体验的34条黄金守则(转载)
1. 尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...
- Yahoo!网站性能最佳体验的34条黄金守则
Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是 ...
- 网站性能优化(Yahoo 35条)
Yahoo 网站性能优化 35条 一.内容部分 尽量减少 HTTP请求 减少 DNS查找 避免跳转 缓存 Ajxa 推迟加载 提前加载 减少 DOM元素数量 用域名划分页面内容 使 frame数量最少 ...
随机推荐
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- 聊聊、CA机构认证CSR生成
https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO832 https://s ...
- SQL SERVER存储引擎——04.数据
4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...
- jQuery ajax使用$(this).parent()无效解决方法
div=$(this).parent(); //先获取父级元素 div.remove(); //再删除 $(".delStu").click(function () { ...
- [Python]Pandas简单入门(转)
本篇文章转自 https://colab.research.google.com/notebooks/mlcc/intro_to_pandas.ipynb?hl=zh-cn#scrollTo=zCOn ...
- 企鹅的游戏(penguin)
企鹅的游戏(penguin) 题目描述 Shiva养了一只小企鹅.小企鹅很聪明,她总是帮Shiva和他的好朋友想出很多很好玩的游 戏.其中有一个游戏特别经典,Shiva和他的小伙伴们百玩不厌. 游戏规 ...
- Optimal Marks(optimal)
Optimal Marks(optimal) 题目描述 定义无向图边的值为这条边连接的两个点的点权异或值. 定义无向图的值为无向图中所有边的值的和. 给定nn个点mm条边构成的图.其中有些点的权值是给 ...
- 0-Android使用Ashmem机制进行跨进程共享内存
Android使用Ashmem机制进行跨进程共享内存 来源: http://blog.csdn.net/luoshengyang/article/details/6651971 导语: 在Androi ...
- modulus CRT
(吐槽)额..CRT本来就是modulus的么.. CRT是可以每次加一个条件的(当然要保证coprime) 那么我们考虑 x=a (mod p1) x=b (mod p2) 这样的话我们知道 x=a ...
- iterator & iterable
一. java.lang.Iterable java.util.Iterator Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调用iter ...