我正在尝试一个聚合答案,我在其中测试删除字符串中所有空格的所有方法。
每种方法运行 100 万次,然后取平均值。注意:一些计算将用于汇总所有运行。
结果:
@jahir 's answer第一名
- 带有短文本的StringUtils:1.21E-4 ms (121.0 ms)
- 长文本的StringUtils:0.001648 ms (1648.0 ms)
第二名
- 带有短文本的字符串生成器:2.48E-4 ms (248.0 ms)
- 带有长文本的字符串生成器:0.00566 毫秒(5660.0 毫秒)
第三名
- 带有短文本的正则表达式:8.36E-4 ms (836.0 ms)
- 带有长文本的正则表达式:0.008877 ms (8877.0 ms)
第四名
- 短文本循环:0.001666 ms (1666.0 ms)
- 长文本的 For 循环:0.086437 毫秒 (86437.0 毫秒)
代码如下:
public class RemoveAllWhitespaces {
public static String Regex(String text){
return text.replaceAll("\\s+", "");
}
public static String ForLoop(String text) {
for (int i = text.length() - 1; i >= 0; i--) {
if(Character.isWhitespace(text.codePointAt(i))) {
text = text.substring(0, i) + text.substring(i + 1);
}
}
return text;
}
public static String StringBuilder(String text){
StringBuilder builder = new StringBuilder(text);
for (int i = text.length() - 1; i >= 0; i--) {
if(Character.isWhitespace(text.codePointAt(i))) {
builder.deleteCharAt(i);
}
}
return builder.toString();
}
}
这里是测试:
import org.junit.jupiter.api.Test;
import java.util.function.Function;
import java.util.stream.IntStream;
import static org.junit.jupiter.api.Assertions.*;
public class RemoveAllWhitespacesTest {
private static final String longText = "123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222";
private static final String expected = "1231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc222";
private static final String shortText = "123 123 \t 1adc \n 222";
private static final String expectedShortText = "1231231adc222";
private static final int numberOfIterations = 1000000;
@Test
public void Regex_LongText(){
RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), longText, expected);
}
@Test
public void Regex_ShortText(){
RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), shortText, expectedShortText);
}
@Test
public void For_LongText(){
RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), longText, expected);
}
@Test
public void For_ShortText(){
RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), shortText, expectedShortText);
}
@Test
public void StringBuilder_LongText(){
RunTest("StringBuilder_LongText", text -> RemoveAllWhitespaces.StringBuilder(text), longText, expected);
}
@Test
public void StringBuilder_ShortText(){
RunTest("StringBuilder_ShortText", text -> RemoveAllWhitespaces.StringBuilder(text), shortText, expectedShortText);
}
private void RunTest(String testName, Function<String,String> func, String input, String expected){
long startTime = System.currentTimeMillis();
IntStream.range(0, numberOfIterations)
.forEach(x -> assertEquals(expected, func.apply(input)));
double totalMilliseconds = (double)System.currentTimeMillis() - (double)startTime;
System.out.println(
String.format(
"%s: %s ms (%s ms)",
testName,
totalMilliseconds / (double)numberOfIterations,
totalMilliseconds
)
);
}
}