【发布时间】:2013-03-28 05:05:31
【问题描述】:
每次我必须将 int 转换为 String 时,我都会选择 ""+a 或 Integer.toString(a)。现在我想知道哪种方式更快,所以我编写了一个简单的基准测试,调用 function_1、function_2 和 function_3 10000000 次,并打印处理这些函数需要多长时间。以下是函数:
public static String i="";
public static String j="";
public static String k="";
public static void function_1()
{
i=Integer.toString(getOne());
}
public static void function_2()
{
j=""+1;
}
public static void function_3()
{
j=""+getOne();
}
public static int getOne()
{
return 1;
}
输出是:
Benchmarking starting...
Executing function_1 10000000 time(s)...
Done executing function_1 in 476 ms.
Executing function_2 10000000 time(s)...
Done executing function_2 in 8 ms.
Executing function_3 10000000 time(s)...
Done executing function_3 in 634 ms.
Benchmarking complete!
我觉得function_2这么快,是因为编译成
public static void function_2()
{
j="1";
}
为了避免这种情况,我改用了函数getOne()。但这里是有趣的部分(对我来说):function_3 必须在不使用 Object 的原始 toString 方法的情况下编译(在这种情况下 Integer.toString(1) 因为int 是原始的)。我的问题是:编译器实际上是如何威胁""+1 所以它比调用Integer.toString(1) 慢?
【问题讨论】:
-
您考虑过查看字节码吗?此外,微基准通常是无用的。事情也可能发生在 JIT 级别。
-
如果您查看字节码,您可能会发现
function_3使用StringBuilder而function_1没有。在内部,StringBuilder将调用String.valueOf()。 -
@D180 - 根据你的数字,
function_3比function_1慢。如果您想知道为什么它“更快”,请不要怀疑:-) -
@D180 -
javap -c MyClass -
将整数转换为字符串的最快方法可能是使用 Integer.toString(int)。 (虽然聪明的程序员可能会做得更好。)
标签: java performance optimization benchmarking