gpt4 book ai didi

使用 StringBuilder 的 Java CLI 应用程序性能

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:40:42 25 4
gpt4 key购买 nike

一般:
我正在编写一个套接字客户端,它始终从某个服务器端(远程服务器端)接收“市场”数据/报价(永无止境的循环)。
我将数据分成 block 以便我可以使用它。
每个 block 包含大约 200 个字符,需要转换为数组。
一个 block 被划分后,它被解析成一个列表(这里没有问题)。

问题:
运行 10 分钟后 CPU 使用率达到 40%。
我已经设法找出问题所在。
每个 block 都需要转换成 json。
所以我现在给你解决问题的实际代码。
此代码每 300-400 毫秒执行一次。
跳过此代码将使整个系统的 CPU 使用率保持在 1%-2%。

注意:
我已阅读此主题,但我没有看到任何解决方案。
Is it better to reuse a StringBuilder in a loop?

代码:

private static StringBuffer jsonVal = new StringBuffer();

public static String toJson(List<QuotesData> quotesData) {
// Empty variable
jsonVal.delete(0, jsonVal.length());
jsonVal.append("{");
synchronized (quotesData) {
for (QuotesData quote : quotesData) {

jsonVal.append("\"").append(quote.getSymbol()).append("\":[{");
jsonVal.append("\"ask\":\"").append(quote.getAsk()).append(
"\",");
jsonVal.append("\"bid\":\"").append(quote.getBid()).append(
"\",");
jsonVal.append("\"time\":\"").append(quote.getDateTime())
.append("\"}],");

}
jsonVal.append("}");
String returnString = jsonVal.toString();
return returnString.toString().replace("}],}", "}]}");
}
}

最佳答案

首先,我建议使用 JProfiler 或 JConsole,它们都包含在 JDK6 中,以准确查明性能受到影响的位置。

在不知道 CPU 使用情况的情况下,我会避免synchronized。我怀疑 append 是问题所在。通过摆脱 static 本地 jsonVal 来清理它。

public static String toJson(final List<QuotesData> quotesData) {
final List<QuotesData> theData = new ArrayList<QuotesData>(quotesData);
StringBuffer jsonVal = new StringBuffer();
jsonVal.append("{");
for (QuotesData quote : quotesData) {
jsonVal.append("\"").append(quote.getSymbol()).append("\":[{");
jsonVal.append("\"ask\":\"").append(quote.getAsk()).append(
"\",");
jsonVal.append("\"bid\":\"").append(quote.getBid()).append(
"\",");
jsonVal.append("\"time\":\"").append(quote.getDateTime())
.append("\"}],");

}
jsonVal.append("}");
String returnString = jsonVal.toString();
return returnString.toString().replace("}],}", "}]}");
}

考虑使用像 Gson 这样的 JSON 库.代码变得简单多了。如果需要,您可以调整输出:

private static final Gson gson = new Gson();
public static String toJson(final List<QuotesData> quotesData) {
return gson.toJson(new ArrayList<QuoteData>(quotesData));
}

关于使用 StringBuilder 的 Java CLI 应用程序性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409634/

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