私のテスト方法論は粗雑で、欠陥がある可能性があることを認めます (さらに、私は Java を知らず、この回答を書くのに十分なだけ学習しています)、私の最初の証拠は @dasblinkenlight の回答に反することを証明しています。次のコードを実行しました。
import java.util.*;
import java.lang.*;
class Main
{
private static void test (String regex, String replace, int repetitions)
{
long startTime = System.currentTimeMillis();
for (int i = 0; i < repetitions; i++)
{
String str = "30-Nov-2012 United Kingdom, 31-Oct-2012 31-Oct-2012 United Arab Emirates, 29-Oct-2012 31-Oct-2012 India, ";
str.replaceAll(regex, replace);
}
long endTime = System.currentTimeMillis();
System.out.println("Execution time: " + Long.toString(endTime - startTime));
}
public static void main (String[] args) throws java.lang.Exception
{
test("(\\d{4})\\s", "$1@", 10000);
test("(?<=\\d{4})\\s", "@", 10000);
test("(\\d{4})\\s", "$1@", 10000);
test("(?<=\\d{4})\\s", "@", 10000);
test("(\\d{4})\\s", "$1@", 10000);
test("(?<=\\d{4})\\s", "@", 10000);
test("(\\d{4})\\s", "$1@", 10000);
test("(?<=\\d{4})\\s", "@", 10000);
}
}
...ここ、http://ideone.com/WkHLMN、出力は次のとおりです。
Execution time: 164
Execution time: 140
Execution time: 96
Execution time: 135
Execution time: 95
Execution time: 133
Execution time: 94
Execution time: 130
初期化に関係する外れ値として最初の一連のケースを無視すると、残りのケースは、肯定的な後読みアサーションを使用する後者の式が 50% も多くの作業を行う可能性があることを示しているようです! 関心のある文字を渡した後、アサーションが真であるかどうかを確認するために後方参照が必要になるため、これが当てはまる可能性があると思います。