On Friday 11 April 2008 16:21, j16sdiz at freenetproject.org wrote:
> Author: j16sdiz
> Date: 2008-04-11 15:21:31 +0000 (Fri, 11 Apr 2008)
> New Revision: 19188
>
> Removed:
> trunk/freenet/test/net/i2p/util/NativeBigIntegerTest.java
> Modified:
> trunk/freenet/src/net/i2p/util/NativeBigInteger.java
> Log:
> revert r19176
I wonder if it would be possible to have the best of both worlds? Maybe call
it from the unit tests dir, with some params to quash unnecessary output?
>
>
> Modified: trunk/freenet/src/net/i2p/util/NativeBigInteger.java
> ===================================================================
> --- trunk/freenet/src/net/i2p/util/NativeBigInteger.java 2008-04-11
> 15:18:35
UTC (rev 19187)
> +++ trunk/freenet/src/net/i2p/util/NativeBigInteger.java 2008-04-11
> 15:21:31
UTC (rev 19188)
> @@ -74,6 +74,16 @@
> * implementation, as above. This way the user would download the correct
jbigi.jar
> * (and not all of the libraries for platforms/OSes they don't need) and
would specify
> * -Djbigi.impl=native.</p>
> + *
> + * <p>Running this class by itself does a basic unit test and benchmarks
the
> + * NativeBigInteger.modPow/doubleValue vs. the
BigInteger.modPow/doubleValue by running a 2Kbit op 100
> + * times. At the end of each test, if the native implementation is loaded
this will output
> + * something like:</p>
> + * <pre>
> + * native run time: 6090ms (60ms each)
> + * java run time: 68067ms (673ms each)
> + * native = 8.947066860593239% of pure java time
> + * </pre>
> *
> * <p>If the native implementation is not loaded, it will start by
saying:</p>
> * <pre>
> @@ -259,6 +269,124 @@
> }
>
> /**
> + * <p>Compare the BigInteger.modPow/doubleValue vs the
NativeBigInteger.modPow/doubleValue of some
> + * really big (2Kbit) numbers 100 different times and benchmark the
> + * performance (or shit a brick if they don't match). </p>
> + *
> + */
> + public static void main(String args[]) {
> + runModPowTest(100);
> + runDoubleValueTest(100);
> + }
> +
> + /* the sample numbers are elG generator/prime so we can test with
reasonable numbers */
> + private final static byte[] _sampleGenerator = new
BigInteger("2").toByteArray();
> + private final static byte[] _samplePrime = new
BigInteger("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
+ "15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16).toByteArray();
> +
> + private static void runModPowTest(int numRuns) {
> + System.out.println("DEBUG: Warming up the random number
> generator...");
> + SecureRandom rand = new SecureRandom();
> + rand.nextBoolean();
> + System.out.println("DEBUG: Random number generator warmed up");
> +
> + BigInteger jg = new BigInteger(_sampleGenerator);
> + BigInteger jp = new BigInteger(_samplePrime);
> +
> + long totalTime = 0;
> + long javaTime = 0;
> +
> + int runsProcessed = 0;
> + for(runsProcessed = 0; runsProcessed < numRuns;
> runsProcessed++) {
> + BigInteger bi = new BigInteger(2048, rand);
> + NativeBigInteger g = new
> NativeBigInteger(_sampleGenerator);
> + NativeBigInteger p = new NativeBigInteger(_samplePrime);
> + NativeBigInteger k = new NativeBigInteger(1,
> bi.toByteArray());
> + long beforeModPow = System.currentTimeMillis();
> + BigInteger myValue = g.modPow(k, p);
> + long afterModPow = System.currentTimeMillis();
> + BigInteger jval = jg.modPow(bi, jp);
> + long afterJavaModPow = System.currentTimeMillis();
> +
> + totalTime += (afterModPow - beforeModPow);
> + javaTime += (afterJavaModPow - afterModPow);
> + if(!myValue.equals(jval)) {
> + System.err.println("ERROR: [" + runsProcessed +
> "]\tnative modPow !=
java modPow");
> + System.err.println("ERROR: native modPow value:
> " +
myValue.toString());
> + System.err.println("ERROR: java modPow value: "
> + jval.toString());
> + System.err.println("ERROR: run time: " +
> totalTime + "ms (" +
(totalTime / (runsProcessed + 1)) + "ms each)");
> + break;
> + } else
> + System.out.println("DEBUG: current run time: "
> + (afterModPow -
beforeModPow) + "ms (total: " + totalTime + "ms, " + (totalTime /
(runsProcessed + 1)) + "ms each)");
> + }
> + System.out.println("INFO: run time: " + totalTime + "ms (" +
> (totalTime /
(runsProcessed + 1)) + "ms each)");
> + if(numRuns == runsProcessed)
> + System.out.println("INFO: " + runsProcessed + " runs
> complete without
any errors");
> + else
> + System.out.println("ERROR: " + runsProcessed + " runs
> until we got an
error");
> +
> + if(_nativeOk) {
> + System.out.println("native run time: \t" + totalTime +
> "ms (" +
(totalTime / (runsProcessed + 1)) + "ms each)");
> + System.out.println("java run time: \t" + javaTime +
> "ms (" +
(javaTime / (runsProcessed + 1)) + "ms each)");
> + System.out.println("native = " + ((totalTime * 100.0d)
> / (double)
javaTime) + "% of pure java time");
> + } else {
> + System.out.println("java run time: \t" + javaTime + "ms
> (" + (javaTime /
(runsProcessed + 1)) + "ms each)");
> + System.out.println("However, we couldn't load the
> native library, so
this doesn't test much");
> + }
> + }
> +
> + private static void runDoubleValueTest(int numRuns) {
> + System.out.println("DEBUG: Warming up the random number
> generator...");
> + SecureRandom rand = new SecureRandom();
> + rand.nextBoolean();
> + System.out.println("DEBUG: Random number generator warmed up");
> +
> + BigInteger jg = new BigInteger(_sampleGenerator);
> +
> + long totalTime = 0;
> + long javaTime = 0;
> +
> + int MULTIPLICATOR = 50000; //Run the doubleValue() calls within
> a loop
since they are pretty fast..
> + int runsProcessed = 0;
> + for(runsProcessed = 0; runsProcessed < numRuns;
> runsProcessed++) {
> + NativeBigInteger g = new
> NativeBigInteger(_sampleGenerator);
> + long beforeDoubleValue = System.currentTimeMillis();
> + double dNative = 0;
> + for(int mult = 0; mult < MULTIPLICATOR; mult++)
> + dNative = g.doubleValue();
> + long afterDoubleValue = System.currentTimeMillis();
> + double jval = 0;
> + for(int mult = 0; mult < MULTIPLICATOR; mult++)
> + jval = jg.doubleValue();
> + long afterJavaDoubleValue = System.currentTimeMillis();
> +
> + totalTime += (afterDoubleValue - beforeDoubleValue);
> + javaTime += (afterJavaDoubleValue - afterDoubleValue);
> + if(dNative != jval) {
> + System.err.println("ERROR: [" + runsProcessed +
> "]\tnative double !=
java double");
> + System.err.println("ERROR: native double value:
> " + dNative);
> + System.err.println("ERROR: java double value: "
> + jval);
> + System.err.println("ERROR: run time: " +
> totalTime + "ms (" +
(totalTime / (runsProcessed + 1)) + "ms each)");
> + break;
> + } else
> + System.out.println("DEBUG: current run time: "
> + (afterDoubleValue -
beforeDoubleValue) + "ms (total: " + totalTime + "ms, " + (totalTime /
(runsProcessed + 1)) + "ms each)");
> + }
> + System.out.println("INFO: run time: " + totalTime + "ms (" +
> (totalTime /
(runsProcessed + 1)) + "ms each)");
> + if(numRuns == runsProcessed)
> + System.out.println("INFO: " + runsProcessed + " runs
> complete without
any errors");
> + else
> + System.out.println("ERROR: " + runsProcessed + " runs
> until we got an
error");
> +
> + if(_nativeOk) {
> + System.out.println("native run time: \t" + totalTime +
> "ms (" +
(totalTime / (runsProcessed + 1)) + "ms each)");
> + System.out.println("java run time: \t" + javaTime +
> "ms (" +
(javaTime / (runsProcessed + 1)) + "ms each)");
> + System.out.println("native = " + ((totalTime * 100.0d)
> / (double)
javaTime) + "% of pure java time");
> + } else {
> + System.out.println("java run time: \t" + javaTime + "ms
> (" + (javaTime /
(runsProcessed + 1)) + "ms each)");
> + System.out.println("However, we couldn't load the
> native library, so
this doesn't test much");
> + }
> + }
> +
> + /**
> * <p>Do whatever we can to load up the native library backing this
BigInteger's native methods.
> * If it can find a custom built jbigi.dll / libjbigi.so, it'll use
> that.
Otherwise
> * it'll try to look in the classpath for the correct library (see
loadFromResource).
>
> Deleted: trunk/freenet/test/net/i2p/util/NativeBigIntegerTest.java
> ===================================================================
> --- trunk/freenet/test/net/i2p/util/NativeBigIntegerTest.java 2008-04-11
15:18:35 UTC (rev 19187)
> +++ trunk/freenet/test/net/i2p/util/NativeBigIntegerTest.java 2008-04-11
15:21:31 UTC (rev 19188)
> @@ -1,60 +0,0 @@
> -package net.i2p.util;
> -
> -import java.math.BigInteger;
> -import java.security.SecureRandom;
> -
> -import net.i2p.util.NativeBigInteger;
> -
> -import junit.framework.TestCase;
> -
> -public class NativeBigIntegerTest extends TestCase {
> - private final static int NUM_TEST = 5;
> -
> - /* the sample numbers are elG generator/prime so we can test with
reasonable numbers */
> - private final static byte[] _sampleGenerator = new
BigInteger("2").toByteArray();
> - private final static byte[] _samplePrime = new
BigInteger("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
+ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
+ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
+ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
+ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
+ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
+ "83655D23DCA3AD961C62F356208552BB9ED529077096966D"
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
+ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
+ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
+ "15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16).toByteArray();
> -
> - public void testDoubleValue() {
> - SecureRandom rand = new SecureRandom();
> - rand.nextBoolean();
> -
> - BigInteger jg = new BigInteger(_sampleGenerator);
> -
> - int MULTIPLICATOR = 50000; //Run the doubleValue() calls within
> a loop
since they are pretty fast..
> - int runsProcessed = 0;
> - for (runsProcessed = 0; runsProcessed < NUM_TEST;
> runsProcessed++) {
> - NativeBigInteger g = new
> NativeBigInteger(_sampleGenerator);
> -
> - double dNative = 0;
> - for (int mult = 0; mult < MULTIPLICATOR; mult++)
> - dNative = g.doubleValue();
> - double jval = 0;
> - for (int mult = 0; mult < MULTIPLICATOR; mult++)
> - jval = jg.doubleValue();
> -
> - assertEquals(jval, dNative, Double.MIN_VALUE);
> - }
> - }
> -
> - public void testModPow() {
> - // Warming up the random number generator...
> - SecureRandom rand = new SecureRandom();
> - rand.nextBoolean();
> -
> - BigInteger jg = new BigInteger(_sampleGenerator);
> - BigInteger jp = new BigInteger(_samplePrime);
> -
> - int runsProcessed = 0;
> - for (runsProcessed = 0; runsProcessed < NUM_TEST;
> runsProcessed++) {
> - BigInteger bi = new BigInteger(2048, rand);
> - NativeBigInteger g = new
> NativeBigInteger(_sampleGenerator);
> - NativeBigInteger p = new NativeBigInteger(_samplePrime);
> - NativeBigInteger k = new NativeBigInteger(1,
> bi.toByteArray());
> -
> - BigInteger myValue = g.modPow(k, p);
> - BigInteger jval = jg.modPow(bi, jp);
> -
> - assertEquals(jval, myValue);
> - }
> - }
> -}
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080411/b1039bbb/attachment.pgp>