gpt4 book ai didi

java - 衡量 Java 应用程序的性能

转载 作者:行者123 更新时间:2023-12-02 12:47:22 26 4
gpt4 key购买 nike

我正在开发一个至少有 15 年历史的应用程序。我正在致力于提高具有大约 10K 行代码的特定流程的性能。此流程涉及向外部系统发送有关 JMS 主题的信息。我在创建和缓存 session 的方式中发现了一些问题,解决这些问题后我已经能够节省一些时间。现在我想进一步提高性能。为此,我需要检查一整行 10K 行代码并确定在哪些方面可以节省时间。该流程分为三个部分 -第一部分创建批量的单个请求并执行一些操作(大小为 15 的线程池)第二部分从第一部分获取输入并进行更多处理(10 个线程的线程池)第三部分从第二部分获取输入并进行更多处理(10 个线程的线程池)

我无法增加线程数量,因为资源有限,而且这不是应用程序中的唯一流程(我的配置是 - 2 个套接字,每个套接字 12 个核心,每个核心 2 个线程)。另外,我没有太多的自由来玩这个,因为这些第一、第二和第三部分也在其他地方使用。

为了确定执行时间,我创建了一个带有一个线程局部变量的类,其中包含日志记录语句,下面是代码:

public class ExecutionTraceManager {

private static Category cat = Category.getInstance(ExecutionTraceManager.class.getCanonicalName());

private static final ThreadLocal<Tracer> traceContainer = new ThreadLocal<Tracer>() {
@Override
protected Tracer initialValue() {
return new ExecutionTraceManager().new Tracer();
}
};

public static void addTrace(String trace) {
traceContainer.get().addTrace(trace);
}

public static void printTrace(){
ArrayList<String> trace = traceContainer.get().trace;
StringBuffer buffer = new StringBuffer();
for(String current : trace){
buffer.append(current).append("\n");
}

cat.info(buffer);
}

public class Tracer {
ArrayList<String> trace = new ArrayList<String>();
long startTime = System.nanoTime();
boolean init = false;
public void addTrace(String traceMessage) {
if(!init){
startTime = System.nanoTime();
init = true;
}
StringBuffer buffer = new StringBuffer("Time taken till [ ")
.append(traceMessage)
.append(" ] is : "
+ ((System.nanoTime() - startTime) / 1000000.0));
trace.add(buffer.toString());
}
}

在我的代码中,我只调用 ExecutionTraceManager.addTrace,一旦线程完成任务,我调用 printTrace 并重置本地线程,以便下次该线程处理下一个请求时,它会看到空跟踪列表。

这对我来说没问题,但我想了解还有哪些其他方法可以识别哪些代码需要时间(因为我有大约 10 行代码)。专业人士采取什么方法来处理此类问题。

最佳答案

使用指标收集库

使用指标收集库,如 Metrics在我看来,这是比自己滚动更好的解决方案,因为它处理采样并具有各种度量实现(计时器、直方图等)。本质上你添加这样的代码:

private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));

// in the method
try (Timer.Context ctx = responses.time()) {
// run operations
}
}

这会生成一个执行时间直方图,您可以查询各个百分位数(99、95、90 等)。它还具有的优点是您可以在生产系统中运行它并收集指标。

与探查器相比,我更喜欢这种方法,因为探查器往往会产生非常密集的输出,很难映射到您的应用程序的功能。应用程序级别的计时指标产生更容易理解和采取行动的指标。

使用分析器

您还可以使用 Mission Control 中的分析器的 Flight Recorder,尽管在生产环境中运行它需要付费许可证。正如其他答案中提到的,还有其他工具(例如 VisualVM)可以使用分析器。

关于java - 衡量 Java 应用程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com