在Gradle 插件中统计并打印 Task 任务耗时

2024-06-12 10:08

本文主要是介绍在Gradle 插件中统计并打印 Task 任务耗时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Gradle 插件中统计并打印 Task 任务耗时


我们在使用 Gradle 构建任务时,有时想统计每个任务的耗时情况,以此发现每个任务的运行时间,以及是否存在可优化空间。

使用 Listener 进行监听

Gradle 提供了很多构建生命周期钩子函数。

1. 我们可以用 TaskExecutionListener 来监听整个构建过程中 task 的执行:
public interface TaskExecutionListener {void beforeExecute(Task task);void afterExecute(Task task, TaskState taskState);
}

我们可以在每个 task 执行前先收集信息,记录该 task 执行的开始时间等,在 task 执行完成后,记录其执行结束时间,这样就能统计出该 task 的执行时长。

2. 使用 BuildListener 来监听整个构建是否完成,在构建完成后,输出所有执行过的 task 信息,以及每个 task 的执行时长:
public interface BuildListener {void buildStarted(Gradle gradle);void settingsEvaluated(Settings settings);void projectsLoaded(Gradle gradle);void projectsEvaluated(Gradle gradle);void buildFinished(BuildResult buildResult);
}

在 buildFinished 方法中,监听构建完成以及成功与否,并打印我们采集的耗时信息。

代码实例

BuildTimeListener 是我自定义的一个监听任务耗时的工具类:

class BuildTimeListener implements TaskExecutionListener, BuildListener {//用来记录 task 的执行时长信息Map<String, TaskTimeInfo> taskTimeMap = new HashMap<>()@Overridevoid buildStarted(Gradle gradle) {}@Overridevoid settingsEvaluated(Settings settings) {}@Overridevoid projectsLoaded(Gradle gradle) {}@Overridevoid projectsEvaluated(Gradle gradle) {}@Overridevoid buildFinished(BuildResult buildResult) {println "-----------------GouAPM----------------------"println "---------------------------------------"println "build finished, now println all task execution time:"taskTimeMap.each{ k, v -> println "${k}:[${v.total}ms]" }println "---------------------------------------"println "---------------------------------------"}@Overridevoid beforeExecute(Task task) {//task开始执行之前搜集task的信息TaskTimeInfo timeInfo = new TaskTimeInfo()timeInfo.start = System.currentTimeMillis()timeInfo.path = task.getPath()taskTimeMap.put(task.getPath(), timeInfo)}@Overridevoid afterExecute(Task task, TaskState taskState) {//task执行完之后,记录结束时的时间TaskTimeInfo timeInfo = taskTimeMap.get(task.getPath())timeInfo.end = System.currentTimeMillis()//计算该 task 的执行时长timeInfo.total = timeInfo.end - timeInfo.start}class TaskTimeInfo {//task执行总时长long totalString pathlong startlong end}
}

我们在自定义插件中进行注册:

class MyPlugin implements Plugin<Project>{private Project mProject;@Overridevoid apply(Project project) {mProject = project;//注册监听,以统计任务的耗时project.gradle.addListener(new BuildTimeListener())}
}

**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》

这篇关于在Gradle 插件中统计并打印 Task 任务耗时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053912

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3