java有divmod指令吗?

问题描述 投票:0回答:2

除了

divmod
是许多芯片组上的本机指令之外,在将数字细分为多个不同面额时也更容易看懂

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

那么有没有一个

divmod
可以同时返回除法和余数的结果呢?

java divmod
2个回答
7
投票

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

来自OpenJDK 9源代码

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;

通过使用 诊断选项打印生成的 JIT 指令,我能够看到在 C1 优化级别同时使用

idiv
irem
指令的方法在 C2 级别仅使用单个
idiv
指令.


0
投票

Java 已针对 BigInteger 或 BigDecimal 实现了此功能。这些是针对真正巨大的整数和小数,而不是极高的效率。

低级优化不是 Java 的强项,所以我建议选择退出 Java。您可以用 C 语言编写算法,甚至可以使用汇编程序。然后,如果您需要在 Java 应用程序中使用它,您始终可以将其设为库。然后,通过 Java Native Interface,您可以在应用程序中使用该库。

© www.soinside.com 2019 - 2024. All rights reserved.