Package org.gudy.azureus2.core3.util.test

Source Code of org.gudy.azureus2.core3.util.test.SHA1SpeedTest

/*
* Created on Mar 12, 2004
* Created by Alon Rohter
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.core3.util.test;

import java.nio.*;
import java.util.Arrays;
import java.util.Random;

// import org.gudy.azureus2.core3.util.SHA1;
import org.gudy.azureus2.core3.util.ByteFormatter;
import org.gudy.azureus2.core3.util.SHA1;

/**
*/
public class SHA1SpeedTest {

  private static final int  BUFF_MAX_SIZE  = 4 * 1024 * 1024;

  private static final int[]  LOOPS      = { 1000000, 30000, 15000, 4000, 3000, 2000, 1200, 800 };
  private static final int[]  TESTS      = { 1, 16, 64, 256, 512, 1024, 2048, 4096 };
 
  private static final int TEST_SPEED_FACTOR = 1; // use larger numbers for less tests

  public static void main(String[] args)
  {
   
    Random rnd = new Random();

    SHA1Old oldsha = new SHA1Old();
    SHA1 newsha = new SHA1();

    ByteBuffer dBuffer = ByteBuffer.allocateDirect(BUFF_MAX_SIZE);
    ByteBuffer hBuffer = ByteBuffer.allocate(BUFF_MAX_SIZE);

    for (int i = 0; i < BUFF_MAX_SIZE; i++)
    {
      byte b = (byte) (rnd.nextInt()&0xFF);
      dBuffer.put(b);
    }
   
    dBuffer.rewind();
    hBuffer.put(dBuffer);
    hBuffer.rewind();
    dBuffer.rewind();
   

    // allow time for setting thread to high-priority
    try
    {
      System.out.println("Setting high thread priority to decrease test jitter");
      Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      Thread.sleep(2000);
    } catch (Exception ignore)
    {
    }

    for (int t = 0; t < TESTS.length; t++)
    {

      int buffsize = TESTS[t] * 1024;

      dBuffer.position(0);
      dBuffer.limit(buffsize);
      hBuffer.position(0);
      hBuffer.limit(buffsize);

     
      int loops = LOOPS[t]/TEST_SPEED_FACTOR;

      String info = " [" + buffsize / 1024 + "KB, " + loops + "x] = ";

      double totalMBytes = ((double) buffsize / (1024 * 1024)) * loops;

     
      long time;
      double speed;

     
      System.out.println("direct:");
     
      System.out.print("Old SHA1");
      time = System.currentTimeMillis();
      for (int i = 0; i < loops; i++)
      {
        oldsha.reset();
        oldsha.digest(dBuffer);
      }
      time = System.currentTimeMillis() - time;
      speed = totalMBytes / (time / (double)1024);
      System.out.println(info + time + " ms @ " + speed + " MiB/s");

     
      System.out.print("New SHA1 ");
      time = System.currentTimeMillis();
      for (int i = 0; i < loops; i++)
      {
        newsha.reset();
        newsha.digest(dBuffer);
      }
      time = System.currentTimeMillis() - time;
      speed = totalMBytes / (time / (double)1024);
      System.out.println(info + time + " ms @ " + speed + " MiB/s");

      System.out.println("heap:");
     
      System.out.print("Old SHA1");
      time = System.currentTimeMillis();
      for (int i = 0; i < loops; i++)
      {
        oldsha.reset();
        oldsha.digest(hBuffer);
      }
      time = System.currentTimeMillis() - time;
      speed = totalMBytes / (time / (double)1024);
      System.out.println(info + time + " ms @ " + speed + " MiB/s");

     
      System.out.print("New SHA1 ");
      time = System.currentTimeMillis();
      for (int i = 0; i < loops; i++)
      {
        newsha.reset();
        newsha.digest(hBuffer);
      }
      time = System.currentTimeMillis() - time;
      speed = totalMBytes / (time / (double)1024);
      System.out.println(info + time + " ms @ " + speed + " MiB/s");

      System.out.println();
    }
   
   
    System.out.println("performing randomized buffer windowing checks, this may take a while");
   
    byte[] oldd;
    byte[] newd;
    byte[] oldh;
    byte[] newh;
   
    int size;
    int offset;
   
    ByteBuffer dview;
    ByteBuffer hview;
   
    for(int i=0;i<LOOPS[1]/TEST_SPEED_FACTOR;i++)
    {
      size = rnd.nextInt(BUFF_MAX_SIZE);
      offset = rnd.nextInt(BUFF_MAX_SIZE-size-1);
     
      hBuffer.limit(offset+size);
      hBuffer.position(offset);
      dBuffer.limit(offset+size);
      dBuffer.position(offset);
     
      oldsha.reset();
      newsha.reset();
      oldh = oldsha.digest(hBuffer);
      newh = newsha.digest(hBuffer);
      oldsha.reset();
      newsha.reset();
      oldd = oldsha.digest(dBuffer);
      newd = newsha.digest(dBuffer);
     
     
      if(!Arrays.equals(oldh, newh) || !Arrays.equals(oldd, newd) || !Arrays.equals(oldd, oldh))
      {
        System.out.println("hash mismatch at offset: "+offset+" size: "+size);
        System.out.println("\t\t"+ByteFormatter.nicePrint(oldh));
        System.out.println("\t\t"+ByteFormatter.nicePrint(newh));
        System.out.println("\t\t"+ByteFormatter.nicePrint(oldd));
        System.out.println("\t\t"+ByteFormatter.nicePrint(newd));
      }
       
      if(hBuffer.limit() != offset+size || dBuffer.limit() != offset+size || hBuffer.position() != offset || dBuffer.position() != offset)
        System.out.println("buffer does not match its original state");
     
      dview = dBuffer.slice();
      hview = hBuffer.slice();
     
      oldsha.reset();
      newsha.reset();
      oldh = oldsha.digest(hview);
      newh = newsha.digest(hview);
      oldsha.reset();
      newsha.reset();
      oldd = oldsha.digest(dview);
      newd = newsha.digest(dview);
     
     
      if(!Arrays.equals(oldh, newh) || !Arrays.equals(oldd, newd) || !Arrays.equals(oldd, oldh))
      {
        System.out.println("(view) hash mismatch at offset: "+offset+" size: "+size);
        System.out.println("\t\t"+ByteFormatter.nicePrint(oldh));
        System.out.println("\t\t"+ByteFormatter.nicePrint(newh));
        System.out.println("\t\t"+ByteFormatter.nicePrint(oldd));
        System.out.println("\t\t"+ByteFormatter.nicePrint(newd));
      }
       
      if(hview.limit() != hview.capacity() || dview.limit() != dview.capacity() || hview.position() != 0 || dview.position() != 0)
        System.out.println("view buffer does not match its original state");
    }
    System.out.println("DONE");

  }

}
TOP

Related Classes of org.gudy.azureus2.core3.util.test.SHA1SpeedTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.