将“x ==(x / 10)* 10;”被优化了

时间:2012-04-26 00:18:09

标签: java

背景信息:我们的业务要求是以3或4位数字符串报告值。如果字符串是3位数,则其值实际上是* 10。

e.g。 123代表1230,其中4567代表4567。

当从存储的整数转换回字符串时,上面的代码被视为确定这一点的一种方法。我们的问题是优化器会删除x(整数和浮点数)的代码。特别关注Java,但后面的问题是其他语言将如何表现

显而易见的另一种方法是使用Mod(x%10)。

5 个答案:

答案 0 :(得分:2)

  

以下问题是其他语言会如何表现?

在C中使用gcc在各种优化级别进行了一些快速测试并查看生成的代码。不,它没有得到优化。即使编译器在编译时可以评估x == (x/10)*10(因为 x 是常量),它仍然可以正确评估。

更新:如果您考虑一下,这是一个明显的结果。对于整数(x/10)*10,编译器不能仅对x“优化”x,因为它只能用于整数集的十​​分之一。< / p>

答案 1 :(得分:1)

您的问题假设(x/10)*10必须等于x。通常,只要Java编译器和虚拟机满足Java语言规范的要求,就可以以任何方式优化任何内容。

如果没有浮点舍入错误,xfloatdouble则为x == (x/10)*10。但是,10是int,如果xintlong,则表达式使用整数除法。 Java语言规范非常明确division operator对整数的作用。即它向零舍入。因此,Java编译器可以将该表达式优化为除除除后跟乘法之外的其他值,但无论优化程序如何,它都必须生成正确的结果。

答案 2 :(得分:0)

  

以上代码被视为确定此

的一种方法

我不知道为什么,因为它没有。它所做的只是将最后一位数字改为零,如果它还不为零。

编译器&amp; JVM不允许对其进行优化,因为这不会给出相同的答案。

答案 3 :(得分:0)

我不确定我是否完全理解这些要求。你当然可以做像

这样的事情

String s = x < 1000 ? String.valueOf(10*x) : String.valueOf(x);

优化器不可能删除你拥有的代码,因为使用整数除法它不是一个标识,但它似乎是一个非常复杂的方法。

顺便提一下,如果您的值肯定会在9999处达到最高,并且速度很重要,请使用静态初始化程序或懒惰地创建10,000个字符串的静态数组。

答案 4 :(得分:-1)

正如已经解释过的那样无法优化,但为什么不使用

(x%10 == 0) ? x/10 : x

转换回去?