import java.util.Random;
public class SinCosLookupTest
{
private static final double sinLookup[] = createSinLookup();
private static final double cosLookup[] = createCosLookup();
public static void main(String[] args)
{
for (int i=10000; i<=100000; i+=10000)
{
for (int size=1000; size<=10000; size+=1000)
{
testCompute(size, i);
testLookup(size, i);
}
}
}
private static void testCompute(int size, int passes)
{
int angles[] = createRandomAngles(size);
long before = System.nanoTime();
double result = runCompute(angles, passes);
long after = System.nanoTime();
double duration = (after-before)*1e-6;
System.out.println("Compute "+size+" "+passes+" "+result+" time "+duration);
}
private static void testLookup(int size, int passes)
{
int angles[] = createRandomAngles(size);
long before = System.nanoTime();
double result = runLookup(angles, passes);
long after = System.nanoTime();
double duration = (after-before)*1e-6;
System.out.println("Lookup "+size+" "+passes+" "+result+" time "+duration);
}
private static double[] createSinLookup()
{
double result[] = new double[360];
for (int i=0; i<360; i++)
{
result[i] = Math.sin(i);
}
return result;
}
private static double[] createCosLookup()
{
double result[] = new double[360];
for (int i=0; i<360; i++)
{
result[i] = Math.cos(i);
}
return result;
}
private static double runCompute(int angles[], int passes)
{
double result = 0;
for (int i=0; i<passes; i++)
{
for (int j=0; j<angles.length; j++)
{
result += cosLookup[angles[j]];
result += sinLookup[angles[j]];
}
}
return result;
}
private static double runLookup(int angles[], int passes)
{
double result = 0;
for (int i=0; i<passes; i++)
{
for (int j=0; j<angles.length; j++)
{
result += Math.cos(angles[j]);
result += Math.sin(angles[j]);
}
}
return result;
}
private static int[] createRandomAngles(int size)
{
Random random = new Random(0);
int result[] = new int[size];
for (int i=0; i<size; i++)
{
result[i] = random.nextInt(360);
}
return result;
}
}