import java.util.Arrays;

import java.util.List;

import java.util.function.Supplier;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

import java.util.stream.Stream;



public class speed {

    static String[] strarray;

    static List<String> strlist;

    

    public static void main(String[] args) {

        strarray = IntStream.range(0, 1000).map(i -> (i % 9) + 1)

                .mapToObj(len -> IntStream.range(0, len).mapToObj(i -> "a").collect(Collectors.joining()))

                .toArray(size -> new String[size]);

        strlist = Arrays.asList(strarray);

        

        bench("stringBuilderJoin", speed::stringBuilderJoin);

        bench("stringBufferJoin", speed::stringBufferJoin);

        bench("stringBuilderFuckingJoin", speed::stringBuilderFuckingJoin);

        bench("plusArrayJoin", speed::plusArrayJoin);

        bench("streamArrayJoin", speed::streamArrayJoin);

        bench("streamListJoin", speed::streamListJoin);

        bench("streamListJoinOpt", speed::streamListJoinOpt);

        bench("streamListParallelJoinOpt", speed::streamListParallelJoinOpt);

        bench("streamListParallelJoin", speed::streamListParallelJoin);

    }

    

    public static String stringBuilderJoin(){

        StringBuilder s = new StringBuilder("[");

        for(int i = 0; i < strarray.length; ++i){

            if(i != 0){

                s.append(",[");

            }

            s.append(strarray[i]).append("]");

        }

        return s.toString();

    }

    public static String stringBufferJoin(){

        StringBuffer s = new StringBuffer("[");

        for(int i = 0; i < strarray.length; ++i){

            if(i != 0){

                s.append(",[");

            }

            s.append(strarray[i]).append("]");

        }

        return s.toString();

    }

    public static String stringBuilderFuckingJoin(){

        StringBuilder s = new StringBuilder();

        for(int i = 0; i < strarray.length; ++i){

            if(i != 0){

                s.append(",");

            }

            s.append("[" + strarray[i] + "]");

        }

        return s.toString();

    }    

    public static String plusArrayJoin(){

        String s = "[";

        for(int i = 0; i < strarray.length; ++i){

            if(i != 0){

                s += ",[";

            }

            s += strarray[i] + "]";

        }

        return s;

    }

    public static String streamArrayJoin(){

        return Arrays.stream(strarray)

                .flatMap(s -> Stream.of(",", "[", s, "]"))

                .skip(1).collect(Collectors.joining());

    }


    public static String streamListJoin(){

        return strlist.stream()

                .flatMap(s -> Stream.of(",", "[", s, "]"))

                .skip(1).collect(Collectors.joining());

    }

    public static String streamListJoinOpt(){

        return Stream.concat(

                strlist.stream().limit(1).flatMap(s -> Stream.of("[", s, "]")),

                strlist.stream().skip(1)

                .flatMap(s -> Stream.of(",[", s, "]")))

                .collect(Collectors.joining());

    }

    public static String streamListParallelJoinOpt(){

        return Stream.concat(

                strlist.stream().limit(1).flatMap(s -> Stream.of("[", s, "]")),

                strlist.stream().skip(1).parallel()

                    .flatMap(s -> Stream.of(",[", s, "]")))

            .collect(Collectors.joining());

    }        

    public static String streamListParallelJoin(){

        return strlist.parallelStream()

                .flatMap(s -> Stream.of(",", "[", s, "]"))

                .skip(1).collect(Collectors.joining());

    }


    public static void bench(String name, Supplier<String> proc){

        bench(name, 50_000, proc);

    }


    public static void bench(String name, int count, Supplier<String> proc){

        if(!streamArrayJoin().equals(proc.get())) throw new RuntimeException(name + " is defferent with array join.");

        for(int i = 0; i < 100; ++i){

            proc.get();

        }

        long s = System.currentTimeMillis();

        for(int i = 0; i < count; ++i){

            proc.get();

        }

        System.out.printf("%s:%dms%n", name, System.currentTimeMillis() - s);

    }

<style type="text/css"> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px} p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68} span.s1 {color: #931a68} span.s2 {color: #000000} span.s3 {color: #0326cc} span.s4 {color: #7e504f} span.s5 {color: #3933ff} </style>

}




자바8인데도 속도차이나는거보면


밑글 리플에 달린거는 틀린말인가


stringBuilderJoin:1594ms

stringBufferJoin:1543ms

<style type="text/css"> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} </style>

stringBuilderFuckingJoin:2404ms



코드 출처 : http://d.hatena.ne.jp/nowokay/20140408