【发布时间】:2011-04-23 12:02:20
【问题描述】:
更新:非常感谢 Gabe 和 Glenn 的详细解释。该测试不是为了语言比较基准而编写的,只是为了学习VM优化技术。
我做了一个简单的测试来了解 Java 和 Python 之间字符串连接的性能。
测试是两种语言中默认不可变字符串对象/类型的目标。所以我在 Java 测试中不使用 StringBuilder/StringBuffer。
测试只是简单地添加了 100k 次字符串。 Java 大约需要 32 秒来完成,而 Python 只使用大约 13 秒来处理 Unicode 字符串和 0.042 秒来处理非 Unicode 字符串。
我对结果有点惊讶。我认为 Java 应该比 Python 更快。 Python 利用什么优化技术来实现更好的性能?还是Java中String对象设计的太重了?
操作系统:Ubuntu 10.04 x64 JDK:孙 1.6.0_21 Python:2.6.5
Java 测试确实使用 -Xms1024m 来最小化 GC 活动。
Java 代码:
public class StringConcateTest {
public static void test(int n) {
long start = System.currentTimeMillis();
String a = "";
for (int i = 0; i < n; i++) {
a = a.concat(String.valueOf(i));
}
long end = System.currentTimeMillis();
System.out.println(a.length() + ", time:" + (end - start));
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
test(1000 * 100);
}
}
}
Python 代码:
import time
def f(n):
start = time.time()
a = u'' #remove u to use non Unicode string
for i in xrange(n):
a = a + str(i)
print len(a), 'time', (time.time() - start)*1000.0
for j in xrange(10):
f(1000 * 100)
【问题讨论】:
-
你对做事错误的方式有不健康的兴趣:p
-
如果股票 Python 字符串被实现为 Java 的 StringBuffer,我会期望得到的结果。更好的测试可能是在每个平台上实现最好的代码。
-
Java 是如何使用 StringBuilder 的?
-
是的,老实说...你为什么会对 Java 中一个普遍谴责的过程需要很长时间感到惊讶?
-
你非常糟糕的 Java 代码可以解释这个结果。对于这样的连接,您必须使用 StringBuilder/StringBuffer。 Integer.toString(i) 也比 String.valueOf(i) 好。
标签: java python performance string concatenation