在做性能测试平台的优化过程中,由于启动任务相对其他测试任务比较频繁,而目前30次两个包的交叉对比(30次)测试需要耗时30分钟整,因此打算优先对测试流程做一次优化,将测试时间消耗降低到20分钟。

由于一开始估计乐观,认为启动时间,一台设备理论上启动顶多1s,1*2*30也就60s,加上其他开销,5分钟都够了,能减少到20分钟应该小半天就能做完了。

于是就来到了第一步:

1.review代码流程

(1)把启动流程里相关的sleep全部review一遍

确实有一点效果,因为有一部分sleep在启动任务执行阶段,60倍杠杆放大后很可怕,因此去掉部分sleep,居然就减少到了23分钟了。

第二步一时想不出了,方法耦合嵌套相当多,而且适配多个版本的产品,迁一发动全身,第二步想到的就是将可疑方法监控起来

2.将可疑方法的耗时监控起来

为了方便监控,增加了两个个装饰器来统计耗时

def costs(fn):
def _wrapper(*args, **kwargs):
start = time.time()
fn(*args, **kwargs)
print "%s 函数cost %s 秒" % (fn.__name__, time.time() - start) return _wrapper def costs_with_info(info):
def _wrapper(fn):
print "info: " + info
return costs(fn)
return _wrapper

当方法需要监控时,则加入@costs或者@costs_with_info("some infomation")

    @costs
def configureQuickStart(self, pkg_name):
if self.config.allow_quick_start == "":
self.logger.info("Disable quick start: %s" % pkg_name)
self.disableQuickStartSnapShot(pkg_name)
else:
self.logger.info("Quick start is enabled: %s" % pkg_name)

推荐大家不要用这样的方法,真心耗时耗力,而且效果差。花了半天优化了一分钟。

于是想到了Android里的traceview,traceview有方法能拿到整个调用栈的性能消耗,包括耗时,python应该也有这样的方法才对,然后我找到了cProfile,于是便愉快地进入了第三步

3.使用cProfile进行分析

(1)直接将入口加入监控,输出result.prof文件,并在log区打印出tottime(不包含子方法的耗时统计)

import cProfile
import pstats
cProfile.run('main()', filename='result.prof', sort="tottime")
p = pstats.Stats('result.prof')
p.sort_stats('time').print_stats()

log区打印出的日志如下

一部分是系统方法,一部分是自己的方法,不是很直观,于是又找到了另一个神器graphviz。

首先需要安装:

sudo apt-get install graphviz

然后下载Gprof2Dot,接着运行

python gprof2dot.py -f pstats result.out | dot -Tpng -o result.png

终于我得到了一张启动测试的方法耗时统计图

局部展示如下:

这样就可以很清晰看到各个函数具体消耗的时间了,但令我震惊的是,启动测试中,30分钟里居然有95.29%的时间是在sleep!但是没关系,因为我知道是哪个方法开始引入的sleep,并且可以知道哪些是可以优化的。

性能测试平台效率优化的一次经验(python版)的更多相关文章

  1. nGrinder性能测试平台搭建(LVS压力测试)

    1. nGrinder是什么 nGrinder是一个免费的.开放源代码的Web性能测试平台.运行在应用中间件服务器中运行.它由一个控制端和多个代理端组成.通过控制端(浏览器访问)建立测试场景,然后通过 ...

  2. php程序效率优化的一些策略小结

    php程序效率优化的一些策略小结   1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他 ...

  3. php性能效率优化

    [size=5][color=Red]php性能效率优化[/color][/size] 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很 ...

  4. C#效率优化(1)-- 使用泛型时避免装箱

    本想接着上一篇详解泛型接着写一篇使用泛型时需要注意的一个性能问题,但是后来想着不如将之前的详解XX系列更正为现在的效率优化XX系列,记录在工作时遇到的一些性能优化的经验和技巧,如果有什么不足,还请大家 ...

  5. Unity3d代码及效率优化总结

    1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU. 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unli ...

  6. php效率优化

    php效率优化 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略:1. ...

  7. 开发效率优化之Git分布式版本控制系统(一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...

  8. jquery选择器效率优化问题

    jquery选择器效率优化问题   jquery选择器固然强大,但是使用不当回导致效率问题: 1.要养成将jQuery对象缓存进变量的习惯 //不好的写法 $('#btn').bind("c ...

  9. Jmeter+jenkins接口性能测试平台实践整理(一)

    最近两周在研究jmeter+Jenkin的性能测试平台测试dubbo接口,分别尝试使用maven,ant和Shell进行构建,jmeter相关设置略. 一.Jmeter+jenkins+Shell+t ...

随机推荐

  1. 安装Hadoop及Spark(Ubuntu 16.04)

    安装Hadoop及Spark(Ubuntu 16.04) 安装JDK 下载jdk(以jdk-8u91-linux-x64.tar.gz为例) 新建文件夹 sudo mkdir /usr/lib/jvm ...

  2. 开源OSS.Social项目进阶介绍和使用展示

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,没有全局介绍,没有详细讲解,也没有如何使用,很多朋友估计匆匆一瞥就忙着抢开工红包去了.本着不能马虎的态度,这 ...

  3. ArcGIS Desktop 10.5 安装实录

    ArcGIS Desktop 10.5 安装实录 by 李远祥 几天前已经收到ArcGIS10.5的最终版安装介质,终于有时间可以安装一下.尽管ArcGIS10.5系列中,桌面软件不是主角,但笔者还是 ...

  4. 扩展jquery插件的方法

    方法1.通过一个简单的.jQuery函数prototype属性的别名(jquery.fn进行扩展) jQuery.fn.newStuff = function(){ console.log(" ...

  5. swift 2.0 与 OC 相比较,标签栏和导航栏书写的差别

    下面是swift书写的时候的两个方法,其实这里不是教大家怎么样写的这个问题,我是想通过这两个不同语言的进行的一个比较,向大家找他们之间“想法”上的一些相同点,这样子我们学习swift的时候,就可以更加 ...

  6. IE兼容问题及处理

    1.在IE6下,子元素能撑开父级设置好的宽高 2.IE6下的最小高度,高度小于19px的元素在IE6下会被当做19px来处理 解决办法:overflow:hidden; 3.IE6下 不支持1px的点 ...

  7. DLL 导出类

    MyMathFun.h #pragma once // #ifdef DLLCLASS_API // #define DLLCLASS_API _declspec(dllimport) // #els ...

  8. Ubuntu下搭建FTP服务器

    Ubuntu下搭建FTP服务器 我装的服务器系统是Ubuntu 12.04 LTS,FTP软件当然是选择大名鼎鼎的vsftpd(very secure FTP daemon), 用系统自带的FTP还好 ...

  9. Codeforce 水题报告(2)

    又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...

  10. 连连看的原生JS实现

    那天闲来无事,便想找个小游戏来打发时间,后来便找到了连连看, 玩了一会儿感觉无聊,想到各位高手用JS做的各种小游戏,便想自己也来做一个,于是便有了这几天的成果. 代码是用 原生JS 实现的,只是用来学 ...