各テストが計測に妥当かどうか(コンパイラで最適化される書き方になっているかとか理解していないので)不明ですが…。意味のあるベンチマークとか私には難しすぎるw
1回こっきりだと、いずれも大差ないですが、繰り返し処理の場合は+演算子は相当不利っぽいので、普段は+演算子を使い、パフォーマンスが問題になった際には繰り返し処理内の文字列連結を確認することにしました(もちろん最もボトルネックになっているかどうかの計測は必要ですが)。
「いやいや計測方法がおかしいだろう」とか「そのコードじゃあ計測したことにならんよ」とか優しくおしえてくださいw
以下ソース
public class NewClassTest {
private String s1 = "a";
private String s2 = "b";
private int loop1 = 1000;
private int loop2 = 10000;
public NewClassTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void test01一回プラスで連結(){
String str = s1 + s2;
}
@Test
public void test02一回StringBuffer(){
String str = new StringBuffer(s1).append(s2).toString();
}
@Test
public void test03一回StringBuilder(){
String str = new StringBuilder(s1).append(s2).toString();
}
@Test
public void test04千回プラスで連結1(){
String str = "";
for (int i =0; i < loop1; i++) {
str = str + i;
}
}
@Test
public void test05千回StringBuilder1(){
String str = "";
StringBuilder sbui = new StringBuilder(str);
for (int i =0; i < loop1; i++) {
sbui.append(i);
}
str = sbui.toString();
}
@Test
public void test06千回StringBuffer1(){
String str = "";
StringBuffer sbuf = new StringBuffer(str);
for (int i =0; i < loop1; i++) {
sbuf.append(i);
}
str = sbuf.toString();
}
@Test
public void test07千回プラスで連結2(){
String s = "abcdefg";
for (int i = 0; i < loop1; i++) {
s += "abc"+ "def";
}
}
@Test
public void test08千回StringBuilder2(){
StringBuilder sbui = new StringBuilder("abcdef");
for (int i = 0; i < loop1; i++) {
sbui.append("abc");
sbui.append("def");
}
sbui.toString();
}
@Test
public void test09千回StringBuffer2(){
StringBuffer sbuf = new StringBuffer("abcdef");
for (int i = 0; i < loop1; i++) {
sbuf.append("abc");
sbuf.append("def");
}
sbuf.toString();
}
@Test
public void test10一万回プラスで連結1(){
String str = "";
for (int i =0; i < loop2; i++) {
str = str + i;
}
}
@Test
public void test11一万回StringBuilder1(){
String str = "";
StringBuilder sbui = new StringBuilder(str);
for (int i =0; i < loop2; i++) {
sbui.append(i);
}
str = sbui.toString();
}
@Test
public void test12一万回StringBuffer1(){
String str = "";
StringBuffer sbuf = new StringBuffer(str);
for (int i =0; i < loop2; i++) {
sbuf.append(i);
}
str = sbuf.toString();
}
@Test
public void test13一万回プラスで連結2(){
String s = "abcdefg";
for (int i = 0; i < loop2; i++) {
s += "abc"+ "def";
}
}
@Test
public void test14一万回StringBuilder2(){
StringBuilder sbui = new StringBuilder("abcdef");
for (int i = 0; i < loop2; i++) {
sbui.append("abc");
sbui.append("def");
}
sbui.toString();
}
@Test
public void test15一万回StringBuffer2(){
StringBuffer sbuf = new StringBuffer("abcdef");
for (int i = 0; i < loop2; i++) {
sbuf.append("abc");
sbuf.append("def");
}
sbuf.toString();
}
}
0 件のコメント:
コメントを投稿