繁体   English   中英

StringBuilder JAVA的性能问题

[英]Performance issue with StringBuilder JAVA

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

我非常怀疑StringBuilder存在问题,因为在任何地方它都在不断大量使用。 使用探查器(您的IDE中可能内置了探查器)可以更好地了解正在发生的事情。

如果您对Profiler感到不满意,则将时间记录代码分散到整个方法中,并在大量运行中平均时间,并在方法的每个步骤的每个步骤中记录平均值和最大值。 那应该很快地确定真正导致问题的部分。

话虽如此,您似乎甚至不需要在这里使用StringBuilder ,因为您大概在某处隐藏了某种OutputStream 只需在构建消息时将其发送到Stream即可,而您根本不需要构建器。

我解决了这个问题,它是带有性能问题的replace()方法。

字符串fqdnSource = StringUtils.replace(srcIp.getCanonicalHostName(),“。”,“ +”);

我改用StringUtils.replace()。

另外getCanonicalHostName()添加了一些性能问题,但是如果我想要IP的名称解析,则很有必要,在这种情况下,性能还不错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM