关于java分割和拼接执行效率的测试

2017-04-03 22:09:48   作者:MangoCool   来源:MangoCool

最近的storm项目中,遇到一个java执行效率的问题,逻辑虽然简单,但经过优化,却提升不少,看来以后不得不花更多的时间关注效率问题了,尤其是实时处理场景。

先下一番结论:

1、java中subString、split、stringTokenizer三种截取字符串方法的性能比较

    StringTokenizer在截取字符串中效率最高,不论数据量大小,几乎持平。substring则要次之,数据量增加耗时也要随之增加。split则是表现最差劲的。

    简单来说:stringTokenizer > subString > split

    测试文章:http://blog.csdn.net/songylwq/article/details/9016609

2、java中5种字符串拼接方式性能比较

    用+的方式效率最差,concat由于是内部机制实现,比+的方式好了不少。Join 和 StringBuffer,相差不大,Join方式要快些。StringBuilder的速度最快,但其有线程安全的问题。

    简单来说:StringBuilder > Join > StringBuffer > concat > +

    测试文章:http://blog.csdn.net/kimsoft/article/details/3353849

不人云亦云,文章的示例,我也测试了,结论一致,不罗嗦了,但是我发现了另外一个问题,且看下文。

先看示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.StringTokenizer;

/**
 * Created by MangoCool on 2017/4/1.
 */
public class Java_Split_Add_Test {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) {

        String data = "zhangsan|430103199001231998|27|男|党员|未婚|计算机|178cm|70kg|18889896868";

        long st = System.nanoTime();
        str_split_add(data);
        new Java_Split_Add_Test().logger.info("str_split_add cost {} ms", (System.nanoTime()-st)/1000000);

        st = System.nanoTime();
        str_split_append(data);
        new Java_Split_Add_Test().logger.info("str_split_append cost {} ms", (System.nanoTime()-st)/1000000);

        st = System.nanoTime();
        str_substring_append(data);
        new Java_Split_Add_Test().logger.info("str_substring_append cost {} ms", (System.nanoTime()-st)/1000000);

        st = System.nanoTime();
        str_stringtokenizer_append(data);
        new Java_Split_Add_Test().logger.info("str_stringtokenizer_append cost {} ms", (System.nanoTime()-st)/1000000);
    }

    public static void str_split_add(String data) {

        for(int i=0; i<20000000; i++) {
            String[] useInfos = data.split("\\|");
            String zsString = useInfos[0] + "|" + useInfos[1] + "|" +
                              useInfos[2] + "|" + useInfos[3] + "|" +
                              useInfos[4] + "|" + useInfos[5] + "|" +
                              useInfos[6] + "|" + useInfos[7] + "|" +
                              useInfos[8] + "|" + useInfos[9];
        }
    }

    public static void str_split_append(String data) {

        for(int i=0; i<20000000; i++) {
            String[] useInfos = data.split("\\|");
            StringBuilder sb = new StringBuilder();
            sb.append(useInfos[0]).append("|")
                .append(useInfos[1]).append("|")
                .append(useInfos[2]).append("|")
                .append(useInfos[3]).append("|")
                .append(useInfos[4]).append("|")
                .append(useInfos[5]).append("|")
                .append(useInfos[6]).append("|")
                .append(useInfos[7]).append("|")
                .append(useInfos[8]).append("|")
                .append(useInfos[9]);
        }
    }

    public static void str_substring_append(String data) {

        for(int i=0; i<20000000; i++) {
            StringBuilder sb = new StringBuilder();
            String name = data.substring(0, 8);
            String cardNo = data.substring(9, 27);
            String age = data.substring(28, 30);
            String sex = data.substring(31, 32);
            String identity = data.substring(33, 35);
            String marriage = data.substring(36, 38);
            String profession = data.substring(39, 42);
            String height = data.substring(43, 48);
            String weight = data.substring(49, 53);
            String phoneNo = data.substring(54, 65);
            sb.append(name).append("|")
                    .append(cardNo).append("|")
                    .append(age).append("|")
                    .append(sex).append("|")
                    .append(identity).append("|")
                    .append(marriage).append("|")
                    .append(profession).append("|")
                    .append(height).append("|")
                    .append(weight).append("|")
                    .append(phoneNo);
        }
    }

    public static void str_stringtokenizer_append(String data) {

        for(int i=0; i<20000000; i++) {
            StringTokenizer token = new StringTokenizer(data,"|");
            StringBuilder sb = new StringBuilder();
            while (token.hasMoreTokens()) {
                sb.append(token.nextToken()).append("|");
            }
        }
    }
}

运行结果:

结论:从代码和结果看到,很意外为什么str_stringtokenizer_append时间如此之长,是的,这就是我想说的问题。

          分割速度stringTokenizer > subString > split,没问题。

          但如果需要使用分割后的数据,比如说拼接起来,或者存入集合等。这个效率确实令人失望,问题都在token.nextToken()方法上。

          不信?自己测!

          而如果只是统计分割后字符个数,stringTokenizer绝对值得使用。

          罗嗦了这么多,就这么一个结论,好无聊!

标签: java split append test

分享:

上一篇zookeeper配置

下一篇idea提交storm任务,集群运行

关于我

一个喜欢唱歌,热衷旅行,爱好电子产品的码农。没事,跟三五好友吼上几嗓子,约上几个背着行囊去露营或者宅在家里抱着孩子敲代码。

座右铭:当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

            人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。


Copyright 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。