首页 > 编程语言 >python 性能测试之获取app fps

python 性能测试之获取app fps

时间:2023-05-18 11:12:55浏览次数:41  
标签:plt python app float list hights fps time

一、功能描述

  该脚本主要是获取视频/语音通话、语音房、看视频等app的fps

 

二、代码实现

import os,csv
import time
import numpy as np
from matplotlib import pyplot as plt
from subprocess import Popen, PIPE
from check_package import check_package
import math

fps_list=[]
time_list=[]
adress='app'
package_name,activity=check_package(adress)

# 写入表头
def write_head():
    headers = []
    headers.append('time')
    headers.append('init_fps')
    with open('files/fpsinfo.csv','w+',newline='') as f:
        writer = csv.DictWriter(f,fieldnames=headers)
        writer.writeheader()

def dump_layer_stats(str_command):
    L = []
    p = Popen(str_command, shell=True, stdout=PIPE, stderr=PIPE, universal_newlines=True)
    for line in p.stdout:
        if line != '\n':
            ldata1 =(line[:-1].split('\t'))
            ldata=[]
            for i in ldata1:
                ldata.append(int(i))
            if len(ldata)== 1:
                pass
            else:
                if (ldata[1]) >= 9223372036854775807:
                    continue
                elif (ldata[1]) == 0:
                    continue
                L.append((ldata[1]))
                #    p.terminate()
    return L

def get_fps():
   while True:
        str_command = 'adb shell dumpsys SurfaceFlinger --latency  {}/{}#0'.format(package_name,activity)
        end_time = time.time()
        if (end_time-start_time)/60>=total_time:
            break
        L =dump_layer_stats(str_command)
        size = len(L)
        interval = 0
        now = time.strftime('%H:%M:%S',time.localtime())
        time_list.append(now)
        if size > 0:
            interval = L[size - 1] - L[0]
        else:
            # 获取不到返回异常
            return -1
        if interval == 0:
            continue
        fps = 1000000000 * (size - 1) / interval
        fps_list.append(round(fps,2))


        
# 将数据写入csv
def write_report():
    with open('files/fpsinfo.csv','a+',newline='') as f:
        writer = csv.writer(f)
        for i in range(0,len(fps_list)):
            writer.writerow([time_list[i],fps_list[i]])
        print('数据插入成功')

# 绘制折线图
def mapping():
    hights = fps_list
    # 将cpu值转换为浮点类型数据
    hights_float = list(map(float,hights))
    wights = time_list
    total=0
    for hight in hights_float:
        total+=hight
    ave = round(total/len(hights_float),2)
    # 计算cpu最高值和最低值
    sort_hights_float = sorted(hights_float)
    min_hight = round(sort_hights_float[0],2)
    max_hight = round(sort_hights_float[-1],2)
    print('最大值为:%.2f,最小值为%.2f,平均值为%.2f'%(max_hight,min_hight,ave))
    # 根据数据绘制图形
    # 创建自定义图像
    plt.figure(figsize=(11,4),dpi=600)
    # 生成网格,只展示y轴
    plt.grid(axis='y')
    # 绘制折线图
    plt.plot(wights,hights_float,'c-',linewidth=1,label=app_name)
    # 设置坐标轴范围
    plt.xlabel('time(H:Min:S)',fontsize=16)
    plt.ylabel('fps_realtime(%)',fontsize=16)
    plt.title('{} fps'.format(app_name),fontsize=24)
    # 显示label
    plt.legend()
    # 横坐标显示间隔
    # 进行时间列表去重
    wights = list(set(wights))
    if len(wights)<=15:
        pass
    else:
        t = int(len(wights)/15)
        # 显示x轴的刻标,以时间间隔t展示
        plt.xticks(range(0,len(wights),t))
    # 旋转横坐标日期
    plt.gcf().autofmt_xdate()
    time_now = time.strftime('%H:%M:%S',time.localtime())
    save_path = 'pictures/'+'{}_fps_occupation_'.format(app_name)+ time_now
    plt.savefig(save_path)


if __name__ == '__main__':
    total_time = math.ceil(float(input('请输入脚本执行时间(分钟):')))
    start_time = time.time()
    app_name = input('请输入app名称:')
    get_fps()
    write_report()
    mapping()
    

三、结果表现

 

 

 

标签:plt,python,app,float,list,hights,fps,time
From: https://www.cnblogs.com/lxmtx/p/17411353.html

相关文章

  • python基础学习-发送邮件
    importsmtplibfromemail.headerimportHeaderfromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMEText"""发送普通邮件"""#创建邮件主体对象email=MIMEMultipart()#设置发件人、收件人和主题email['From']=&#......
  • Python程序与用户交互&基本运算符
    一、用户交互1.输入input:关键字:input()-输入在python3中input关键字会等待用户的输入,用户输入任何内容,都存成字符串类型,然后赋值给等号左边的变量名在python2中存在一个raw_input功能与python3中的input功能一模一样在python2中还存在一个input功能,需要用户输入一个明......
  • web自动化测试入门篇04——selenium+python基础方法封装
      ......
  • python - 单例模式
    Python中的单例单例模式(Singletonpattern),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。Python中实现单例的几种方法:使用模块使用函数装饰器使用类装饰器......
  • 【Python】数据分析与可视化实践:收支日统计数据可视化的实现
    Python数据分析与可视化实践:收支日统计数据可视化的实现Author:萌狼蓝天Date:2023-5-7数据读入与基本处理上图是原始数据的一部分,存放于excel中,首先使用pd读入数据。读入数据后,删除不是收入,也不是支出的行。#读取数据datas=pd.read_excel("账单.xlsx",sheet_name=0)#......
  • 什么是 Angular 应用的 browser Application bundles 和 server Application bundle
    我们在使用yarnrun启动Angular应用时,注意到browserApplication和serverApplicationbundle的生成:在Angular应用程序中,应用程序包含两个主要的部分:客户端应用程序和服务器应用程序。客户端应用程序是在Web浏览器中运行的Angular应用程序,而服务器应用程序是在服......
  • Python - 仅限关键字参数 & 仅限位置参数
    仅限位置参数(/)#Python3.8新增defdemo1(a,b,/):returna,bif__name__=='__main__':demo1(1,2)#rightdemo1(1,b=2)#error#demo1(1,b=2)报错:'''Traceback(mostrecentcalllast):File"E:\PyProject\pytestD......
  • - python=3.7 -> libgcc-ng[version='>=11.2.0'] -> __glibc[version='>=2.17
     001、利用conda安装软件时遇到如下问题:Outputinformat:Requestedpackage->AvailableversionsThefollowingspecificationswerefoundtobeincompatiblewithyoursystem:-feature:/linux-64::__glibc==2.17=0-python=3.7->libgcc-ng[version='>=1......
  • 龙芯云平台python开发避坑指北
    龙芯云平台python开发配置避坑指北背景:网络尖峰训练营龙芯平台开发,准备使用python实现,在拿到云服务器第一时间就准备去配环境,踩了很多坑,在此记录一下。平台下python包不全部分pypi中的python包尚不支持Loongarch架构,loongson平台python包存在一些缺失比如我们此次准备用来开发......
  • Python 连接 MySQL 数据库
    在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为Pandasdataframe对象进行进一步处理。而MySQL数据库是最常用的关系型数据库之一,因此在Python中如何连接MySQL数据库并查询数据成为了一个重要的问题。本文将介绍两种方法来连接MySQL数据库,并将......