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
변수 많으면 "" + 방식 쓰면 안되지 컴파일러가 최적화 못해주니깐
변수가 많다는게 기준이 몇개정도인가여
그냥 변수 사용하는것은 StringBuilder 사용하셈 예전에는 "" + ""을 2개의 스트링으로 봤는데 이제는 "" 한개로 인식한다는 정도임 변수 사용하면서 하나의 스트링 속도 기대할려면 변수값이 항상 동일하게 나오는 상수형태에만 적용되니깐