初探BTrace脚本 - 看看持续集成哪个环节比较慢

本文详细介绍了如何使用BTrace工具来监控并优化持续集成环境中的单元测试执行效率,通过分析测试方法的执行时间,定位并解决性能瓶颈。文中包括下载BTrace工具、编写监控脚本、在Maven项目中启用JavaAgent模式等关键步骤,并提供了实际代码示例。

需求

    这几天发现持续集成环境的执行效率比较低,所以想到用BTrace来看看是什么原因造成的,哪些环节比较慢。

 

    持续集成环境的服务端是hudson,里面跑的主要是各个应用的单元测试,由maven管理执行。

 

获取资源

    从BTrace官方下载它的工具包 http://kenai.com/projects/btrace/downloads/directory/releases

    我这边下载的是 release-1.2 目录下的1.2版本。

 

    简单的使用说明,可以参考用户手册:http://kenai.com/projects/btrace/pages/UserGuide

 

hudson中运行的是

    hudson中跑的是单元测试代码内容类似如下:

 

package com.hugehard......test;

......
public class SomeBizServiceTest extends JTester {

......

    @Test
    public void testXX() {
        ...
    }

    @Test
    public void testOO() {
        ...
    }
    ...
}
 

    所以我们需要监控的是单元测试类,这些类处于名称包含hugehard的包路径中。

    我们希望知道testXX, testOO这样的方法的执行时间。

编写监控脚本

 

package hudson;

import static com.sun.btrace.BTraceUtils.print;
import static com.sun.btrace.BTraceUtils.println;

import com.sun.btrace.BTraceUtils.Time;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.TLS;

/**
 * BtraceHudson.java
 * 
 * @author caesar 2011-7-30 AM11:23:17
 */
@BTrace
public class BtraceHudson {

    @TLS
    static long starttime = 0;

    @OnMethod(clazz = "/.*hugehard.*/", method = "/test.*/")
    public static void startMethod(@ProbeClassName String probeClass, 
                                                 @ProbeMethodName String probeMethodName) {
        print("probeClass: ");
        print(probeClass);
        print("  ");
        print("probeMethodName: ");
        print(probeMethodName);
        print("  start time: ");
        starttime = Time.nanos();
        println(starttime);
    }

    @OnMethod(clazz = "/.*hugehard.*/", method = "/test.*/",  
                        location = @Location(Kind.RETURN))
    public static void collectTestMethodExecutionEnd(@ProbeClassName String probeClass,
                                                     @ProbeMethodName String probeMethodName) {
        print("probeClass: ");
        print(probeClass);
        print("  ");
        print("probeMethodName: ");
        print(probeMethodName);
        print("  execute time: ");
        long executeTime = Time.nanos() - starttime;
        println(executeTime);
    }
}

 

    上面这段代码是参考博文 http://jarit.iteye.com/blog/1010908 中的内容,所以这里就不赘述它的原理了。

 

maven不能btrace?

    我在自己的工程根目录下,执行“mvn clean test”。

    通过“jps -l”拿到maven的PID。

    而后通过“btrace <PID> BtraceHudson.java”,期望能够获得每个测试方法的执行时间。

    但是没有获得任何的信息。

 

 

    后来把标注 @OnMethod 中的clazz和method限定都放到最宽泛的程度,才发现,里面拿到的方法执行信息,根本与单元测试类毫无关联,而都是来自maven的代码类。

    这时候想起来,maven在执行每个工程的单元测试的时候,它会创建独立的线程去执行它们pom.xml中定义的内容。

    所以我这里拿到PID,仅仅是maven自身的线程信息,根本拿不到具体工程的线程中的方法执行信息。

 

javaagent模式

    根目录的pom.xml中我们定义了jmockit的javaagent,用于执行test阶段的单元测试mock代码之用。配置如下:

 

<project>
    <dependencies>
          ......
    </dependencies>

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.4.2</version>
          <configuration>
            <argLine>-javaagent:"${settings.localRepository}/com/hugehard/external/test.jmockit/0.997/test.jmockit-0.997.jar"</argLine>
            <junitArtifactName>com.alibaba.external:test.junit</junitArtifactName>
            <testNGArtifactName>com.alibaba.external:test.testng.jdk15</testNGArtifactName>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>test</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
