今天使用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时间问题的更多相关文章

  1. [置顶] php检测输入数据是否合法常用的类

    <?php class Fun{ function isEmpty($val) { if (!is_string($val)) return false; //是否是字符串类型 if (empt ...

  2. [置顶] 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!

    前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...

  3. mysql大于当前时间置顶并按升序排序,小于当前时间的置尾并按降序排序

    现在用id来代替时间这样好测试 看一下测试表数据 执行按需求规则排序的sql SELECT * FROM number_generator ORDER BY id < 16 , IF(id &l ...

  4. YSLOW(一款实用的网站性能检测工具)

     概述 YSlow是Yahoo发布的一款基于FireFox的插件,这个插件可以分析网站的页面,并告诉你为了提高网站性能,如何基于某些规则而进行优化.  安装  官网:http://yslow.org/ ...

  5. [Winform]检测exe是否已经运行,并将其置顶

    摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...

  6. 基于Yahoo网站性能优化的34条军规及自己的见解

    1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数,这是提高网页速 ...

  7. Yahoo!网站性能最佳体验的34条黄金守则(转载)

    1.       尽量减少HTTP请求次数  终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...

  8. Yahoo!网站性能最佳体验的34条黄金守则

    Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是 ...

  9. 网站性能优化(Yahoo 35条)

    Yahoo 网站性能优化 35条 一.内容部分 尽量减少 HTTP请求 减少 DNS查找 避免跳转 缓存 Ajxa 推迟加载 提前加载 减少 DOM元素数量 用域名划分页面内容 使 frame数量最少 ...

随机推荐

  1. 42、通过ontouch检测expandableListview的单击、长按、列表滚动

    一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Exp ...

  2. plsql 编程基础

    分支 declare --声明变量 a ); b ); c ); begin --开始 a := '小明'; dbms_output.put_line(a); b :; c :; if b > ...

  3. Python-S9-Day126——Scrapy爬虫框架

    01 今日内容概要 02 内容回顾和补充:scrapy 03 内容回顾和补充:网络和并发编程 04 Scrapy爬虫框架:pipeline做持久化(一) 05 Scrapy爬虫框架:pipeline做 ...

  4. day02_03.五个数字一行输出

    第3题 5个数字一行输出 每当你做一道题目时,记住要明确你的目的是什么 你的代码执行出来会是一个什么效果 然后根据你想要的这个效果去编辑代码 题目:输出1~100(不包含100)之间的偶数,5个数字一 ...

  5. 聊聊、Integer 封装特性

    前几天在公司内部群,有人分享出了一道题,问谁能口算出来,他就膜拜那个人.题目如下: Class cache = Integer.class.getDeclaredClasses()[0]: Field ...

  6. 【转】Unity摄像机的使用二:摄像机的切换

    http://blog.csdn.net/liujunjie612/article/details/45847877 我们接着上一篇博文继续研究摄像机,这篇我们说下Unity中摄像机的切换,说到切换, ...

  7. hihoCoder #1758 加减

    $\DeclareMathOperator{\lowbit}{lowbit}$ 题目大意 对于一个数 $x$,设它最低位的 1 是第 $i$ 位,则 $\lowbit(x)=2i$ . 例如 $\lo ...

  8. 小w的喜糖(candy)

    小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...

  9. npm使用问题总结

    1.报错npm run dev error [npm ERR! code ELIFECYCLE] 解决方法 rm -rf node_modules rm package-lock.json npm c ...

  10. 一个javascript继承和使用的例子

    继承可以帮助我们实现代码的重用,把对象的属性写入构造函数,对象的方法写入原型后,以下例子演示继承的使用: 示例的css和js在后 父实例,得到一个间隔1s的轮播: <!DOCTYPE html& ...