java有一个divmod指令吗?

时间:2017-10-24 08:34:27

标签: java divmod

除了 services.AddMvc(options => { options.Filters.Add((new CustomAuthAttribute()); }); 是许多芯片组的本地指令之外,在以多个不同面额细分数字时,它的眼睛也更容易

(例如毫秒 - >日期时间转换,或美分 - >硬币面额转换)。

那么是否有divmod同时返回除法结果和余数?

2 个答案:

答案 0 :(得分:2)

如果支持,HotSpot JIT编译器将使用单个divmod操作替换针对相同参数的除法和模运算。因此,尽管这可能无法解决可读性问题,但您不必担心性能。

From the OpenJDK 9 source code

  case Op_ModI:
    if (UseDivMod) {
      // Check if a%b and a/b both exist
      Node* d = n->find_similar(Op_DivI);
      if (d) {
        // Replace them with a fused divmod if supported
        if (Matcher::has_match_rule(Op_DivModI)) {
          DivModINode* divmod = DivModINode::make(n);
          d->subsume_by(divmod->div_proj(), this);
          n->subsume_by(divmod->mod_proj(), this);
        } else {
          // replace a%b with a-((a/b)*b)
          Node* mult = new MulINode(d, d->in(2));
          Node* sub  = new SubINode(d->in(1), mult);
          n->subsume_by(sub, this);
        }
      }
    }
    break;

通过使用diagnostic options to print the generated JIT instructions,我能够看到在C1优化级别同时使用idivirem指令的方法在以下位置仅使用了一条idiv指令: C2级。

答案 1 :(得分:1)

Java已经为BigInteger或BigDecimal实现了这个功能。这些是用于非常大的整数和十进制数,而不是极端效率。

低级优化不是Java的优势,所以我建议选择退出Java。您可以在C中制作算法,甚至可以使用Assembler。然后,如果您需要在Java应用程序中使用它,您始终可以将其设置为库。然后,使用Java Native Interface,您可以在应用程序中使用该库。