google / google/re2j

Re2j runs 5x slower than java.util.regex

Open
#162 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1.3k
Forks
165
PR merge metrics
No merged PRs in 30d

Description

Here is my benchmark:

```java

import org.apache.commons.lang3.RandomStringUtils;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Warmup(iterations = 2, time = 3)
@Measurement(iterations = 2, time = 3)
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Threads(3)
@Fork(1)
/*
*

 *     Benchmark                Mode  Cnt     Score   Error  Units

* Re2jBenchmark.javaMatch avgt 2 175.926 ns/op
* Re2jBenchmark.re2jMatch avgt 2 1067.591 ns/op
*
 */

public class Re2jBenchmark {

private static final String PATTERN = "[0-5][0-6]{1,3}[1-7]{1,2}[2580]{1,3}[127]{0,8}";
private static final Pattern p1 = Pattern.compile(PATTERN);
private static final com.google.re2j.Pattern p2 = com.google.re2j.Pattern.compile(PATTERN);

private List inputs;

private Iterator iterator;

@Setup
public void setup() {
inputs =
IntStream.rangeClosed(0, 999)
.mapToObj(n -> RandomStringUtils.randomNumeric(32))
.collect(Collectors.toList());
iterator = inputs.listIterator();
}

private String nextInput() {
if (!iterator.hasNext()) {
iterator = inputs.listIterator();
}
return iterator.next();
}

@Benchmark
public boolean javaMatch() {
return p1.matcher(nextInput()).find();
}

@Benchmark
public boolean re2jMatch() {
return p2.matcher(nextInput()).find();
}
}

```

here is the result:

```
Benchmark Mode Cnt Score Error Units
Re2jBenchmark.javaMatch avgt 2 175.926 ns/op
Re2jBenchmark.re2jMatch avgt 2 1067.591 ns/op
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.