/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.core.row; import java.util.Date; import org.pentaho.di.core.exception.KettleValueException; import org.pentaho.di.core.row.value.ValueMetaBoolean; import org.pentaho.di.core.row.value.ValueMetaDate; import org.pentaho.di.core.row.value.ValueMetaInteger; import org.pentaho.di.core.row.value.ValueMetaNumber; import org.pentaho.di.core.row.value.ValueMetaString; import org.pentaho.di.core.util.StringUtil; public class SpeedTest { private Object[] rowString10; private Object[] rowString100; private Object[] rowString1000; private Object[] rowMixed10; private Object[] rowMixed100; private Object[] rowMixed1000; private RowMetaInterface metaString10; private RowMetaInterface metaMixed10; private RowMetaInterface metaString100; private RowMetaInterface metaMixed100; private RowMetaInterface metaString1000; private RowMetaInterface metaMixed1000; public SpeedTest() { rowString10 = new Object[10]; rowString100 = new Object[100]; rowString1000 = new Object[1000]; rowMixed10 = new Object[50]; rowMixed100 = new Object[500]; rowMixed1000 = new Object[5000]; metaString10 = new RowMeta(); metaMixed10 = new RowMeta(); metaString100 = new RowMeta(); metaMixed100 = new RowMeta(); metaString1000 = new RowMeta(); metaMixed1000 = new RowMeta(); for ( int i = 0; i < 10; i++ ) { populateMetaAndData( i, rowString10, metaString10, rowMixed10, metaMixed10 ); } for ( int i = 0; i < 100; i++ ) { populateMetaAndData( i, rowString100, metaString100, rowMixed100, metaMixed100 ); } for ( int i = 0; i < 1000; i++ ) { populateMetaAndData( i, rowString1000, metaString1000, rowMixed1000, metaMixed1000 ); } } private static void populateMetaAndData( int i, Object[] rowString10, RowMetaInterface metaString10, Object[] rowMixed10, RowMetaInterface metaMixed10 ) { rowString10[i] = StringUtil.generateRandomString( 20, "", "", false ); ValueMetaInterface meta = new ValueMetaString( "String" + ( i + 1 ), 20, 0 ); metaString10.addValueMeta( meta ); rowMixed10[i * 5 + 0] = StringUtil.generateRandomString( 20, "", "", false ); ValueMetaInterface meta0 = new ValueMetaString( "String" + ( i * 5 + 1 ), 20, 0 ); metaMixed10.addValueMeta( meta0 ); rowMixed10[i * 5 + 1] = new Date(); ValueMetaInterface meta1 = new ValueMetaDate( "String" + ( i * 5 + 1 ) ); metaMixed10.addValueMeta( meta1 ); rowMixed10[i * 5 + 2] = new Double( Math.random() * 1000000 ); ValueMetaInterface meta2 = new ValueMetaNumber( "String" + ( i * 5 + 1 ), 12, 4 ); metaMixed10.addValueMeta( meta2 ); rowMixed10[i * 5 + 3] = new Long( (long) ( Math.random() * 1000000 ) ); ValueMetaInterface meta3 = new ValueMetaInteger( "String" + ( i * 5 + 1 ), 8, 0 ); metaMixed10.addValueMeta( meta3 ); rowMixed10[i * 5 + 4] = Boolean.valueOf( Math.random() > 0.5 ? true : false ); ValueMetaInterface meta4 = new ValueMetaBoolean( "String" + ( i * 5 + 1 ) ); metaMixed10.addValueMeta( meta4 ); } public long runTestStrings10( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaString10.cloneRow( rowString10 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public long runTestMixed10( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaMixed10.cloneRow( rowMixed10 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public long runTestStrings100( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaString100.cloneRow( rowString100 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public long runTestMixed100( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaMixed100.cloneRow( rowMixed100 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public long runTestStrings1000( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaString1000.cloneRow( rowString1000 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public long runTestMixed1000( int iterations ) throws KettleValueException { long startTime = System.currentTimeMillis(); for ( int i = 0; i < iterations; i++ ) { metaMixed1000.cloneRow( rowMixed1000 ); } long stopTime = System.currentTimeMillis(); return stopTime - startTime; } public static final int ITERATIONS = 1000000; public static void main( String[] args ) throws KettleValueException { SpeedTest speedTest = new SpeedTest(); long timeString10 = speedTest.runTestStrings10( ITERATIONS ); System.out.println( "Time to run 'String10' test " + ITERATIONS + " times : " + timeString10 + " ms (" + ( 1000 * ITERATIONS / timeString10 ) + " r/s)" ); long timeMixed10 = speedTest.runTestMixed10( ITERATIONS ); System.out.println( "Time to run 'Mixed10' test " + ITERATIONS + " times : " + timeMixed10 + " ms (" + ( 1000 * ITERATIONS / timeMixed10 ) + " r/s)" ); System.out.println(); long timeString100 = speedTest.runTestStrings100( ITERATIONS ); System.out.println( "Time to run 'String100' test " + ITERATIONS + " times : " + timeString100 + " ms (" + ( 1000 * ITERATIONS / timeString100 ) + " r/s)" ); long timeMixed100 = speedTest.runTestMixed100( ITERATIONS ); System.out.println( "Time to run 'Mixed100' test " + ITERATIONS + " times : " + timeMixed100 + " ms (" + ( 1000 * ITERATIONS / timeMixed100 ) + " r/s)" ); System.out.println(); long timeString1000 = speedTest.runTestStrings1000( ITERATIONS ); System.out.println( "Time to run 'String1000' test " + ITERATIONS + " times : " + timeString1000 + " ms (" + ( 1000 * ITERATIONS / timeString1000 ) + " r/s)" ); long timeMixed1000 = speedTest.runTestMixed1000( ITERATIONS ); System.out.println( "Time to run 'Mixed1000' test " + ITERATIONS + " times : " + timeMixed1000 + " ms (" + ( 1000 * ITERATIONS / timeMixed1000 ) + " r/s)" ); System.out.println(); } }