追加字符串 - 性能问题 - Java 6
Append Strings - Performance issue - Java 6
我需要重复附加字符串(大约 50 次),这是另一个 StringBuilder 的子字符串。
我需要为大约 30k 输入执行此操作。
这需要我大约 6 分钟的时间。
StringBuilder input = new StringBuilder(10000);
StringBuilder output = new StringBuilder(10000);
//for 循环直到文件末尾,将字符串读入变量 'input'
{
output.append(input.substring(1, 8));
output.append(input.substring(33, 45));
output.append(input.substring(20, 25)); // and so on
}
这花了大约 6 分钟。
所以,我尝试了
{
output.append(input.substring(1, 8) + output.append(input.substring(33, 45) + output.append(input.substring20, 25) + .. // and so on );
}
这个,也有同步的。我知道这两个是一样的。
但是,即使我使用了 StringBuilder,为什么我仍然有性能延迟?我做错了什么吗?
我提到了:StringBuilder vs String concatenation in toString() in Java
和 String concatenation in Java - when to use +, StringBuilder and concat 等等。
他们中的大多数建议使用 StringBuilder。
您绝对可以避免使用 append
的重载创建如此多的对象,它允许您指定一个子序列:
for (...)
{
output.append(input, 1, 8);
output.append(input, 33, 45);
output.append(input, 20, 25);
}
这可能对您有帮助,也可能没有帮助。你的第二个例子中的字符串连接绝对应该避免 - 我很惊讶它没有造成 huge 差异......这表明它很可能不是花时间的追加,但是不管是在读取输入。
为了测试这一点,您应该尝试一个 empty for
循环,这样您仍然在读取所有相同的输入,但不会附加到 output
完全没有。
性能问题很可能出在其他地方,因为这不会超过一秒钟。我建议您分析您的应用程序以确定它实际花费处理时间的地方。
long start = System.currentTimeMillis();
char[] chars = new char[500];
Arrays.fill(chars, '.');
for (int i = 0; i < 30000; i++) {
String input = new String(chars);
StringBuilder output = new StringBuilder();
for (int j = 0; j < 50; j++) {
output.append(input, j * 10, j * 10 + 9);
}
String out = output.toString();
}
System.out.println("Took: " + (System.currentTimeMillis() - start) / 1e3 + " seconds");
打印 30,000 个字符串的 50 个子字符串
Took: 0.058 seconds
我需要重复附加字符串(大约 50 次),这是另一个 StringBuilder 的子字符串。 我需要为大约 30k 输入执行此操作。 这需要我大约 6 分钟的时间。
StringBuilder input = new StringBuilder(10000);
StringBuilder output = new StringBuilder(10000);
//for 循环直到文件末尾,将字符串读入变量 'input'
{
output.append(input.substring(1, 8));
output.append(input.substring(33, 45));
output.append(input.substring(20, 25)); // and so on
}
这花了大约 6 分钟。
所以,我尝试了
{
output.append(input.substring(1, 8) + output.append(input.substring(33, 45) + output.append(input.substring20, 25) + .. // and so on );
}
这个,也有同步的。我知道这两个是一样的。
但是,即使我使用了 StringBuilder,为什么我仍然有性能延迟?我做错了什么吗?
我提到了:StringBuilder vs String concatenation in toString() in Java 和 String concatenation in Java - when to use +, StringBuilder and concat 等等。 他们中的大多数建议使用 StringBuilder。
您绝对可以避免使用 append
的重载创建如此多的对象,它允许您指定一个子序列:
for (...)
{
output.append(input, 1, 8);
output.append(input, 33, 45);
output.append(input, 20, 25);
}
这可能对您有帮助,也可能没有帮助。你的第二个例子中的字符串连接绝对应该避免 - 我很惊讶它没有造成 huge 差异......这表明它很可能不是花时间的追加,但是不管是在读取输入。
为了测试这一点,您应该尝试一个 empty for
循环,这样您仍然在读取所有相同的输入,但不会附加到 output
完全没有。
性能问题很可能出在其他地方,因为这不会超过一秒钟。我建议您分析您的应用程序以确定它实际花费处理时间的地方。
long start = System.currentTimeMillis();
char[] chars = new char[500];
Arrays.fill(chars, '.');
for (int i = 0; i < 30000; i++) {
String input = new String(chars);
StringBuilder output = new StringBuilder();
for (int j = 0; j < 50; j++) {
output.append(input, j * 10, j * 10 + 9);
}
String out = output.toString();
}
System.out.println("Took: " + (System.currentTimeMillis() - start) / 1e3 + " seconds");
打印 30,000 个字符串的 50 个子字符串
Took: 0.058 seconds