除了divmod是许多芯片组上的 native 指令外,将数字分割为多个不同面额时,它在眼睛上也容易得多

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

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

最佳答案

如果支持,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指令的方法在C2级别上仅使用了一个idiv指令。

关于java - Java是否有divmod指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46905740/

10-10 08:06