00001 using System;
00002 using System.Threading;
00003
00004 namespace FFT.Test
00005 {
00006 using FFT;
00007
00008
00009
00010
00011
00012 public class PerformaceTest
00013 {
00014
00015
00016
00017 public static void Main(string[] args)
00018 {
00019
00020
00021 PerformanceTests();
00022 }
00023
00024
00025
00026
00027 protected static void PerformanceTests()
00028 {
00029 TestConvolutions(new IConvolution[] {
00030 new DirectConvolution(),
00031 new PolynomialConvolution(),
00032 new DFTConvolution(new RecursiveFFT())},
00033 new int[] {
00034 100, 200, 300, 400, 500,
00035 600, 700, 800, 900,1000}
00036 );
00037
00038 TestConvolutions(new IConvolution[] {
00039 new DirectConvolution(),
00040 new DFTConvolution(new RecursiveFFT())},
00041 new int[] {
00042 1000, 2000, 3000, 4000, 5000,
00043 6000, 7000, 8000, 9000,10000}
00044 );
00045
00046 TestConvolutions(new IConvolution[] {
00047 new DFTConvolution(new RecursiveFFT()),
00048 new DFTConvolution(new IterativeFFT())},
00049 new int[] {
00050 1<<5, 1<<6, 1<<7, 1<<8, 1<<9,
00051 1<<10, 1<<11, 1<<12, 1<<13, 1<<14,
00052 1<<15, 1<<16, 1<<17, 1<<18, 1<<19}
00053 );
00054
00055 TestConvolutions(new IConvolution[] {
00056 new DFTConvolution(new IterativeFFT()),
00057 new DFTConvolution(new ParallelFFT(2)),
00058 new DFTConvolution(new ParallelFFT(4))},
00059 new int[] {
00060 1<<8, 1<<9,
00061 1<<10, 1<<11, 1<<12, 1<<13, 1<<14,
00062 1<<15, 1<<16, 1<<17, 1<<18, 1<<19}
00063 );
00064
00065 TestConvolutions(new IConvolution[] {
00066 new DFTConvolution(new IterativeFFT()),
00067 new DFTConvolution(new ParallelFFT (2)),
00068 new DFTConvolution(new ParallelFFT(4))},
00069 new int[] {
00070 1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21}
00071 );
00072
00073 }
00074
00075
00076
00077
00078
00079
00080 public static void TestConvolutions(IConvolution[] conv, int[] sizes)
00081 {
00082 TestConvolutions(conv,sizes,true);
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092 public static void TestConvolutions(IConvolution[] conv, int[] sizes, bool precision)
00093 {
00094 System.Console.Write("| Size |");
00095 for (int i = 0; i < conv.Length; i++) {
00096 if (precision) {
00097 System.Console.Write("{0,25}|",conv[i].ToString());
00098 } else {
00099 System.Console.Write("{0,11}|",conv[i].ToString());
00100 }
00101 }
00102 System.Console.Write('\n');
00103
00104 System.Console.Write("+---------+");
00105 for (int i = 0; i < conv.Length; i++) {
00106 if (precision) {
00107 System.Console.Write("-------------------------+");
00108 } else {
00109 System.Console.Write("-----------+");
00110 }
00111 }
00112 System.Console.Write('\n');
00113
00114 Complex[] a = null;
00115 Complex[] b = null;
00116 Complex[] c = null;
00117
00118 foreach (int size in sizes) {
00119 System.Console.Write("| {0,7:d} |",size);
00120 GenerateData(size,ref a,ref b,ref c);
00121 for (int i = 0; i < conv.Length; i++) {
00122 TestConvolution(conv[i],a,b,c,precision);
00123 }
00124 System.Console.Write("\n");
00125 }
00126
00127 System.Console.Write("\n");
00128 }
00129
00130
00131
00132
00133 protected static int reps = 1;
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 protected static void TestConvolution(IConvolution conv,
00145 Complex[] a,
00146 Complex[] b,
00147 Complex[] c,
00148 bool precision)
00149 {
00150
00151 TimeSpan[] duration = new TimeSpan[reps];
00152 double error = 0;
00153 for (int i = 0; i < reps; i++) {
00154 DateTime startTime = DateTime.Now;
00155
00156 Complex[] res = conv.Convolution(a,b);
00157
00158 DateTime stopTime = DateTime.Now;
00159 duration[i] = stopTime - startTime;
00160 error = Utils.dist(c,res);
00161 }
00162
00163 Array.Sort(duration);
00164 System.Console.Write(" {0:00}.{1:000} s. ",
00165 duration[reps/2].TotalSeconds,
00166 duration[reps/2].Milliseconds);
00167
00168 if (precision) {
00169 System.Console.Write(" ({0,10:e3}) |",error);
00170 } else {
00171 System.Console.Write("|");
00172 }
00173
00174
00175 GC.Collect();
00176 GC.WaitForPendingFinalizers();
00177
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 protected static void GenerateData(int n,
00193 ref Complex[] a,
00194 ref Complex[] b,
00195 ref Complex[] c)
00196 {
00197 a = new Complex[n];
00198 b = new Complex[n];
00199 c = new Complex[2*n-1];
00200
00201 for (int i = 0; i < n; i++) {
00202 a[i] = 1;
00203 b[i] = 1;
00204 c[i] = i+1;
00205 c[2*n-i-2] = i+1;
00206 }
00207
00208 }
00209
00210 }
00211
00212 }