1

Double转换为String.

int我想知道是使用 a 还是使用 aDecimalFormat和 call是否会更好format(..)。此外,指定String.valueOf()或保持原样并让编译器解决它是否更有效?

抱歉,如果我听起来有点无知,我真的很想了解更多技术细节。

作为参考,我正在向 android canvas 绘制文本:

c.drawText("FPS: " + String.valueOf((int)lastFps), xPos, yPos, paint); 
4

5 回答 5

3

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

对于 string.valueof,我希望性能完全相同。我发现这样做"string" + intValue"string" + String.valueof(intValue)

于 2012-08-04T23:12:01.387 回答
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。看起来铸造是要走的路。

于 2012-08-04T23:38:57.327 回答
2

这是一份工作Math.floor().

于 2012-08-05T09:58:24.627 回答
1

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

于 2012-08-04T23:11:10.650 回答
1

我不确定两者的效率,但这里有第三种比较有趣的选项:

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

这将给出一组字符而不是小数/数字,并且会跳过类型转换,而是进行两个函数调用。

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

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

10^6 个周期,结果分别为 ~800 ms、~300 ms 和 ~40 ms。我想我的结果不会立即转化为您的情况,但它们可以暗示最后一个确实是,正如之前的海报所暗示的那样,最快的一个。

于 2012-08-04T23:23:19.287 回答