</project>
 

 

    这让我想起来,btrace也是有agent模式的,可以让它和应用一起启动。

    这样每次maven创建新线程来执行单元测试的时候,会否也让btrace一起启动了呢?

 

    参考官方文档,修改argLine配置如下:

<argLine>-javaagent:"${settings.localRepository}/com/hugehard/external/test.jmockit/0.997/test.jmockit-0.997.jar" -javaagent:/tmp/hudson-optimize/credit-shared-1/btrace-agent.jar=script=/tmp/hudson-optimize/BtraceHudson.class,scriptOutputFile=/tmp/hudson-optimize/btrace.${pom.artifactId}</argLine>
 

    这里需要说明一下:

1、javaagent模式下,需要预编译btrace类

(详细请参考 http://kenai.com/projects/btrace/pages/UserGuide#precompile

 

  所以我们需要用如下指令先编译咱们的BtraceHudson.java

 

/work/ide/btrace/btrace-bin/bin/btracec -cp . BtraceHudson.java
 

而后会得到编译好的类 BtraceHudson.class。

 

2、javaagent中,请确保给出的btrace-agent.jar所在的目录中也包括了btrace-boot.jar, btrace-client.jar这两个包。

 

3、我们可以在scriptOutputFile中指定btrace的输出结果重定向到我们希望拿到报告的位置。

 

4、另外,这里使用的${pom.artifactId} 是为了每个pom.xml对应的工程在执行单元测试的时候,它们所生成的btrace报告不会互相覆盖。

 

接着像我们往常一样,执行“mvn clean test”指令,就能在咱们指定的目录中查看btrace报告,而后对它进行分析,找出执行效率低下的单元测试了。

 

== 全文完 ==

### 项目概述 screenshot-to-code 是一个基于人工智能的开源项目,旨在将屏幕截图、原型设计或 Figma 设计快速转换为干净、功能性的前端代码。此工具能够识别设计中的视觉元素,并将其转换为 HTML、CSS、JavaScript 代码,支持如 React、Vue 和 Tailwind CSS 等现代技术栈。它为开发者和设计师提供了一种高效的解决方案,以减少从设计到实现的转换时间[^4]。 ### 技术实现 该项目依赖于先进的人工智能模型,例如 Claude、Sonnet 3.5 和 GPT-4,这些模型能够理解设计截图并生成相应的代码。通过深度学习和图像识别技术,screenshot-to-code 可以准确地识别设计中的各个组件,并将其映射到相应的前端代码结构中[^4]。 ### 使用步骤 要使用 screenshot-to-code,首先需要确保本地开发环境已经安装了必要的软件,例如 Node.js。接着按照以下步骤操作: 1. **克隆项目**: ```bash git clone https://github.com/abi/screenshot-to-code.git cd screenshot-to-code ``` 2. **安装依赖**: ```bash npm install # 或者使用 yarn yarn ``` 3. **运行应用**: ```bash npm start # 或者 yarn start ``` 安装完成后,应用程序会进入监听状态,此时可以上传截图进行转换。 ### 功能特性 - **多技术栈支持**:支持生成 HTML、CSS、JavaScript 代码,并兼容 React、Vue 和 Tailwind CSS 等现代前端框架。 - **易于上手**:操作简单,无需额外学习即可快速使用[^3]。 - **提升设计效率**:设计师可以直接通过截图快速获取初步的网页代码基础,加速原型到实施的速度。 - **促进团队协作**:开发团队可以利用此工具快速理解设计意图,减少沟通成本。 ### 应用场景 - **设计到实现的转换**:对于设计师而言,可以直接将设计稿转换为可执行的代码,加速开发流程。 - **学习资源**:对于前端学习者,提供了一个实践平台来理解代码结构如何对应视觉设计。 - **团队协作工具**:帮助团队成员更好地理解设计需求,减少误解和沟通成本。 ### 典型生态集成 screenshot-to-code 可以与前端框架如 React、Vue 以及 Tailwind CSS 紧密结合,作为设计图转码的辅助工具。此外,潜在的扩展可以包括与 Figma 等设计工具的集成,进一步自动化设计到编码的工作流。 ### 部署与维护 项目可以通过 Docker 部署,具体步骤可以参考项目仓库中的 README 文件。由于项目细节可能随时间更新,建议用户定期查看官方文档以获取最新的配置信息和最佳实践[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值