progs/catastrophic.java
author Christian Urban <christian dot urban at kcl dot ac dot uk>
Sat, 29 Oct 2016 21:45:44 +0100
changeset 467 b5ec11e89768
parent 420 25bc57b32efa
child 474 4bdf0dedd708
permissions -rw-r--r--
fixed bug

// a case of catastrophic backtracking in Java
//
// regexp: (a*)*b
// strings: aa....

import java.util.regex.*;

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

        //we always run all the tests twice -> warmup of the JVM
        for (int runs = 0; runs < 2; runs++) {
            
            Pattern pattern = Pattern.compile("(a*)*b");
            
            // Run from 5 to 28 characters
            for (int length = 5; length < 28; length++) {
                
                // Build input of specified length
                String input = "";
                for (int i = 0; i < length; i++) { input += "a"; }
                
                // Measure the average duration of two calls...  
                long start = System.nanoTime();
                for (int i = 0; i < 2; i++) {
                    pattern.matcher(input).find();
                }
                
                System.out.println(length + " " + input + ": " 
                       + ((System.nanoTime() - start) / 2000000000d) 
                       + "s");
            }
        }
    }
}