我正在使用BigIntegers进行计算,该循环使用一个循环,该循环调用multiple()大约1000亿次,并且从BigInteger创建新对象的过程非常缓慢。我希望有人编写或找到了MutableBigInteger类。我在java.math包中找到了MutableBigInteger,但是它是私有(private)的,当我将代码复制到新类中时,会出现很多错误,其中大多数我不知道如何解决。
像MutableBigInteger这样的Java类有哪些实现可以修改适当的值?
最佳答案
他们有什么特殊原因导致您不能使用反射来访问该类吗?
我能够做到这一点而没有任何问题,下面是代码:
public static void main(String[] args) throws Exception {
Constructor<?> constructor = Class.forName("java.math.MutableBigInteger").getDeclaredConstructor(int.class);
constructor.setAccessible(true);
Object x = constructor.newInstance(new Integer(17));
Object y = constructor.newInstance(new Integer(19));
Constructor<?> constructor2 = Class.forName("java.math.MutableBigInteger").getDeclaredConstructor(x.getClass());
constructor2.setAccessible(true);
Object z = constructor.newInstance(new Integer(0));
Object w = constructor.newInstance(new Integer(0));
Method m = x.getClass().getDeclaredMethod("multiply", new Class[] { x.getClass(), x.getClass()});
Method m2 = x.getClass().getDeclaredMethod("mul", new Class[] { int.class, x.getClass()});
m.setAccessible(true);
m2.setAccessible(true);
// Slightly faster than BigInteger
for (int i = 0; i < 200000; i++) {
m.invoke(x, y, z);
w = z;
z = x;
x = w;
}
// Significantly faster than BigInteger and the above loop
for (int i = 0; i < 200000; i++) {
m2.invoke(x, 19, x);
}
BigInteger n17 = new BigInteger("17");
BigInteger n19 = new BigInteger("19");
BigInteger bigX = n17;
// Slowest
for (int i = 0; i < 200000; i++) {
bigX = bigX.multiply(n19);
}
}
编辑:
我决定多玩一点,看来java.math.MutableBigInteger的行为与您期望的不完全相同。
当您相乘时,它的运行方式有所不同,当为其分配自身时必须增加内部数组的大小时,它将引发一个异常。我猜是可以预料的。相反,我必须在对象周围进行交换,以便始终将结果放置到其他MutableBigInteger中。经过几千次计算,反射的开销可以忽略不计。随着操作数量的增加,MutableBigInteger最终会领先并提供越来越好的性能。如果您将“mul”函数与整数基元用作要乘以的值,则MutableBigInteger的运行速度将比使用BigInteger快10倍。我想这真的归结为您需要乘以什么值。无论哪种方式,如果您使用MutableBigInteger的反射运行此计算“一千亿次”,它的运行速度都将比BigInteger快,因为内存分配“更少”,并且可以缓存反射操作,从而减少了反射的开销。
关于java - Java可变BigInteger类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7863023/