这个方法假设要执行20000次,我会检查一切正常,直到调用此代码。
我认为性能问题在于StringBuilder;我能说的是,当循环在275~元素中时它会阻塞并且它会继续但非常慢(在创建对象时可能是儿子除外)。一旦我删除了对这个方法的调用,一切运行得更快并完成循环;所以问题出在这个方法中。谁能开导我?
我尝试重用StringBuilder但它无法正常工作。
private void sendTrafficDataToServer(InetAddress srcIp, InetAddress destIp, String protocolSource,
String protocolDest, int length, long epochTime, String sourceMac,
String destMac, String network, String _interface) throws MalformedURLException, IOException {
StringBuilder subtree = new StringBuilder(network);
//subtree.append(".").append(URLEncoder.encode(_interface, "UTF-8"));
//=====================================================================
// package protocol host source
String fqdnSource = srcIp.getCanonicalHostName().replaceAll("[.]", "+");
subtree.append(".").append(URLEncoder.encode(fqdnSource, "UTF-8"));
subtree.append(".").append(URLEncoder.encode(protocolSource, "UTF-8"));
StringBuilder message = new StringBuilder();
message.append("c=").append("packethostsrc").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
logger.info("Message sent: {}", message.toString());
logger.debug("Counter: {}", ++counter);
//=====================================================================
// package protocol host dest
String fqdnDest = destIp.getCanonicalHostName().replaceAll("[.]", "+");
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(fqdnDest, "UTF-8"));
subtree.append(".").append(URLEncoder.encode(protocolDest, "UTF-8"));
message.setLength(0);
message.append("c=").append("packethostdest").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
//=====================================================================
// package protocol source
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(protocolSource, "UTF-8"));
message.setLength(0);
message.append("c=").append("packetprotocolsrc").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
//=====================================================================
// package protocol dest
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(protocolDest, "UTF-8"));
message.setLength(0);
message.append("c=").append("packetprotocoldest").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
//=====================================================================
// package conversation
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(fqdnSource, "UTF-8"));
subtree.append(".").append(URLEncoder.encode(fqdnDest, "UTF-8"));
message.setLength(0);
message.append("c=").append("packetconversation").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
//=====================================================================
// package network card source
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(sourceMac, "UTF-8"));
message.setLength(0);
message.append("c=").append("packetnetworkcardsrc").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
//=====================================================================
// package network card dest
subtree = subtree.delete(network.length(), subtree.length());
subtree.append(".").append(URLEncoder.encode(destMac, "UTF-8"));
message.setLength(0);
message.append("c=").append("packetnetworkcarddest").append("&");
message.append("s=").append(subtree).append("&");
message.append("t=").append(epochTime).append("&");
message.append("v=").append(length);
// send data to server
//ServerDataSource.insertData(message.toString(), hostname);
}
答案 0 :(得分:4)
我非常怀疑StringBuilder
存在问题,因为它随处可见。使用分析器(您可能在IDE中内置了一个分析器)可以更好地了解发生的情况。
如果您对分析器没有任何乐趣,那么在整个方法中分散时间记录代码并平均大量运行的时间,记录方法的每个部分的每个步骤的平均值和最大值。这应该可以快速识别实际导致问题的部分。
说过看起来你甚至不需要StringBuilder
,因为你可能会在某处隐藏某种OutputStream
。只需在构建它们时将消息发送到Stream,并且您从不需要构建器。
答案 1 :(得分:0)
我修复了这个问题,它是具有性能问题的replace()方法。
String fqdnSource = StringUtils.replace(srcIp.getCanonicalHostName(),“。”,“+”);
我正在使用StringUtils.replace()。
此外,getCanonicalHostName()会添加一些性能问题,但如果我想要IP的名称解析,则必须这样做,在这种情况下,性能并不是那么糟糕。