|
| 1 | + |
| 2 | +Benchmark results on a cheaper hardware: |
| 3 | + |
| 4 | +### IIR filters |
| 5 | + |
| 6 | +Different implementations of IIR filters are compared: |
| 7 | + |
| 8 | +- ```IirFilter``` (ver.0.9.2 of NWaves) |
| 9 | +- ```IirFilter``` (ver.0.9.4 of NWaves) |
| 10 | +- ```IirFilter``` (as of ver.0.9.5 of NWaves) |
| 11 | +- ```ZiFilter``` |
| 12 | + |
| 13 | +```ZiFilter``` is noticeably faster than ```IirFilter``` in case when the number of zeros is equal to number of poles (e.g. BiQuad and Butterworth filters). |
| 14 | + |
| 15 | +In case of custom IIR filter (3 zeros and 1 pole) ```ZiFilter``` filtering is slower. |
| 16 | + |
| 17 | +``` ini |
| 18 | + |
| 19 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 20 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 21 | +.NET SDK=5.0.100 |
| 22 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 23 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 24 | + |
| 25 | + |
| 26 | +``` |
| 27 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 28 | +|----------------------------- |----------:|---------:|---------:|---------:|---------:|---------:|----------:| |
| 29 | +| FilterVersion092BiQuad | 57.20 ms | 0.133 ms | 0.124 ms | 222.2222 | 222.2222 | 222.2222 | 19 MB | |
| 30 | +| FilterVersion094BiQuad | 63.14 ms | 0.147 ms | 0.138 ms | 250.0000 | 250.0000 | 250.0000 | 19 MB | |
| 31 | +| FilterVersion095BiQuad | 55.41 ms | 0.106 ms | 0.094 ms | 200.0000 | 200.0000 | 200.0000 | 19 MB | |
| 32 | +| FilterZiBiQuad | 41.44 ms | 0.130 ms | 0.122 ms | 307.6923 | 307.6923 | 307.6923 | 19 MB | |
| 33 | +| FilterVersion092Butterworth6 | 103.57 ms | 0.377 ms | 0.353 ms | 200.0000 | 200.0000 | 200.0000 | 19 MB | |
| 34 | +| FilterVersion094Butterworth6 | 108.64 ms | 0.309 ms | 0.274 ms | 200.0000 | 200.0000 | 200.0000 | 19 MB | |
| 35 | +| FilterVersion095Butterworth6 | 96.03 ms | 0.186 ms | 0.165 ms | 333.3333 | 333.3333 | 333.3333 | 19 MB | |
| 36 | +| FilterZiButterworth6 | 74.91 ms | 0.216 ms | 0.202 ms | 285.7143 | 285.7143 | 285.7143 | 19 MB | |
| 37 | +| FilterVersion092Custom | 56.77 ms | 0.175 ms | 0.164 ms | 222.2222 | 222.2222 | 222.2222 | 19 MB | |
| 38 | +| FilterVersion094Custom | 62.86 ms | 0.136 ms | 0.121 ms | 250.0000 | 250.0000 | 250.0000 | 19 MB | |
| 39 | +| FilterVersion095Custom | 54.71 ms | 0.101 ms | 0.090 ms | 200.0000 | 200.0000 | 200.0000 | 19 MB | |
| 40 | +| FilterZiCustom | 58.90 ms | 0.146 ms | 0.122 ms | 222.2222 | 222.2222 | 222.2222 | 19 MB | |
| 41 | + |
| 42 | + |
| 43 | +### FIR Filters |
| 44 | + |
| 45 | +Different implementations of FIR filters are compared: |
| 46 | + |
| 47 | +- ```FirFilter``` (ver.0.9.2 - 0.9.4 of NWaves) |
| 48 | +- ```FirFilter``` (as of ver.0.9.5 of NWaves) |
| 49 | +- ```ZiFilter``` |
| 50 | + |
| 51 | +This benchmark demonstrates that the newer version of ```FirFilter``` is faster. ```ZiFilter``` is expectedly slower than ```FirFilter```. |
| 52 | + |
| 53 | +``` ini |
| 54 | + |
| 55 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 56 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 57 | +.NET SDK=5.0.100 |
| 58 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 59 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 60 | + |
| 61 | + |
| 62 | +``` |
| 63 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 64 | +|------------------------- |----------:|----------:|----------:|---------:|---------:|---------:|----------:| |
| 65 | +| FilterVersion092Kernel5 | 9.782 ms | 0.1544 ms | 0.1444 ms | 234.3750 | 234.3750 | 234.3750 | 4 MB | |
| 66 | +| FilterVersion095Kernel5 | 9.697 ms | 0.1397 ms | 0.1307 ms | 187.5000 | 187.5000 | 187.5000 | 4 MB | |
| 67 | +| ZiFilterKernel5 | 11.069 ms | 0.2179 ms | 0.2140 ms | 281.2500 | 281.2500 | 281.2500 | 4 MB | |
| 68 | +| FilterVersion092Kernel35 | 51.575 ms | 0.0910 ms | 0.0807 ms | 300.0000 | 300.0000 | 300.0000 | 4 MB | |
| 69 | +| FilterVersion095Kernel35 | 36.210 ms | 0.0834 ms | 0.0780 ms | 285.7143 | 285.7143 | 285.7143 | 4 MB | |
| 70 | +| ZiFilterKernel35 | 68.211 ms | 0.0804 ms | 0.0752 ms | 250.0000 | 250.0000 | 250.0000 | 4 MB | |
| 71 | + |
| 72 | + |
| 73 | +### FFT |
| 74 | + |
| 75 | +Different FFTs are compared: |
| 76 | + |
| 77 | +- RealFft (single precision) : ```float[]``` and ```Span<float>``` |
| 78 | +- RealFft64 (double precision) : ```double[]``` and ```Span<double>``` |
| 79 | +- (Complex)Fft (single precision) : ```float[]``` and ```Span<float>``` |
| 80 | + |
| 81 | +``` ini |
| 82 | + |
| 83 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 84 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 85 | +.NET SDK=5.0.100 |
| 86 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 87 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 88 | + |
| 89 | + |
| 90 | +``` |
| 91 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 92 | +|---------------- |---------:|---------:|---------:|--------:|------:|------:|----------:| |
| 93 | +| FftArray | 14.25 ms | 0.023 ms | 0.021 ms | 15.6250 | - | - | 24,648 B | |
| 94 | +| FftSpan | 15.62 ms | 0.024 ms | 0.023 ms | - | - | - | - | |
| 95 | +| Fft64Array | 14.53 ms | 0.030 ms | 0.028 ms | 15.6250 | - | - | 49,224 B | |
| 96 | +| Fft64Span | 15.66 ms | 0.055 ms | 0.051 ms | - | - | - | - | |
| 97 | +| ComplexFftArray | 17.41 ms | 0.081 ms | 0.075 ms | - | - | - | 32,864 B | |
| 98 | +| ComplexFftSpan | 16.67 ms | 0.033 ms | 0.031 ms | - | - | - | - | |
| 99 | + |
| 100 | + |
| 101 | +### FIR filters vs. BlockConvolvers |
| 102 | + |
| 103 | +This benchmark demonstrates that OLS and OLA block covolvers are expectedly much faster than FIR filters for longer filter kernels. |
| 104 | + |
| 105 | +``` ini |
| 106 | + |
| 107 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 108 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 109 | +.NET SDK=5.0.100 |
| 110 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 111 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 112 | + |
| 113 | + |
| 114 | +``` |
| 115 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 116 | +|--------------------- |----------:|----------:|----------:|---------:|---------:|---------:|----------:| |
| 117 | +| FirFilterKernel21 | 2.837 ms | 0.0093 ms | 0.0087 ms | 121.0938 | 121.0938 | 121.0938 | 391 KB | |
| 118 | +| OverlapAddKernel21 | 3.466 ms | 0.0052 ms | 0.0049 ms | 121.0938 | 121.0938 | 121.0938 | 391 KB | |
| 119 | +| OverlapSaveKernel21 | 3.452 ms | 0.0065 ms | 0.0061 ms | 121.0938 | 121.0938 | 121.0938 | 391 KB | |
| 120 | +| FirFilterKernel101 | 10.854 ms | 0.0208 ms | 0.0194 ms | 109.3750 | 109.3750 | 109.3750 | 391 KB | |
| 121 | +| OverlapAddKernel101 | 4.076 ms | 0.0069 ms | 0.0065 ms | 117.1875 | 117.1875 | 117.1875 | 391 KB | |
| 122 | +| OverlapSaveKernel101 | 4.035 ms | 0.0087 ms | 0.0081 ms | 117.1875 | 117.1875 | 117.1875 | 391 KB | |
| 123 | +| FirFilterKernel315 | 30.350 ms | 0.0446 ms | 0.0417 ms | 93.7500 | 93.7500 | 93.7500 | 392 KB | |
| 124 | +| OverlapAddKernel315 | 4.374 ms | 0.0082 ms | 0.0076 ms | 117.1875 | 117.1875 | 117.1875 | 392 KB | |
| 125 | +| OverlapSaveKernel315 | 4.329 ms | 0.0069 ms | 0.0062 ms | 117.1875 | 117.1875 | 117.1875 | 392 KB | |
| 126 | + |
| 127 | + |
| 128 | +### Moving average filters |
| 129 | + |
| 130 | +Recursive implementation of moving average filter (```MovingAverageRecursiveFilter```) is expectedly much faster than FIR subclass (```MovingAverageFilter```). |
| 131 | + |
| 132 | + |
| 133 | +``` ini |
| 134 | + |
| 135 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 136 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 137 | +.NET SDK=5.0.100 |
| 138 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 139 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 140 | + |
| 141 | + |
| 142 | +``` |
| 143 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 144 | +|----------------------------- |---------:|----------:|----------:|---------:|---------:|---------:|----------:| |
| 145 | +| MovingAverageFilter | 9.167 ms | 0.1758 ms | 0.1726 ms | 218.7500 | 218.7500 | 218.7500 | 4 MB | |
| 146 | +| MovingAverageFilterRecursive | 3.856 ms | 0.0759 ms | 0.0779 ms | 218.7500 | 218.7500 | 218.7500 | 4 MB | |
| 147 | + |
| 148 | + |
| 149 | +### Median filters |
| 150 | + |
| 151 | +```MedianFilter``` is significantly faster than ```MedianFilter2```. |
| 152 | + |
| 153 | +``` ini |
| 154 | + |
| 155 | +BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1237 (21H1/May2021Update) |
| 156 | +Intel Pentium CPU G3460 3.50GHz, 1 CPU, 2 logical and 2 physical cores |
| 157 | +.NET SDK=5.0.100 |
| 158 | + [Host] : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 159 | + DefaultJob : .NET 5.0.0 (5.0.20.51904), X64 RyuJIT |
| 160 | + |
| 161 | + |
| 162 | +``` |
| 163 | +| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 164 | +|-------------- |----------:|----------:|----------:|---------:|---------:|---------:|----------:| |
| 165 | +| MedianFilter | 9.327 ms | 0.0201 ms | 0.0188 ms | 109.3750 | 109.3750 | 109.3750 | 391 KB | |
| 166 | +| MedianFilter2 | 14.030 ms | 0.0198 ms | 0.0185 ms | 109.3750 | 109.3750 | 109.3750 | 391 KB | |
0 commit comments