StringBuilder JAVA的性能问题

时间:2014-01-04 01:09:53

标签: java string performance stringbuilder

这个方法假设要执行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);
}

2 个答案:

答案 0 :(得分:4)

我非常怀疑StringBuilder存在问题,因为它随处可见。使用分析器(您可能在IDE中内置了一个分析器)可以更好地了解发生的情况。

如果您对分析器没有任何乐趣,那么在整个方法中分散时间记录代码并平均大量运行的时间,记录方法的每个部分的每个步骤的平均值和最大值。这应该可以快速识别实际导致问题的部分。

说过看起来你甚至不需要StringBuilder,因为你可能会在某处隐藏某种OutputStream。只需在构建它们时将消息发送到Stream,并且您从不需要构建器。

答案 1 :(得分:0)

我修复了这个问题,它是具有性能问题的replace()方法。

String fqdnSource = StringUtils.replace(srcIp.getCanonicalHostName(),“。”,“+”);

我正在使用StringUtils.replace()。

此外,getCanonicalHostName()会添加一些性能问题,但如果我想要IP的名称解析,则必须这样做,在这种情况下,性能并不是那么糟糕。