java 是否有 divmod 指令?
Does java have a divmod instruction?
除了 divmod
是许多芯片组上的原生指令外,在将数字细分为多个不同的面额时,它也更容易在眼睛上看到
(发生在例如毫秒 -> 日期时间转换,或美分 -> 硬币面额转换)。
那么有没有divmod
同时returns除法和余数的结果?
Java 已为 BigInteger 或 BigDecimal 实现此功能。这些适用于非常大的整数和小数,而不是极端的效率。
低级优化不是 Java 的强项,因此我建议选择退出 Java。您可以用 C 编写算法,甚至可以使用汇编程序。然后,如果您需要在 Java 应用程序中使用它,您可以随时将其设为库。然后,通过 Java 本机界面,您可以在您的应用程序中使用该库。
如果支持,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 优化级别同时使用 idiv
和 irem
指令的方法仅使用一个 idiv
C2 级别的指令。
除了 divmod
是许多芯片组上的原生指令外,在将数字细分为多个不同的面额时,它也更容易在眼睛上看到
(发生在例如毫秒 -> 日期时间转换,或美分 -> 硬币面额转换)。
那么有没有divmod
同时returns除法和余数的结果?
Java 已为 BigInteger 或 BigDecimal 实现此功能。这些适用于非常大的整数和小数,而不是极端的效率。
低级优化不是 Java 的强项,因此我建议选择退出 Java。您可以用 C 编写算法,甚至可以使用汇编程序。然后,如果您需要在 Java 应用程序中使用它,您可以随时将其设为库。然后,通过 Java 本机界面,您可以在您的应用程序中使用该库。
如果支持,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 优化级别同时使用 idiv
和 irem
指令的方法仅使用一个 idiv
C2 级别的指令。