副産物
Java 1.6。
$ cat Test.java import java.util.regex.*; public class Test { public static void main(String[] args) { String query = "Hello, world."; StringBuilder text = new StringBuilder(13 * 1024); for (int i = 0; i < 1024; i++) text.append("Hello, world!"); if (args[0].equals("String")) testString(text.toString(), query); else if (args[0].equals("Pattern")) testPattern(text.toString(), query); } private static void testString(String text, String query) { for (int i = 0; i < 100000; i++) text.contains(query); } private static void testPattern(String text, String query) { for (int i = 0; i < 100000; i++) { Pattern p = Pattern.compile(query, Pattern.LITERAL); p.matcher(text).find(); } } } $ javac Test.java $ time java Test String 4.59 real 4.53 user 0.04 sys $ time java Test Pattern 1.39 real 1.41 user 0.04 sys
テストケースがとても作為的ですが。後者は Boyer-Moore 法っぽい(前処理は単純な O(m2))。