デブサミ2008レポート
http://www.atmarkit.co.jp/fjava/special/devsummit2008/devsummit2008_2.html


つーわけで?デモで使ったコード。
(残りは、デブサミのダウンロード資料で)


switch vs array vs Map
(arrayの勝ち)


package sample;

import java.util.HashMap;
import java.util.Map;

import org.seasar.framework.log.Logger;

public class SwitchVsArrayVsMap {
public static void main(String[] args) {

System.gc();
long start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
getWithSwitch(i % 10);
}
long end = System.currentTimeMillis();
logger.debug("switch : " + (end - start));

System.gc();
start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
getFromArray(i % 10);
}
end = System.currentTimeMillis();
logger.debug("array : " + (end - start));

System.gc();
start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
getFromMap(i % 10);
}
end = System.currentTimeMillis();
logger.debug("Map : " + (end - start));
}

private static String getFromMap(int i) {
return map.get(i);
}

private static String getWithSwitch(int key) {
switch (key) {
case 0:
return foo;
case 1:
return bar;
case 2:
return baz;
case 3:
return qux;
case 4:
return quux;
case 5:
return garply;
case 6:
return waldo;
case 7:
return fred;
case 8:
return plugh;
case 9:
return xyzzy;
}
return null;
}

private static String getFromArray(int key) {
return array[key];
}

private static final String foo = "foo";

private static final String bar = "bar";

private static final String baz = "baz";

private static final String qux = "qux";

private static final String quux = "quux";

private static final String garply = "garply";

private static final String waldo = "waldo";

private static final String fred = "fred";

private static final String plugh = "plugh";

private static final String xyzzy = "xyzzy";

private static final String[] array = { foo, bar, baz, qux, quux, garply,
waldo, fred, plugh, xyzzy };

private static final Map map = new HashMap();

static {
map.put(0, foo);
map.put(1, bar);
map.put(2, baz);
map.put(3, qux);
map.put(4, quux);
map.put(5, garply);
map.put(6, waldo);
map.put(7, fred);
map.put(8, plugh);
map.put(9, xyzzy);
}

private static final Logger logger = Logger
.getLogger(SwitchVsArrayVsMap.class);

private static final int ループ回数 = 100000000;
}


charAt(その1)
(charAtの勝ち)


package sample;

public class StartsWithVsCharAt_1 {
public static void main(String[] args) {

String foo = "foo";
String startsWithString = "f";
char startsWithChar = 'f';
final int ループ回数 = 200000000;
@SuppressWarnings("unused")
boolean isStart;

long start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
isStart = foo.startsWith(startsWithString);
}
long end = System.currentTimeMillis();
System.out.println("String#startsWith : " + (end - start));

start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
isStart = foo.charAt(0) == startsWithChar;
}
end = System.currentTimeMillis();
System.out.println("String#charAt : " + (end - start));
}
}


charAt(その2)
(まだcharAtの勝ち)


package sample;

import org.seasar.framework.log.Logger;

/**
* 20文字
*/
public class StartsWithVsCharAt_3 {
public static void main(String[] args) {
String foo = "01234567890123456789";
String startsWithString = "01234567890123456789";
@SuppressWarnings("unused")
boolean isStart;

long start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
isStart = foo.startsWith(startsWithString);
}
long end = System.currentTimeMillis();
logger.debug("String#startsWith : " + (end - start));

start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
isStart = (foo.charAt(0) == '0' && foo.charAt(1) == '1'
&& foo.charAt(2) == '2' && foo.charAt(3) == '3'
&& foo.charAt(4) == '4' && foo.charAt(5) == '5'
&& foo.charAt(6) == '6' && foo.charAt(7) == '7'
&& foo.charAt(8) == '8' && foo.charAt(9) == '9'
&& foo.charAt(10) == '0' && foo.charAt(11) == '1'
&& foo.charAt(12) == '2' && foo.charAt(13) == '3'
&& foo.charAt(14) == '4' && foo.charAt(15) == '5'
&& foo.charAt(16) == '6' && foo.charAt(17) == '7'
&& foo.charAt(18) == '8' && foo.charAt(19) == '9');
}
end = System.currentTimeMillis();
logger.debug("String#charAt : " + (end - start));

}

private static final Logger logger = Logger
.getLogger(StartsWithVsCharAt_3.class);

private static final int ループ回数 = 50000000;
}


最後は、当たり前かな〜
array vs tempValue
(tempValueの勝ち)


package sample;

import org.seasar.framework.log.Logger;

public class ArrayVsTempValue {

public static void main(String[] args) {
final int ループ回数 = 100000000;
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

long start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
array[0] += 1;
array[0] += 2;
array[0] += 3;
array[0] += 4;
array[0] += 5;
}
long end = System.currentTimeMillis();
logger.debug("array[index] : " + (end - start));

start = System.currentTimeMillis();
for (int i = 0; i < ループ回数; i++) {
int temporary = array[0];
temporary += 1;
temporary += 2;
temporary += 3;
temporary += 4;
temporary += 5;
array[0] = temporary;
}
end = System.currentTimeMillis();
logger.debug("temporaryValue : " + (end - start));
}

private static final Logger logger = Logger.getLogger(ArrayVsTempValue.class);
}