Skip to content

Commit fa3e07e

Browse files
committed
update benchmarks and docs
1 parent 0e694cd commit fa3e07e

13 files changed

+169
-1
lines changed
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

NWaves.Benchmarks/Program.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace NWaves.Benchmarks
1+
using BenchmarkDotNet.Running;
2+
3+
namespace NWaves.Benchmarks
24
{
35
class Program
46
{

NWaves.Benchmarks/README.md

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
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

Comments
 (0)