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

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

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

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

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

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

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

代码如下:

  1. #! /usr/bin/python
  2. #coding:utf-8
  3. #-*- coding : utf-8 -*-
  4.  
  5. import sys,pycurl
  6.  
  7. request_url = sys.argv[1]
  8. curl_obj = pycurl.Curl()
  9. #创建一个curl对象
  10.  
  11. curl_obj.setopt(pycurl.CONNECTTIMEOUT, 5)
  12. #连接的等待时间,设置为0则不等待
  13. curl_obj.setopt(pycurl.TIMEOUT, 5)
  14. #最大下載时间
  15. curl_obj.setopt(pycurl.NOPROGRESS, 1)
  16. #是否屏蔽下载进度条,非0则屏蔽
  17. curl_obj.setopt(pycurl.MAXREDIRS, 0)
  18. #指定HTTP重定向的最大数
  19. curl_obj.setopt(pycurl.FORBID_REUSE, 1)
  20. #完成交互后强制断开连接,不重用
  21. curl_obj.setopt(pycurl.FRESH_CONNECT,1)
  22. #强制获取新的连接,即替代缓存中的连接
  23. curl_obj.setopt(pycurl.DNS_CACHE_TIMEOUT,1)
  24. #设置保存DNS信息的时间,默认为120秒
  25. curl_obj.setopt(pycurl.URL,request_url)
  26. #指定请求的URL
  27.  
  28. import StringIO
  29. strio = StringIO.StringIO()
  30. curl_obj.setopt(pycurl.WRITEFUNCTION, strio.write)
  31.  
  32. try :
  33. curl_obj.perform()
  34. err_mess = ''
  35. except Exception as e:
  36. err_mess = str(e)
  37. #访问页面
  38.  
  39. total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)
  40. #传输结束所消耗的总时间
  41. dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)
  42. #从发起请求到DNS解析完成所消耗的时间
  43. connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)
  44. #从发起请求到建立连接所消耗的时间
  45. redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)
  46. #从发起请求到重定向所消耗的时间
  47. ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME)
  48. #从发起请求到SSL建立握手时间
  49. pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)
  50. #从发起请求到准备传输所消耗的时间
  51. starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME)
  52. #从发起请求到接收第一个字节的时间
  53.  
  54. print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
  55. print '发起请求到TCP连接完成时间: %.3f ms' %(connect_time*1000)
  56. print '发起请求到跳转完成时间: %.3f ms' %(redirect_time*1000)
  57. print '发起请求到SSL建立完成时间 : %.3f ms' %(ssl_time*1000)
  58. print '发起请求到客户端发送请求时间: %.3f ms' %(pretrans_time*1000)
  59. print '发起请求到客户端接受首包时间: %.3f ms' %(starttrans_time*1000)
  60. print '总时间为: %.3f ms' %(total_time*1000)
  61. print ''
  62.  
  63. transfer_time = total_time - starttrans_time
  64. #传输时间
  65. serverreq_time = starttrans_time - pretrans_time
  66. #服务器响应时间,包括网络传输时间
  67. if ssl_time == 0 :
  68. if redirect_time == 0 :
  69. clientper_time = pretrans_time - connect_time
  70. #客户端准备发送数据时间
  71. redirect_time = 0
  72. else :
  73. clientper_time = pretrans_time - redirect_time
  74. redirect_time = redirect_time - connect_time
  75. ssl_time = 0
  76. else :
  77. clientper_time = pretrans_time - ssl_time
  78.  
  79. if redirect_time == 0 :
  80. ssl_time = ssl_time - connect_time
  81. redirect_time = 0
  82. else :
  83. ssl_time = ssl_time - redirect_time
  84. redirect_time = redirect_time - connect_time
  85.  
  86. connect_time = connect_time - dns_time
  87.  
  88. print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)
  89. print 'TCP连接消耗时间 : %.3f ms' %(connect_time*1000)
  90. print '跳转消耗时间: %.3f ms' %(redirect_time*1000)
  91. print 'SSL握手消耗时间 : %.3f ms' %(ssl_time*1000)
  92. print '客户端发送请求准备时间: %.3f ms' %(clientper_time*1000)
  93. print '服务器处理时间: %.3f ms' %(serverreq_time*1000)
  94. 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. Java之OutOfMemoryError简单分析

    Java之OutOfMemoryError简单分析 最近编码遇到了Java内存溢出的问题,所以就想顺便总结一下几种导致Java内存溢出的栗子,以及碰到Java内存溢出要如何去解决. Java堆溢出 J ...

  2. 2、HTML基础总结 part-2

    1.表单一 <html> <body> <form> 姓名: <input type="text" name="name&quo ...

  3. PostgreSQL 配置内存参数

    对于任何数据库软件,内存配置项都是很重要的配置项.在 PostgreSQL 主要有以下几个内存配置参数. shared_buffers: integer 类型,设置数据库服务器将使用的共享内存缓冲区数 ...

  4. python安装pattern失败

    做文本分类需要用到pattern.en进行词形还原,安装了一上午都没有成功,mysqlclient安装失败.最后解决办法,pip install --only-binary :all: mysqlcl ...

  5. 逆向中静态分析工具——IDA初学者笔记

    逆向中静态分析工具——IDA初学者笔记 //****************************************************************************** ...

  6. ionic2 使用slides制作滑动效果的类型选择栏

    类似的效果如下图: 1. 生成一个component ionic g component MySlide 2. 在my-slide.html中添加代码: <ion-slides class=&q ...

  7. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  8. mybatis 从数据库查询的信息不完整解决办法

    List<Product> products = productService.getProductListWithPage(productQuery); 今天碰到一个很奇怪的现象,上面的 ...

  9. EasyUI-Calendar

    EasyUI-Calendar 日历篇 Calendar也是页面中经常用到的元素,easyui也为们提供了日历的组件,效果如下图所示: 使用方法如下所示: <div class="ea ...

  10. 全球主要城市经纬度api

    原文发布时间为:2011-06-23 -- 来源于本人的百度文章 [由搬家工具导入] http://www.google.com/ig/cities?country=cn http://www.goo ...