java 라인 안전과 비 라인 안전 성능 비교
3434 단어 스레드 보안StringBuilderStringBuffer
문자열의 내용을 변경할 때 StringBuffer를 사용하면 더 좋은 성능을 얻을 수 있기 때문이다.더 좋은 성능을 얻기 위해서라면 스트링버퍼를 사용하면 가장 좋은 성능을 얻을 수 있을까?
정답은 노!
스레드 보안: HashTable, StringBuffer
비스레드 보안: HashMap, StringBuilder
성능 비교: 라인 동기화를 지원하여 라인 안전을 확보하기 때문에 성능이 떨어지는 문제.라인이 안전한 많은 방법은synchronized 방법이다.
예는 다음과 같습니다.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author: chengtai.he
* @created:2009-12-9 09:59:57
*/
public class StringBuilderTester {
private static final String base = " base string. ";
private static final int count = 2000000;
public static void stringBufferTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuffer test = new StringBuffer(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuffer. ");
}
public static void stringBuilderTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuilder test = new StringBuilder(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuilder. ");
}
public static String appendItemsToStringBuiler(List list) {
StringBuilder b = new StringBuilder();
for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(" ");
}
return b.toString();
}
public static void addToStringBuilder() {
List list = new ArrayList();
list.add(" I ");
list.add(" play ");
list.add(" Bourgeois ");
list.add(" guitars ");
list.add(" and ");
list.add(" Huber ");
list.add(" banjos ");
System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
}
public static String appendItemsToStirngBuffer(List list) {
StringBuffer b = new StringBuffer();
for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(" ");
}
return b.toString();
}
public static void addToStringBuffer() {
List list = new ArrayList();
list.add(" I ");
list.add(" play ");
list.add(" Bourgeois ");
list.add(" guitars ");
list.add(" and ");
list.add(" Huber ");
list.add(" banjos ");
System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
}
public static void main(String[] args) {
stringTest();
stringBufferTest();
stringBuilderTest();
addToStringBuffer();
addToStringBuilder();
}
}
위의 결과를 보면 이 세 가지 종류는 단일 루틴 프로그램에서 성능의 차이를 한눈에 알 수 있다.String 대상을 사용할 때 운행 횟수가 다른 대상의 1/100에 불과하더라도 그 집행 시간은 다른 대상보다 25배 이상 높다.StringBuffer 대상과 StringBuilder 대상의 차이도 비교적 뚜렷하다. 전자는 후자의 1.5배 정도이다.이를 통해 알 수 있듯이 만약에 우리의 프로그램이 단일 루트에서 실행되거나 루트 동기화 문제를 고려할 필요가 없다면, 우리는StringBuilder 클래스를 우선적으로 사용해야 한다.물론 라인의 안전을 확보하려면 스트링 버퍼가 아닐 수 없다.
다중 라인에 대한 지원이 다른 것을 제외하고 이 두 종류의 사용은 거의 차이가 없다. 위의 예는 바로 좋은 설명이다.appendItemsToStringBuiler와 appendItemsToStirngBuffer 두 가지 방법은 채택된 대상이 각각 StringBuilder와 StringBuffer인 것을 제외하고는 완전히 같고 효과도 완전히 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 다중 스레드 안전한 단일 모드단일 모드는 특정한 종류가 하나의 실례만 있고 자체적으로 실례화하여 전체 시스템에 이 실례를 제공한다.컴퓨터 시스템에서 스레드 풀, 캐시, 로그 대상, 대화상자, 프린터, 그래픽 카드의 드라이버 대상은 항상 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.