什么更有效/更便宜,铸造或方法调用?

时间:2012-08-04 23:02:58

标签: java performance casting type-conversion

我有一个Double,我希望在转换成{之前的小数位后(我不太关心准确性但在你的答案中随意提及)之后敲掉额外的数字{1}}。

我想知道是否最好转换为String或使用int并致电DecimalFormat。另外,指定format(..)或保持原样是否更有效率并让编译器弄清楚它?

对不起,如果我听起来有点无知,我真的很想知道更多的技术细节。

供参考,我正在绘制文本和android canvas:

String.valueOf()

5 个答案:

答案 0 :(得分:3)

施法可能会更有效率。这是作为本机代码实现的,而使用方法则必须通过java代码。它也更具可读性。

对于string.valueof,我希望性能严格相同。我觉得"string" + intValue"string" + String.valueof(intValue)

更具可读性

答案 1 :(得分:2)

我制作了一个程序,使用System.nanoTime()来计算这两种方法的执行时间:

    public static void cast() {
    for (int i=0; i<1000000; i++) {
        int x= (int)Math.random();
    }
}

public static void format() {
    for (int i=0; i< 1000000; i++) {
        DecimalFormat df = new DecimalFormat("#");
        df.format(Math.random());
    }
}

以下是各自的结果:

80984944

6048075593

当然,我的测试可能不是完美的例子。我只是使用math.random(),它会生成一个总是强制转换为0的数字,这可能会影响结果。然而,这些结果确实有意义 - 铸造应该是便宜的,因为它可能根本不对位进行操作--JVM只是区别对待位。

编辑:如果我为第二个例子提取格式化程序的实例化,程序将在3155165182ns中运行。如果我在两种情况下将随机数乘以Integer.MAX_VALUE(实例化被拉出),结果为:82100170和4174558079.看起来像是转换。

答案 2 :(得分:2)

这是Math.floor().

的工作

答案 3 :(得分:1)

一般来说,函数/方法调用是以性能开销为代价的。我的投票是类型转换会更快,但正如@Zefiryn建议的那样,最好的方法是创建一个循环并多次执行每个动作并使用计时器测量性能。

答案 4 :(得分:1)

我不确定两者的效率,但这是第三个可能比较有趣的选项:

String.valueOf(doubleValue).substring(0, endInt)

这将给出一定数量的字符而不是小数/数字,并且会跳过类型转换,但会改为进行两次函数调用。

编辑:太好奇所以我试着运行每个选项:

integerNumberFormat.format(number)
String.valueOf(doubleValue).substring(0, endInt)
String.valueOf((int)doubleValue)

10 ^ 6个循环,结果分别为~800ms,~300ms和~40ms。我想我的结果不会立即转化为您的情况,但他们可以暗示最后一个确实如前面的海报所示,是最快的。