You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/11/27 15:50:38 UTC

svn commit: r1039692 - /tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java

Author: markt
Date: Sat Nov 27 14:50:37 2010
New Revision: 1039692

URL: http://svn.apache.org/viewvc?rev=1039692&view=rev
Log:
Add a /dev/urandom vs SecureRandom benchmark

Modified:
    tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java

Modified: tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java?rev=1039692&r1=1039691&r2=1039692&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java (original)
+++ tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java Sat Nov 27 14:50:37 2010
@@ -16,6 +16,12 @@
  */
 package org.apache.catalina.session;
 
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.SecureRandom;
+
 import junit.framework.TestCase;
 
 import org.apache.catalina.Session;
@@ -59,7 +65,7 @@ public class Benchmarks extends TestCase
     }
     
     
-    public void doTestManagerBaseGenerateSessionId(int threadCount,
+    private void doTestManagerBaseGenerateSessionId(int threadCount,
             int iterCount) throws Exception {
 
         // Create a default session manager
@@ -156,7 +162,7 @@ public class Benchmarks extends TestCase
     }
     
     
-    public void doTestManagerBaseCreateSession(int threadCount, int iterCount) {
+    private void doTestManagerBaseCreateSession(int threadCount, int iterCount) {
 
         // Create a default session manager
         StandardManager mgr = new StandardManager();
@@ -208,7 +214,6 @@ public class Benchmarks extends TestCase
         System.out.println(result.toString());
     }
     
-    
     private static final class TestThreadCreateSession implements Runnable {
 
         private ManagerBase mgr;
@@ -227,4 +232,113 @@ public class Benchmarks extends TestCase
             }
         }
     }
+    
+    
+    /*
+     * SecureRandom vs. reading /dev/urandom. Very different performance noted
+     * on some platforms.
+     * 
+     * Results on markt's 2-core OSX dev box
+     *              SecureRandom  /dev/urandom
+     *  1 thread  -   ~4,100ms      ~3,500ms
+     *  2 threads -  ~10,700ms      ~5,100ms
+     *  4 threads -  ~20,700ms     ~10,700ms
+     */
+    public void testSecureRandomVsDevURandom() throws Exception {
+        doTestSecureRandomVsDevURandom(1, 1000000);
+        doTestSecureRandomVsDevURandom(2, 1000000);
+        doTestSecureRandomVsDevURandom(4, 1000000);
+    }
+
+    private void doTestSecureRandomVsDevURandom(int threadCount, int iterCount) {
+        doTestSecureRandomVsDevURandomInner(threadCount, iterCount, true);
+        doTestSecureRandomVsDevURandomInner(threadCount, iterCount, false);
+    }
+
+    private void doTestSecureRandomVsDevURandomInner(int threadCount,
+            int iterCount, boolean useSecureRandom) {
+
+        Thread[] threads = new Thread[threadCount];
+        
+        for (int i = 0; i < threadCount; i++) {
+            if (useSecureRandom) {
+                threads[i] = new Thread(new TestThreadSecureRandom(iterCount));
+            } else {
+                threads[i] = new Thread(new TestThreadDevUrandom(iterCount));
+            }
+        }
+        
+        long start = System.currentTimeMillis();
+        
+        for (int i = 0; i < threadCount; i++) {
+            threads[i].start();
+        }
+        for (int i = 0; i < threadCount; i++) {
+            try {
+                threads[i].join();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                fail(e.getMessage());
+            }
+        }
+        long end = System.currentTimeMillis();
+        
+        StringBuilder result = new StringBuilder();
+        if (useSecureRandom) {
+            result.append("SecureRandom ");
+        } else {
+            result.append("/dev/urandom ");
+        }
+        result.append("Threads: ");
+        result.append(threadCount);
+        result.append(", Time(ms): ");
+        result.append(end-start);
+        System.out.println(result.toString());
+    }
+
+    private static final class TestThreadSecureRandom implements Runnable {
+        
+        private SecureRandom secureRandom = new SecureRandom();
+        private byte[] bytes = new byte[16];
+        private int count;
+        
+        TestThreadSecureRandom(int iterCount) {
+            this.count = iterCount;
+        }
+
+        @Override
+        public void run() {
+            for (int i = 0; i < count; i++) {
+                secureRandom.nextBytes(bytes);
+            }
+        }
+        
+    }
+    
+    private static final class TestThreadDevUrandom implements Runnable {
+        
+        private InputStream is;
+        private byte[] bytes = new byte[16];
+        private int count;
+        
+        TestThreadDevUrandom(int iterCount) {
+            try {
+                is = new FileInputStream("/dev/urandom");
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+            this.count = iterCount;
+        }
+
+        @Override
+        public void run() {
+            try {
+                for (int i = 0; i < count; i++) {
+                    is.read(bytes);
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org