ฉันได้แรงบันดาลใจจากรหัส Sean Patrick Floyd และเขียนใหม่อีกครั้งเพื่อประสิทธิภาพสูงสุดที่ฉันได้รับ
public static String stripNonDigitsV2( CharSequence input ) {
if (input == null)
return null;
if ( input.length() == 0 )
return "";
char[] result = new char[input.length()];
int cursor = 0;
CharBuffer buffer = CharBuffer.wrap( input );
while ( buffer.hasRemaining() ) {
char chr = buffer.get();
if ( chr > 47 && chr < 58 )
result[cursor++] = chr;
}
return new String( result, 0, cursor );
}
ฉันจะทดสอบประสิทธิภาพเพื่อสตริงที่ยาวมากที่มีตัวเลขน้อยที่สุดและผลคือ:
- รหัสเดิมช้ากว่า 25,5%
- วิธีฝรั่งช้ากว่า 2.5-3 เท่า
- นิพจน์ทั่วไปที่มี D + ช้ากว่า 3-3.5 เท่า
- นิพจน์ทั่วไปที่มีเพียง D จะช้ากว่า 25+ ครั้ง
Btw มันขึ้นอยู่กับว่าสตริงนั้นนานแค่ไหน ด้วยสตริงที่มีเพียง 6 หมายเลขฝรั่งจะช้าลง 50% และ regexp ช้าลง 1 เท่า