StringBuffer vs StringBuilder 성능 및 재사용

StringBuffer와 StringBuilder를 사용했을때 매객체생성과 기존 객체 재사용등의 방법으로 몇가지 돌려보고 시간을 뽑아 보았습니다.

결론부터 이야기하면 상황에 따라 다르긴 하지만 결론은

동기화가 필요한 경우 StringBuffer을 새로운 객체를 생성하는 것이 빠름.

동기화가 필요없는 경우 StringBuilder를 이용하여 setLength(0)을 이용하여 처리하는 것이 성능과 메모리 사용면에서 좋음.

테스트 코드

아래 기본 코드에서 StringBuffer와 StringBuilder를 테스트 하였음.

매 Loop에서 새로운 객체

        LocalTime startTime = LocalTime.now();

for(int i=0;i<100_000_000;i++){
StringBuffer sb = new StringBuffer();
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());

// StringBuffer : 107, j가 30일떄 : 34
// StringBuilder : 92, j가 30일떄 : 27

매 Loop에서 new StringBuffer(sb.length())

        LocalTime startTime = LocalTime.now();
StringBuffer sb = new StringBuffer();

for(int i=0;i<100_000_000;i++){
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
sb = new StringBuffer(sb.length());
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());
// StringBuffer : 104, j가 30일떄 : 35
// StringBuilder : 82, j가 30일떄 : 23
// sb = new StringBuilder(sb.capacity()); : 85, j가 30일떄 : 23

매 Loop에서 버퍼 사이즈 변경으로 인해 재사용 (sb.setLength(0);)

        LocalTime startTime = LocalTime.now();
StringBuffer sb = new StringBuffer();
for(int i=0;i<100_000_000;i++){
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
            sb.setLength(0);
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());
// StringBuffer : 264, J가 30일떄 : 75
// StringBuilder : 78, J가 30일떄 : 22

Posted by 다인,보리아빠
,


아래와 같이 에러가 나는 경우

Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]

원인 : 순환참조 문제.

조치 :

tomcat container path에 해당하는 conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=bcprov*.jar

bcprov*.jar 추가.

로그전체.

java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:57 오후 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["http-bio-8080"]
12월 20, 2017 2:31:57 오후 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["ajp-bio-8019"]
12월 20, 2017 2:31:57 오후 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 404 ms
12월 20, 2017 2:31:57 오후 org.apache.catalina.core.StandardService startInternal
정보: Starting service Catalina
12월 20, 2017 2:31:57 오후 org.apache.catalina.core.StandardEngine startInternal
정보: Starting Servlet Engine:
12월 20, 2017 2:31:58 오후 org.apache.catalina.core.ContainerBase startInternal
심각: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at java.util.concurrent.FutureTask.report(FutureTask.java:122)
      at java.util.concurrent.FutureTask.get(FutureTask.java:192)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
      at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
      ... 6 more
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
      at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2126)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2072)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1947)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1913)
      at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1898)
      at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
      at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
      at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)

Posted by 다인,보리아빠
,