package droid.ryanm.buffertest;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ScrollView;
import android.widget.TextView;
/**
* @author ryanm
*/
public class BufferTest extends Activity
{
private ScrollView sv;
private TextView tv;
private ByteBuffer bb;
private FloatBuffer floats;
private IntBuffer ints;
private float[] data;
private int[] intData;
private Thread testThread = new Thread( "Buffer perf test" ) {
@Override
public void run()
{
int e = 10000;
bb = ByteBuffer.allocateDirect( 4 * e ).order( ByteOrder.nativeOrder() );
floats = bb.asFloatBuffer();
ints = bb.asIntBuffer();
data = data( e );
intData = new int[ e ];
e = 16;
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( e *= 2 );
test( 10000 );
};
};
private void test( int elements )
{
int time = 1000;
log( elements + " elements" );
singlePut( data, elements, floats, time );
bulkPut( data, elements, floats, time );
bulkIntPut( intData, elements, ints, time );
bulkConvertPut( data, elements, ints, time );
}
private void singlePut( float[] data, int elements, FloatBuffer target, int testTime )
{
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do
{
for( int i = 0; i < elements; i++ )
{
target.put( i, data[ i ] );
}
reps++;
elapsed = System.currentTimeMillis() - start;
}
while( elapsed < testTime );
long bytes = ( long ) elements * ( long ) reps * 4;
log( "Single\t\t" + bytes / elapsed + " kbps" );
}
private void bulkPut( float[] data, int elements, FloatBuffer target, int testTime )
{
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do
{
target.put( data, 0, elements );
target.flip();
reps++;
elapsed = System.currentTimeMillis() - start;
}
while( elapsed < testTime );
long bytes = ( long ) elements * ( long ) reps * 4;
log( "Bulk\t\t" + bytes / elapsed + " kbps" );
}
private void bulkConvertPut( float[] data, int elements, IntBuffer target, int testTime )
{
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do
{
for( int i = 0; i < elements; i++ )
{
intData[ i ] = Float.floatToIntBits( data[ i ] );
}
target.put( intData, 0, elements );
target.flip();
reps++;
elapsed = System.currentTimeMillis() - start;
}
while( elapsed < testTime );
long bytes = ( long ) elements * ( long ) reps * 4;
log( "convert\t" + bytes / elapsed + " kbps" );
}
private void bulkIntPut( int[] data, int elements, IntBuffer target, int testTime )
{
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do
{
target.put( intData, 0, elements );
target.flip();
reps++;
elapsed = System.currentTimeMillis() - start;
}
while( elapsed < testTime );
long bytes = ( long ) elements * ( long ) reps * 4;
log( "int\t\t\t" + bytes / elapsed + " kbps" );
}
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
tv = new TextView( this );
sv = new ScrollView( this );
sv.addView( tv );
setContentView( sv );
testThread.start();
}
private void log( final String s )
{
Log.i( "BufferTest", s );
tv.post( new Runnable() {
@Override
public void run()
{
StringBuilder buff = new StringBuilder( tv.getText() );
buff.append( s ).append( "\n" );
tv.setText( buff.toString() );
}
} );
}
private float[] data( int elements )
{
float[] data = new float[ elements ];
Random rng = new Random();
for( int i = 0; i < data.length; i++ )
{
data[ i ] = 100 * rng.nextFloat();
}
return data;
}
}