副産物

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))。