作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一般:
我正在编写一个套接字客户端,它始终从某个服务器端(远程服务器端)接收“市场”数据/报价(永无止境的循环)。
我将数据分成 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/
我是一名优秀的程序员,十分优秀!