栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

W3-1:效能分析工具

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

W3-1:效能分析工具

系列文章目录

W2-1:Maven引入外部依赖——以GSON的使用为例

W2-2:在Maven项目中进行Junit5单元测试

W3-1:效能分析工具


- 环境:IntelliJ IDEA Ultimate 2021.3 / PyCharm-Professional-2021.3.2 - 语言:Java / Python

文章目录

系列文章目录前言一、Java

1.1 安装IntelliJ IDEA专业版1.2 通过计时量化修改程序前后的性能变化 二、Python

2.1 安装PyCharm专业版2.2 性能分析 总结


前言

火焰图(FlameGraph)的使用


一、Java 1.1 安装IntelliJ IDEA专业版

社区版有些功能用不了,所以卸载了之前的社区版,重装了一个专业版。

intellij idea ultimate的安装教程

1.2 通过计时量化修改程序前后的性能变化

新建一个PA类,写入以下代码并运行程序:

import java.time.Duration;
import java.time.Instant;

public class PA {
    public static int getSum(int limit){
        Integer sum = 0;
        for(int i = 0;i < limit; i++){
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) {
        Instant start = Instant.now();
        getSum(80000);
        Instant end = Instant.now();
        System.out.println(Duration.between(start,end).toMillis());
    }
}

运行结果如下:

使用Profile分析工具分析程序:
得到火焰图:

从火焰图中得知,Integer.valueOf的调用使得程序的执行效率不高。

因此,修改PA类中的Integer为int:

public static int getSum(int limit){
        //  Integer sum = 0;
        int sum = 0;
        for(int i = 0;i < limit; i++){
            sum += i;
        }
        return sum;
    }

修改后的运行结果:

从修改后的运行结果来看,代码的执行效率明显提高了许多。

这大概是因为int是Java的基本数据类型之一,可以直接存储数据,但Integer是int的包装类,是对象的引用,Integer变量必须实例化后才能使用,这对程序执行效率应该是有比较大的影响。

Java基础之int和Integer有什么区别

二、Python 2.1 安装PyCharm专业版 2.2 性能分析

编写一个函数模拟grep功能,即在一个文件中搜索所有符合给定模式的行:

import re
import time


def grep(pattern, file):
    with open(file, 'r') as f:
        for idx, line in enumerate(f.readlines()):
            pattern = re.compile(pattern)
            match = pattern.search(line)
            if match is not None:
                print("{}: {}".format(idx, line), end="")


if __name__ == '__main__':
    start = time.time()
    for i in range(50000):
        grep('^import', 'main.py')
    print("total time is: {}".format(time.time() - start))

运行结果如下:

进行效率分析:

效率分析结果:

可以看到compile调用了95万次,运行时间占比也比较高,但是实际上这是没有必要的,因为将正则表达式转化为对象的代码只需要执行一次就够了,所以接下来修改grep函数中的代码,把不必要重复执行的代码提到遍历文件内容的循环外:

def grep(pattern, file):
    with open(file, 'r') as f:
        pattern = re.compile(pattern)
        for idx, line in enumerate(f.readlines()):
            # pattern = re.compile(pattern)
            match = pattern.search(line)
            if match is not None:
                print("{}: {}".format(idx, line), end="")

代码修改后的运行结果:

从修改后的运行结果来看,代码的执行效率也明显提高了许多。

对Python项目进行效率分析的方式还包括命令行、利用PyCharm插件等,但因为我还没有做成功,这里就先不写了,记一个命令行的命令:

python3 -m cProfile main.py

总结 本文简单记录了在Java、Python语言环境下的一些效能分析工具的使用方法。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/760100.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号