Don't like ads? PRO users don't see any ads ;-)
Guest

Android FloatBuffer benchmark

By: a guest on Sep 7th, 2010  |  syntax: Java  |  size: 4.18 KB  |  hits: 287  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.  
  2. package droid.ryanm.buffertest;
  3.  
  4. import java.nio.ByteBuffer;
  5. import java.nio.ByteOrder;
  6. import java.nio.FloatBuffer;
  7. import java.nio.IntBuffer;
  8. import java.util.Random;
  9.  
  10. import android.app.Activity;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.widget.ScrollView;
  14. import android.widget.TextView;
  15.  
  16. /**
  17.  * @author ryanm
  18.  */
  19. public class BufferTest extends Activity
  20. {
  21.         private ScrollView sv;
  22.  
  23.         private TextView tv;
  24.  
  25.         private ByteBuffer bb;
  26.  
  27.         private FloatBuffer floats;
  28.  
  29.         private IntBuffer ints;
  30.  
  31.         private float[] data;
  32.  
  33.         private int[] intData;
  34.  
  35.         private Thread testThread = new Thread( "Buffer perf test" ) {
  36.                 @Override
  37.                 public void run()
  38.                 {
  39.                         int e = 10000;
  40.  
  41.                         bb = ByteBuffer.allocateDirect( 4 * e ).order( ByteOrder.nativeOrder() );
  42.                         floats = bb.asFloatBuffer();
  43.                         ints = bb.asIntBuffer();
  44.  
  45.                         data = data( e );
  46.                         intData = new int[ e ];
  47.  
  48.                         e = 16;
  49.                         test( e *= 2 );
  50.                         test( e *= 2 );
  51.                         test( e *= 2 );
  52.                         test( e *= 2 );
  53.                         test( e *= 2 );
  54.                         test( e *= 2 );
  55.                         test( e *= 2 );
  56.                         test( e *= 2 );
  57.                         test( e *= 2 );
  58.                         test( 10000 );
  59.                 };
  60.         };
  61.  
  62.         private void test( int elements )
  63.         {
  64.                 int time = 1000;
  65.                 log( elements + " elements" );
  66.                 singlePut( data, elements, floats, time );
  67.                 bulkPut( data, elements, floats, time );
  68.                 bulkIntPut( intData, elements, ints, time );
  69.                 bulkConvertPut( data, elements, ints, time );
  70.         }
  71.  
  72.         private void singlePut( float[] data, int elements, FloatBuffer target, int testTime )
  73.         {
  74.                 long start = System.currentTimeMillis();
  75.                 long elapsed = 0;
  76.                 int reps = 0;
  77.  
  78.                 target.clear();
  79.  
  80.                 do
  81.                 {
  82.                         for( int i = 0; i < elements; i++ )
  83.                         {
  84.                                 target.put( i, data[ i ] );
  85.                         }
  86.                         reps++;
  87.                         elapsed = System.currentTimeMillis() - start;
  88.                 }
  89.                 while( elapsed < testTime );
  90.  
  91.                 long bytes = ( long ) elements * ( long ) reps * 4;
  92.  
  93.                 log( "Single\t\t" + bytes / elapsed + " kbps" );
  94.         }
  95.  
  96.         private void bulkPut( float[] data, int elements, FloatBuffer target, int testTime )
  97.         {
  98.                 long start = System.currentTimeMillis();
  99.                 long elapsed = 0;
  100.                 int reps = 0;
  101.  
  102.                 target.clear();
  103.  
  104.                 do
  105.                 {
  106.                         target.put( data, 0, elements );
  107.                         target.flip();
  108.  
  109.                         reps++;
  110.                         elapsed = System.currentTimeMillis() - start;
  111.                 }
  112.                 while( elapsed < testTime );
  113.  
  114.                 long bytes = ( long ) elements * ( long ) reps * 4;
  115.  
  116.                 log( "Bulk\t\t" + bytes / elapsed + " kbps" );
  117.         }
  118.  
  119.         private void bulkConvertPut( float[] data, int elements, IntBuffer target, int testTime )
  120.         {
  121.                 long start = System.currentTimeMillis();
  122.                 long elapsed = 0;
  123.                 int reps = 0;
  124.  
  125.                 target.clear();
  126.  
  127.                 do
  128.                 {
  129.                         for( int i = 0; i < elements; i++ )
  130.                         {
  131.                                 intData[ i ] = Float.floatToIntBits( data[ i ] );
  132.                         }
  133.  
  134.                         target.put( intData, 0, elements );
  135.                         target.flip();
  136.  
  137.                         reps++;
  138.                         elapsed = System.currentTimeMillis() - start;
  139.                 }
  140.                 while( elapsed < testTime );
  141.  
  142.                 long bytes = ( long ) elements * ( long ) reps * 4;
  143.  
  144.                 log( "convert\t" + bytes / elapsed + " kbps" );
  145.         }
  146.  
  147.         private void bulkIntPut( int[] data, int elements, IntBuffer target, int testTime )
  148.         {
  149.                 long start = System.currentTimeMillis();
  150.                 long elapsed = 0;
  151.                 int reps = 0;
  152.  
  153.                 target.clear();
  154.  
  155.                 do
  156.                 {
  157.                         target.put( intData, 0, elements );
  158.                         target.flip();
  159.  
  160.                         reps++;
  161.                         elapsed = System.currentTimeMillis() - start;
  162.                 }
  163.                 while( elapsed < testTime );
  164.  
  165.                 long bytes = ( long ) elements * ( long ) reps * 4;
  166.  
  167.                 log( "int\t\t\t" + bytes / elapsed + " kbps" );
  168.         }
  169.  
  170.         @Override
  171.         public void onCreate( Bundle savedInstanceState )
  172.         {
  173.                 super.onCreate( savedInstanceState );
  174.  
  175.                 tv = new TextView( this );
  176.                 sv = new ScrollView( this );
  177.                 sv.addView( tv );
  178.                 setContentView( sv );
  179.  
  180.                 testThread.start();
  181.         }
  182.  
  183.         private void log( final String s )
  184.         {
  185.                 Log.i( "BufferTest", s );
  186.  
  187.                 tv.post( new Runnable() {
  188.  
  189.                         @Override
  190.                         public void run()
  191.                         {
  192.                                 StringBuilder buff = new StringBuilder( tv.getText() );
  193.                                 buff.append( s ).append( "\n" );
  194.                                 tv.setText( buff.toString() );
  195.                         }
  196.                 } );
  197.         }
  198.  
  199.         private float[] data( int elements )
  200.         {
  201.                 float[] data = new float[ elements ];
  202.                 Random rng = new Random();
  203.  
  204.                 for( int i = 0; i < data.length; i++ )
  205.                 {
  206.                         data[ i ] = 100 * rng.nextFloat();
  207.                 }
  208.  
  209.                 return data;
  210.         }
  211. }