我注意到计算机上有一件奇怪的事情。*手写除数测试比%操作员快得多。考虑最小的示例: * AMD锐龙Threadripper 2990WX,GCC 9.2.0 static int divisible_ui_p(unsigned int m, unsigned int a) { if (m <= a) { if (m == a) { return 1; } return 0; } m += a; m >>= __builtin_ctz(m); return divisible_ui_p(m, a); } 该示例受奇数a和限制m > 0。但是,可以很容易地将其推广到所有a和m。该代码只是将除法转换为一系列的加法。 现在考虑使用以下命令编译的测试程序-std=c99 -march=native -O3: for (unsigned int a …
我正在尝试通过某种内部方法获得尽可能多的性能。 Java代码是: List<DirectoryTaxonomyWriter> writers = Lists.newArrayList(); private final int taxos = 4; [...] @Override public int getParent(final int globalOrdinal) throws IOException { final int bin = globalOrdinal % this.taxos; final int ordinalInBin = globalOrdinal / this.taxos; return this.writers.get(bin).getParent(ordinalInBin) * this.taxos + bin; //global parent } 在我的探查器中,我看到其中有1%的CPU支出java.util.Objects.requireNonNull,但我什至没有这样说。在检查字节码时,我看到了: public getParent(I)I throws java/io/IOException …