| /* |
| * Copyright 2020 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <array> |
| #include <climits> |
| #include <cstdlib> |
| #include <random> |
| #include <vector> |
| |
| #include <benchmark/benchmark.h> |
| |
| #include <audio_utils/BiquadFilter.h> |
| #include <audio_utils/format.h> |
| |
| #pragma GCC diagnostic ignored "-Wunused-function" // we use override array assignment |
| |
| static constexpr size_t DATA_SIZE = 1024; |
| // The coefficients is a HPF with sampling frequency as 48000, center frequency as 600, |
| // and Q as 0.707. As all the coefficients are not zero, they can be used to benchmark |
| // the non-zero optimization of BiquadFilter. |
| // The benchmark test will iterate the channel count from 1 to 2. The occupancy will be |
| // iterate from 1 to 31. In that case, it is possible to test the performance of cases |
| // with different coefficients as zero. |
| static constexpr float REF_COEFS[] = {0.9460f, -1.8919f, 0.9460f, -1.8890f, 0.8949f}; |
| |
| static void BM_BiquadFilter1D(benchmark::State& state) { |
| using android::audio_utils::BiquadFilter; |
| |
| bool doParallel = (state.range(0) == 1); |
| // const size_t channelCount = state.range(1); |
| const size_t filters = 1; |
| |
| std::vector<float> input(DATA_SIZE); |
| std::array<float, android::audio_utils::kBiquadNumCoefs> coefs; |
| |
| // Initialize input buffer and coefs with deterministic pseudo-random values |
| constexpr std::minstd_rand::result_type SEED = 42; // arbitrary choice. |
| std::minstd_rand gen(SEED); |
| constexpr float amplitude = 1.0f; |
| std::uniform_real_distribution<> dis(-amplitude, amplitude); |
| for (size_t i = 0; i < DATA_SIZE; ++i) { |
| input[i] = dis(gen); |
| } |
| |
| android::audio_utils::BiquadFilter parallel(filters, coefs); |
| std::vector<std::unique_ptr<BiquadFilter<float>>> biquads(filters); |
| for (auto& biquad : biquads) { |
| biquad.reset(new BiquadFilter<float>(1, coefs)); |
| } |
| |
| // Run the test |
| float *data = input.data(); |
| while (state.KeepRunning()) { |
| benchmark::DoNotOptimize(data); |
| if (doParallel) { |
| parallel.process1D(data, DATA_SIZE); |
| } else { |
| for (auto& biquad : biquads) { |
| biquad->process(data, data, DATA_SIZE); |
| } |
| } |
| benchmark::ClobberMemory(); |
| } |
| } |
| |
| static void BiquadFilter1DArgs(benchmark::internal::Benchmark* b) { |
| for (int k = 0; k < 2; k++) // 0 for normal random data, 1 for subnormal random data |
| b->Args({k}); |
| } |
| |
| BENCHMARK(BM_BiquadFilter1D)->Apply(BiquadFilter1DArgs); |
| |
| /******************************************************************* |
| A test result running on Pixel 4XL for comparison. |
| |
| Parameterized Test BM_BiquadFilter1D/A |
| <A> is 0 or 1 indicating if the input data is subnormal or not. |
| |
| Parameterized Test BM_BiquadFilter<TYPE>/A/B/C |
| <A> is 0 or 1 indicating if the input data is subnormal or not. |
| <B> is the channel count, starting from 1 |
| <C> indicates the occupancy of the coefficients as a bitmask (1 - 31) representing |
| b0, b1, b2, a0, a1. 31 indicates all Biquad coefficients are non-zero. |
| |
| ----------------------------------------------------------------------------------- |
| Benchmark Time CPU Iterations |
| ----------------------------------------------------------------------------------- |
| BM_BiquadFilter1D/0 559 ns 558 ns 1255778 |
| BM_BiquadFilter1D/1 563 ns 561 ns 1246802 |
| BM_BiquadFilterFloatOptimized/0/1/31 2050 ns 2044 ns 341777 |
| BM_BiquadFilterFloatOptimized/0/2/31 2381 ns 2374 ns 296608 |
| BM_BiquadFilterFloatOptimized/0/3/31 2838 ns 2831 ns 247298 |
| BM_BiquadFilterFloatOptimized/0/4/31 2453 ns 2446 ns 285869 |
| BM_BiquadFilterFloatOptimized/0/5/31 2875 ns 2867 ns 244307 |
| BM_BiquadFilterFloatOptimized/0/6/31 3183 ns 3174 ns 220149 |
| BM_BiquadFilterFloatOptimized/0/7/31 3915 ns 3903 ns 179368 |
| BM_BiquadFilterFloatOptimized/0/8/31 3163 ns 3153 ns 222068 |
| BM_BiquadFilterFloatOptimized/0/9/31 3963 ns 3953 ns 177162 |
| BM_BiquadFilterFloatOptimized/0/10/31 4208 ns 4197 ns 166789 |
| BM_BiquadFilterFloatOptimized/0/11/31 5317 ns 5301 ns 131817 |
| BM_BiquadFilterFloatOptimized/0/12/31 4209 ns 4198 ns 166785 |
| BM_BiquadFilterFloatOptimized/0/13/31 5295 ns 5278 ns 132467 |
| BM_BiquadFilterFloatOptimized/0/14/31 5479 ns 5463 ns 128159 |
| BM_BiquadFilterFloatOptimized/0/15/31 6568 ns 6547 ns 106912 |
| BM_BiquadFilterFloatOptimized/0/16/31 5442 ns 5425 ns 129023 |
| BM_BiquadFilterFloatOptimized/0/17/31 7527 ns 7505 ns 93266 |
| BM_BiquadFilterFloatOptimized/0/18/31 7981 ns 7955 ns 88032 |
| BM_BiquadFilterFloatOptimized/0/19/31 8574 ns 8549 ns 81866 |
| BM_BiquadFilterFloatOptimized/0/20/31 7832 ns 7806 ns 89698 |
| BM_BiquadFilterFloatOptimized/0/21/31 8683 ns 8659 ns 80847 |
| BM_BiquadFilterFloatOptimized/0/22/31 8829 ns 8807 ns 79372 |
| BM_BiquadFilterFloatOptimized/0/23/31 9627 ns 9596 ns 72948 |
| BM_BiquadFilterFloatOptimized/0/24/31 8662 ns 8641 ns 80994 |
| BM_BiquadFilterFloatOptimized/0/1/1 559 ns 558 ns 1255056 |
| BM_BiquadFilterFloatOptimized/0/1/2 649 ns 648 ns 1080979 |
| BM_BiquadFilterFloatOptimized/0/1/3 649 ns 647 ns 1081110 |
| BM_BiquadFilterFloatOptimized/0/1/4 846 ns 844 ns 829190 |
| BM_BiquadFilterFloatOptimized/0/1/5 848 ns 845 ns 829260 |
| BM_BiquadFilterFloatOptimized/0/1/6 842 ns 840 ns 833883 |
| BM_BiquadFilterFloatOptimized/0/1/7 846 ns 844 ns 830816 |
| BM_BiquadFilterFloatOptimized/0/1/8 2181 ns 2175 ns 321856 |
| BM_BiquadFilterFloatOptimized/0/1/9 2247 ns 2241 ns 312645 |
| BM_BiquadFilterFloatOptimized/0/1/10 2038 ns 2032 ns 344762 |
| BM_BiquadFilterFloatOptimized/0/1/11 2044 ns 2038 ns 343491 |
| BM_BiquadFilterFloatOptimized/0/1/12 2051 ns 2045 ns 342775 |
| BM_BiquadFilterFloatOptimized/0/1/13 2047 ns 2041 ns 343409 |
| BM_BiquadFilterFloatOptimized/0/1/14 2041 ns 2035 ns 344295 |
| BM_BiquadFilterFloatOptimized/0/1/15 2050 ns 2044 ns 342031 |
| BM_BiquadFilterFloatOptimized/0/1/16 2049 ns 2042 ns 342867 |
| BM_BiquadFilterFloatOptimized/0/1/17 2047 ns 2042 ns 343005 |
| BM_BiquadFilterFloatOptimized/0/1/18 2040 ns 2034 ns 344447 |
| BM_BiquadFilterFloatOptimized/0/1/19 2050 ns 2044 ns 343828 |
| BM_BiquadFilterFloatOptimized/0/1/20 2049 ns 2044 ns 343190 |
| BM_BiquadFilterFloatOptimized/0/1/21 2048 ns 2042 ns 342839 |
| BM_BiquadFilterFloatOptimized/0/1/22 2040 ns 2035 ns 344409 |
| BM_BiquadFilterFloatOptimized/0/1/23 2048 ns 2043 ns 343306 |
| BM_BiquadFilterFloatOptimized/0/1/24 2049 ns 2043 ns 342812 |
| BM_BiquadFilterFloatOptimized/0/1/25 2049 ns 2043 ns 342580 |
| BM_BiquadFilterFloatOptimized/0/1/26 2039 ns 2033 ns 344247 |
| BM_BiquadFilterFloatOptimized/0/1/27 2046 ns 2040 ns 341970 |
| BM_BiquadFilterFloatOptimized/0/1/28 2050 ns 2045 ns 342407 |
| BM_BiquadFilterFloatOptimized/0/1/29 2046 ns 2041 ns 343675 |
| BM_BiquadFilterFloatOptimized/0/1/30 2041 ns 2035 ns 344616 |
| BM_BiquadFilterFloatOptimized/0/1/31 2051 ns 2046 ns 343258 |
| BM_BiquadFilterFloatOptimized/0/2/1 610 ns 608 ns 1151019 |
| BM_BiquadFilterFloatOptimized/0/2/2 806 ns 804 ns 871214 |
| BM_BiquadFilterFloatOptimized/0/2/3 802 ns 800 ns 876072 |
| BM_BiquadFilterFloatOptimized/0/2/4 1492 ns 1488 ns 471009 |
| BM_BiquadFilterFloatOptimized/0/2/5 1493 ns 1489 ns 469536 |
| BM_BiquadFilterFloatOptimized/0/2/6 1495 ns 1491 ns 469503 |
| BM_BiquadFilterFloatOptimized/0/2/7 1493 ns 1488 ns 470487 |
| BM_BiquadFilterFloatOptimized/0/2/8 2240 ns 2234 ns 313239 |
| BM_BiquadFilterFloatOptimized/0/2/9 2240 ns 2234 ns 313156 |
| BM_BiquadFilterFloatOptimized/0/2/10 2234 ns 2228 ns 313789 |
| BM_BiquadFilterFloatOptimized/0/2/11 2236 ns 2230 ns 313706 |
| BM_BiquadFilterFloatOptimized/0/2/12 2388 ns 2381 ns 293618 |
| BM_BiquadFilterFloatOptimized/0/2/13 2375 ns 2367 ns 295150 |
| BM_BiquadFilterFloatOptimized/0/2/14 2366 ns 2358 ns 293452 |
| BM_BiquadFilterFloatOptimized/0/2/15 2387 ns 2381 ns 292701 |
| BM_BiquadFilterFloatOptimized/0/2/16 2389 ns 2383 ns 292393 |
| BM_BiquadFilterFloatOptimized/0/2/17 2415 ns 2408 ns 292606 |
| BM_BiquadFilterFloatOptimized/0/2/18 2333 ns 2327 ns 302560 |
| BM_BiquadFilterFloatOptimized/0/2/19 2378 ns 2372 ns 301407 |
| BM_BiquadFilterFloatOptimized/0/2/20 2379 ns 2373 ns 297827 |
| BM_BiquadFilterFloatOptimized/0/2/21 2412 ns 2406 ns 293297 |
| BM_BiquadFilterFloatOptimized/0/2/22 2340 ns 2334 ns 296729 |
| BM_BiquadFilterFloatOptimized/0/2/23 2383 ns 2376 ns 293035 |
| BM_BiquadFilterFloatOptimized/0/2/24 2365 ns 2359 ns 294749 |
| BM_BiquadFilterFloatOptimized/0/2/25 2407 ns 2400 ns 293857 |
| BM_BiquadFilterFloatOptimized/0/2/26 2342 ns 2336 ns 301276 |
| BM_BiquadFilterFloatOptimized/0/2/27 2387 ns 2380 ns 296218 |
| BM_BiquadFilterFloatOptimized/0/2/28 2393 ns 2386 ns 304486 |
| BM_BiquadFilterFloatOptimized/0/2/29 2382 ns 2375 ns 296040 |
| BM_BiquadFilterFloatOptimized/0/2/30 2352 ns 2345 ns 296032 |
| BM_BiquadFilterFloatOptimized/0/2/31 2390 ns 2384 ns 295280 |
| BM_BiquadFilterFloatOptimized/0/3/1 1014 ns 1011 ns 692380 |
| BM_BiquadFilterFloatOptimized/0/3/2 1358 ns 1354 ns 516490 |
| BM_BiquadFilterFloatOptimized/0/3/3 1361 ns 1357 ns 514686 |
| BM_BiquadFilterFloatOptimized/0/3/4 2280 ns 2275 ns 307713 |
| BM_BiquadFilterFloatOptimized/0/3/5 2283 ns 2277 ns 307354 |
| BM_BiquadFilterFloatOptimized/0/3/6 2273 ns 2267 ns 308595 |
| BM_BiquadFilterFloatOptimized/0/3/7 2281 ns 2274 ns 307849 |
| BM_BiquadFilterFloatOptimized/0/3/8 2316 ns 2309 ns 303835 |
| BM_BiquadFilterFloatOptimized/0/3/9 2305 ns 2299 ns 304559 |
| BM_BiquadFilterFloatOptimized/0/3/10 2302 ns 2296 ns 304427 |
| BM_BiquadFilterFloatOptimized/0/3/11 2302 ns 2296 ns 304901 |
| BM_BiquadFilterFloatOptimized/0/3/12 2842 ns 2835 ns 246870 |
| BM_BiquadFilterFloatOptimized/0/3/13 2839 ns 2832 ns 246584 |
| BM_BiquadFilterFloatOptimized/0/3/14 2846 ns 2838 ns 246569 |
| BM_BiquadFilterFloatOptimized/0/3/15 2838 ns 2830 ns 246748 |
| BM_BiquadFilterFloatOptimized/0/3/16 2841 ns 2834 ns 247114 |
| BM_BiquadFilterFloatOptimized/0/3/17 2835 ns 2827 ns 247560 |
| BM_BiquadFilterFloatOptimized/0/3/18 2848 ns 2840 ns 246585 |
| BM_BiquadFilterFloatOptimized/0/3/19 2847 ns 2839 ns 246700 |
| BM_BiquadFilterFloatOptimized/0/3/20 2843 ns 2836 ns 246965 |
| BM_BiquadFilterFloatOptimized/0/3/21 2838 ns 2830 ns 247591 |
| BM_BiquadFilterFloatOptimized/0/3/22 2845 ns 2838 ns 246791 |
| BM_BiquadFilterFloatOptimized/0/3/23 2841 ns 2833 ns 247057 |
| BM_BiquadFilterFloatOptimized/0/3/24 2845 ns 2837 ns 246545 |
| BM_BiquadFilterFloatOptimized/0/3/25 2836 ns 2829 ns 247397 |
| BM_BiquadFilterFloatOptimized/0/3/26 2847 ns 2839 ns 246664 |
| BM_BiquadFilterFloatOptimized/0/3/27 2842 ns 2834 ns 247627 |
| BM_BiquadFilterFloatOptimized/0/3/28 2841 ns 2833 ns 247121 |
| BM_BiquadFilterFloatOptimized/0/3/29 2841 ns 2834 ns 246763 |
| BM_BiquadFilterFloatOptimized/0/3/30 2845 ns 2837 ns 246597 |
| BM_BiquadFilterFloatOptimized/0/3/31 2840 ns 2832 ns 246777 |
| BM_BiquadFilterFloatOptimized/0/4/1 649 ns 648 ns 1080107 |
| BM_BiquadFilterFloatOptimized/0/4/2 807 ns 805 ns 869257 |
| BM_BiquadFilterFloatOptimized/0/4/3 801 ns 799 ns 871956 |
| BM_BiquadFilterFloatOptimized/0/4/4 833 ns 831 ns 842148 |
| BM_BiquadFilterFloatOptimized/0/4/5 834 ns 832 ns 841869 |
| BM_BiquadFilterFloatOptimized/0/4/6 834 ns 832 ns 841650 |
| BM_BiquadFilterFloatOptimized/0/4/7 833 ns 831 ns 841856 |
| BM_BiquadFilterFloatOptimized/0/4/8 2198 ns 2192 ns 319428 |
| BM_BiquadFilterFloatOptimized/0/4/9 2198 ns 2192 ns 319357 |
| BM_BiquadFilterFloatOptimized/0/4/10 2208 ns 2202 ns 318871 |
| BM_BiquadFilterFloatOptimized/0/4/11 2199 ns 2194 ns 318145 |
| BM_BiquadFilterFloatOptimized/0/4/12 2459 ns 2452 ns 285278 |
| BM_BiquadFilterFloatOptimized/0/4/13 2367 ns 2361 ns 296930 |
| BM_BiquadFilterFloatOptimized/0/4/14 2506 ns 2500 ns 278066 |
| BM_BiquadFilterFloatOptimized/0/4/15 2448 ns 2441 ns 286096 |
| BM_BiquadFilterFloatOptimized/0/4/16 2450 ns 2443 ns 286116 |
| BM_BiquadFilterFloatOptimized/0/4/17 2508 ns 2501 ns 276874 |
| BM_BiquadFilterFloatOptimized/0/4/18 2366 ns 2359 ns 297429 |
| BM_BiquadFilterFloatOptimized/0/4/19 2437 ns 2430 ns 288050 |
| BM_BiquadFilterFloatOptimized/0/4/20 2455 ns 2448 ns 287233 |
| BM_BiquadFilterFloatOptimized/0/4/21 2381 ns 2374 ns 294302 |
| BM_BiquadFilterFloatOptimized/0/4/22 2510 ns 2503 ns 278301 |
| BM_BiquadFilterFloatOptimized/0/4/23 2457 ns 2450 ns 286840 |
| BM_BiquadFilterFloatOptimized/0/4/24 2427 ns 2420 ns 287276 |
| BM_BiquadFilterFloatOptimized/0/4/25 2531 ns 2525 ns 279592 |
| BM_BiquadFilterFloatOptimized/0/4/26 2382 ns 2375 ns 293634 |
| BM_BiquadFilterFloatOptimized/0/4/27 2453 ns 2446 ns 284497 |
| BM_BiquadFilterFloatOptimized/0/4/28 2454 ns 2447 ns 286420 |
| BM_BiquadFilterFloatOptimized/0/4/29 2368 ns 2362 ns 296231 |
| BM_BiquadFilterFloatOptimized/0/4/30 2522 ns 2515 ns 278613 |
| BM_BiquadFilterFloatOptimized/0/4/31 2448 ns 2440 ns 286406 |
| BM_BiquadFilterFloatOptimized/1/1/1 559 ns 558 ns 1255148 |
| BM_BiquadFilterFloatOptimized/1/1/2 649 ns 648 ns 1081116 |
| BM_BiquadFilterFloatOptimized/1/1/3 649 ns 647 ns 1081221 |
| BM_BiquadFilterFloatOptimized/1/1/4 847 ns 844 ns 829296 |
| BM_BiquadFilterFloatOptimized/1/1/5 848 ns 845 ns 828816 |
| BM_BiquadFilterFloatOptimized/1/1/6 843 ns 840 ns 833346 |
| BM_BiquadFilterFloatOptimized/1/1/7 845 ns 843 ns 829793 |
| BM_BiquadFilterFloatOptimized/1/1/8 2181 ns 2175 ns 321841 |
| BM_BiquadFilterFloatOptimized/1/1/9 2251 ns 2244 ns 311848 |
| BM_BiquadFilterFloatOptimized/1/1/10 2038 ns 2031 ns 344681 |
| BM_BiquadFilterFloatOptimized/1/1/11 2044 ns 2038 ns 342723 |
| BM_BiquadFilterFloatOptimized/1/1/12 2050 ns 2044 ns 341921 |
| BM_BiquadFilterFloatOptimized/1/1/13 2045 ns 2040 ns 342953 |
| BM_BiquadFilterFloatOptimized/1/1/14 2040 ns 2034 ns 343741 |
| BM_BiquadFilterFloatOptimized/1/1/15 2053 ns 2047 ns 343974 |
| BM_BiquadFilterFloatOptimized/1/1/16 2049 ns 2044 ns 342365 |
| BM_BiquadFilterFloatOptimized/1/1/17 2049 ns 2044 ns 343153 |
| BM_BiquadFilterFloatOptimized/1/1/18 2041 ns 2035 ns 344287 |
| BM_BiquadFilterFloatOptimized/1/1/19 2049 ns 2044 ns 341823 |
| BM_BiquadFilterFloatOptimized/1/1/20 2046 ns 2041 ns 342703 |
| BM_BiquadFilterFloatOptimized/1/1/21 2047 ns 2042 ns 342940 |
| BM_BiquadFilterFloatOptimized/1/1/22 2039 ns 2033 ns 344725 |
| BM_BiquadFilterFloatOptimized/1/1/23 2049 ns 2043 ns 342315 |
| BM_BiquadFilterFloatOptimized/1/1/24 2047 ns 2041 ns 342189 |
| BM_BiquadFilterFloatOptimized/1/1/25 2052 ns 2046 ns 342359 |
| BM_BiquadFilterFloatOptimized/1/1/26 2040 ns 2034 ns 343700 |
| BM_BiquadFilterFloatOptimized/1/1/27 2046 ns 2040 ns 342555 |
| BM_BiquadFilterFloatOptimized/1/1/28 2050 ns 2044 ns 343258 |
| BM_BiquadFilterFloatOptimized/1/1/29 2047 ns 2041 ns 343619 |
| BM_BiquadFilterFloatOptimized/1/1/30 2040 ns 2034 ns 344029 |
| BM_BiquadFilterFloatOptimized/1/1/31 2048 ns 2043 ns 341732 |
| BM_BiquadFilterFloatOptimized/1/2/1 610 ns 608 ns 1151198 |
| BM_BiquadFilterFloatOptimized/1/2/2 806 ns 804 ns 871704 |
| BM_BiquadFilterFloatOptimized/1/2/3 801 ns 799 ns 874910 |
| BM_BiquadFilterFloatOptimized/1/2/4 1491 ns 1487 ns 470715 |
| BM_BiquadFilterFloatOptimized/1/2/5 1494 ns 1489 ns 471029 |
| BM_BiquadFilterFloatOptimized/1/2/6 1495 ns 1491 ns 469531 |
| BM_BiquadFilterFloatOptimized/1/2/7 1492 ns 1488 ns 470330 |
| BM_BiquadFilterFloatOptimized/1/2/8 2240 ns 2234 ns 313315 |
| BM_BiquadFilterFloatOptimized/1/2/9 2240 ns 2235 ns 313286 |
| BM_BiquadFilterFloatOptimized/1/2/10 2236 ns 2230 ns 314133 |
| BM_BiquadFilterFloatOptimized/1/2/11 2237 ns 2230 ns 313614 |
| BM_BiquadFilterFloatOptimized/1/2/12 2397 ns 2391 ns 298604 |
| BM_BiquadFilterFloatOptimized/1/2/13 2361 ns 2354 ns 293931 |
| BM_BiquadFilterFloatOptimized/1/2/14 2339 ns 2333 ns 298869 |
| BM_BiquadFilterFloatOptimized/1/2/15 2386 ns 2379 ns 299268 |
| BM_BiquadFilterFloatOptimized/1/2/16 2392 ns 2386 ns 295784 |
| BM_BiquadFilterFloatOptimized/1/2/17 2392 ns 2386 ns 293455 |
| BM_BiquadFilterFloatOptimized/1/2/18 2330 ns 2323 ns 296814 |
| BM_BiquadFilterFloatOptimized/1/2/19 2360 ns 2354 ns 296827 |
| BM_BiquadFilterFloatOptimized/1/2/20 2366 ns 2360 ns 296032 |
| BM_BiquadFilterFloatOptimized/1/2/21 2417 ns 2410 ns 293865 |
| BM_BiquadFilterFloatOptimized/1/2/22 2332 ns 2326 ns 293377 |
| BM_BiquadFilterFloatOptimized/1/2/23 2395 ns 2388 ns 292926 |
| BM_BiquadFilterFloatOptimized/1/2/24 2367 ns 2361 ns 294222 |
| BM_BiquadFilterFloatOptimized/1/2/25 2398 ns 2392 ns 291347 |
| BM_BiquadFilterFloatOptimized/1/2/26 2359 ns 2353 ns 297696 |
| BM_BiquadFilterFloatOptimized/1/2/27 2378 ns 2371 ns 297585 |
| BM_BiquadFilterFloatOptimized/1/2/28 2386 ns 2380 ns 293528 |
| BM_BiquadFilterFloatOptimized/1/2/29 2378 ns 2372 ns 295612 |
| BM_BiquadFilterFloatOptimized/1/2/30 2329 ns 2323 ns 298587 |
| BM_BiquadFilterFloatOptimized/1/2/31 2384 ns 2378 ns 294842 |
| BM_BiquadFilterFloatOptimized/1/3/1 1014 ns 1011 ns 692362 |
| BM_BiquadFilterFloatOptimized/1/3/2 1358 ns 1354 ns 516958 |
| BM_BiquadFilterFloatOptimized/1/3/3 1360 ns 1356 ns 515306 |
| BM_BiquadFilterFloatOptimized/1/3/4 2281 ns 2275 ns 307489 |
| BM_BiquadFilterFloatOptimized/1/3/5 2282 ns 2276 ns 307433 |
| BM_BiquadFilterFloatOptimized/1/3/6 2273 ns 2267 ns 308657 |
| BM_BiquadFilterFloatOptimized/1/3/7 2280 ns 2275 ns 307889 |
| BM_BiquadFilterFloatOptimized/1/3/8 2312 ns 2306 ns 303925 |
| BM_BiquadFilterFloatOptimized/1/3/9 2306 ns 2300 ns 304209 |
| BM_BiquadFilterFloatOptimized/1/3/10 2303 ns 2296 ns 304815 |
| BM_BiquadFilterFloatOptimized/1/3/11 2302 ns 2296 ns 304802 |
| BM_BiquadFilterFloatOptimized/1/3/12 2838 ns 2830 ns 247177 |
| BM_BiquadFilterFloatOptimized/1/3/13 2843 ns 2835 ns 247072 |
| BM_BiquadFilterFloatOptimized/1/3/14 2848 ns 2840 ns 246262 |
| BM_BiquadFilterFloatOptimized/1/3/15 2840 ns 2833 ns 246995 |
| BM_BiquadFilterFloatOptimized/1/3/16 2842 ns 2834 ns 246802 |
| BM_BiquadFilterFloatOptimized/1/3/17 2836 ns 2829 ns 247663 |
| BM_BiquadFilterFloatOptimized/1/3/18 2847 ns 2840 ns 246786 |
| BM_BiquadFilterFloatOptimized/1/3/19 2843 ns 2834 ns 246922 |
| BM_BiquadFilterFloatOptimized/1/3/20 2838 ns 2830 ns 247683 |
| BM_BiquadFilterFloatOptimized/1/3/21 2836 ns 2828 ns 247886 |
| BM_BiquadFilterFloatOptimized/1/3/22 2847 ns 2840 ns 246696 |
| BM_BiquadFilterFloatOptimized/1/3/23 2840 ns 2832 ns 246918 |
| BM_BiquadFilterFloatOptimized/1/3/24 2842 ns 2834 ns 246695 |
| BM_BiquadFilterFloatOptimized/1/3/25 2838 ns 2830 ns 247416 |
| BM_BiquadFilterFloatOptimized/1/3/26 2846 ns 2838 ns 246729 |
| BM_BiquadFilterFloatOptimized/1/3/27 2838 ns 2831 ns 247193 |
| BM_BiquadFilterFloatOptimized/1/3/28 2839 ns 2832 ns 247448 |
| BM_BiquadFilterFloatOptimized/1/3/29 2841 ns 2834 ns 247299 |
| BM_BiquadFilterFloatOptimized/1/3/30 2843 ns 2836 ns 246862 |
| BM_BiquadFilterFloatOptimized/1/3/31 2837 ns 2829 ns 246482 |
| BM_BiquadFilterFloatOptimized/1/4/1 649 ns 648 ns 1080722 |
| BM_BiquadFilterFloatOptimized/1/4/2 807 ns 805 ns 869521 |
| BM_BiquadFilterFloatOptimized/1/4/3 805 ns 803 ns 871377 |
| BM_BiquadFilterFloatOptimized/1/4/4 834 ns 831 ns 841567 |
| BM_BiquadFilterFloatOptimized/1/4/5 834 ns 832 ns 841356 |
| BM_BiquadFilterFloatOptimized/1/4/6 834 ns 832 ns 841467 |
| BM_BiquadFilterFloatOptimized/1/4/7 834 ns 831 ns 841798 |
| BM_BiquadFilterFloatOptimized/1/4/8 2197 ns 2192 ns 319360 |
| BM_BiquadFilterFloatOptimized/1/4/9 2198 ns 2192 ns 319280 |
| BM_BiquadFilterFloatOptimized/1/4/10 2208 ns 2202 ns 318344 |
| BM_BiquadFilterFloatOptimized/1/4/11 2212 ns 2206 ns 316283 |
| BM_BiquadFilterFloatOptimized/1/4/12 2452 ns 2447 ns 286906 |
| BM_BiquadFilterFloatOptimized/1/4/13 2372 ns 2365 ns 295524 |
| BM_BiquadFilterFloatOptimized/1/4/14 2506 ns 2499 ns 280957 |
| BM_BiquadFilterFloatOptimized/1/4/15 2456 ns 2450 ns 285647 |
| BM_BiquadFilterFloatOptimized/1/4/16 2448 ns 2442 ns 285905 |
| BM_BiquadFilterFloatOptimized/1/4/17 2514 ns 2508 ns 279756 |
| BM_BiquadFilterFloatOptimized/1/4/18 2366 ns 2360 ns 296402 |
| BM_BiquadFilterFloatOptimized/1/4/19 2424 ns 2418 ns 288951 |
| BM_BiquadFilterFloatOptimized/1/4/20 2454 ns 2447 ns 287009 |
| BM_BiquadFilterFloatOptimized/1/4/21 2377 ns 2371 ns 294465 |
| BM_BiquadFilterFloatOptimized/1/4/22 2491 ns 2484 ns 278138 |
| BM_BiquadFilterFloatOptimized/1/4/23 2459 ns 2452 ns 284304 |
| BM_BiquadFilterFloatOptimized/1/4/24 2445 ns 2438 ns 288879 |
| BM_BiquadFilterFloatOptimized/1/4/25 2530 ns 2524 ns 278111 |
| BM_BiquadFilterFloatOptimized/1/4/26 2391 ns 2385 ns 295861 |
| BM_BiquadFilterFloatOptimized/1/4/27 2455 ns 2449 ns 286188 |
| BM_BiquadFilterFloatOptimized/1/4/28 2459 ns 2452 ns 284560 |
| BM_BiquadFilterFloatOptimized/1/4/29 2365 ns 2358 ns 297118 |
| BM_BiquadFilterFloatOptimized/1/4/30 2517 ns 2509 ns 280309 |
| BM_BiquadFilterFloatOptimized/1/4/31 2453 ns 2445 ns 286038 |
| BM_BiquadFilterFloatNonOptimized/0/1/31 2043 ns 2036 ns 343632 |
| BM_BiquadFilterFloatNonOptimized/0/2/31 4091 ns 4079 ns 171633 |
| BM_BiquadFilterFloatNonOptimized/0/3/31 6128 ns 6108 ns 114396 |
| BM_BiquadFilterFloatNonOptimized/0/4/31 8170 ns 8146 ns 85861 |
| BM_BiquadFilterFloatNonOptimized/0/5/31 10210 ns 10178 ns 68777 |
| BM_BiquadFilterFloatNonOptimized/0/6/31 12278 ns 12241 ns 57153 |
| BM_BiquadFilterFloatNonOptimized/0/7/31 14304 ns 14262 ns 49100 |
| BM_BiquadFilterFloatNonOptimized/0/8/31 16349 ns 16299 ns 42947 |
| BM_BiquadFilterFloatNonOptimized/0/9/31 18392 ns 18335 ns 38182 |
| BM_BiquadFilterFloatNonOptimized/0/10/31 20440 ns 20378 ns 34354 |
| BM_BiquadFilterFloatNonOptimized/0/11/31 22481 ns 22412 ns 31238 |
| BM_BiquadFilterFloatNonOptimized/0/12/31 24545 ns 24461 ns 28617 |
| BM_BiquadFilterFloatNonOptimized/0/13/31 26585 ns 26496 ns 26424 |
| BM_BiquadFilterFloatNonOptimized/0/14/31 28629 ns 28535 ns 24529 |
| BM_BiquadFilterFloatNonOptimized/0/15/31 30744 ns 30642 ns 22848 |
| BM_BiquadFilterFloatNonOptimized/0/16/31 32951 ns 32843 ns 21318 |
| BM_BiquadFilterFloatNonOptimized/0/17/31 35244 ns 35132 ns 19892 |
| BM_BiquadFilterFloatNonOptimized/0/18/31 37638 ns 37517 ns 18646 |
| BM_BiquadFilterFloatNonOptimized/0/19/31 39639 ns 39512 ns 17722 |
| BM_BiquadFilterFloatNonOptimized/0/20/31 41706 ns 41569 ns 16833 |
| BM_BiquadFilterFloatNonOptimized/0/21/31 43783 ns 43631 ns 16039 |
| BM_BiquadFilterFloatNonOptimized/0/22/31 46027 ns 45875 ns 15246 |
| BM_BiquadFilterFloatNonOptimized/0/23/31 47548 ns 47368 ns 14782 |
| BM_BiquadFilterFloatNonOptimized/0/24/31 49634 ns 49446 ns 14154 |
| BM_BiquadFilterDoubleOptimized/0/1/31 2044 ns 2038 ns 343422 |
| BM_BiquadFilterDoubleOptimized/0/2/31 2556 ns 2548 ns 275213 |
| BM_BiquadFilterDoubleOptimized/0/3/31 2849 ns 2841 ns 245737 |
| BM_BiquadFilterDoubleOptimized/0/4/31 3175 ns 3165 ns 221194 |
| BM_BiquadFilterDoubleNonOptimized/0/1/31 2059 ns 2052 ns 341428 |
| BM_BiquadFilterDoubleNonOptimized/0/2/31 4089 ns 4075 ns 171770 |
| BM_BiquadFilterDoubleNonOptimized/0/3/31 6124 ns 6104 ns 114638 |
| BM_BiquadFilterDoubleNonOptimized/0/4/31 8187 ns 8162 ns 85781 |
| |
| *******************************************************************/ |
| |
| struct StateSpaceChannelOptimizedOptions |
| : public android::audio_utils::details::DefaultBiquadConstOptions |
| { |
| // Overrides the Biquad Filter type |
| template <typename T_, typename F_> |
| using FilterType = android::audio_utils::BiquadStateSpace< |
| T_, F_, true /* SEPARATE_CHANNEL_OPTIMIZATION */>; |
| }; |
| |
| template <typename F> |
| static void BM_BiquadFilter(benchmark::State& state, bool optimized) { |
| bool isSubnormal = (state.range(0) == 1); |
| const size_t channelCount = state.range(1); |
| const size_t occupancy = state.range(2); |
| |
| std::vector<F> input(DATA_SIZE * channelCount); |
| std::vector<F> output(DATA_SIZE * channelCount); |
| std::array<F, android::audio_utils::kBiquadNumCoefs> coefs; |
| |
| // Initialize input buffer and coefs with deterministic pseudo-random values |
| std::minstd_rand gen(occupancy); |
| const F amplitude = isSubnormal ? std::numeric_limits<F>::min() * 0.1 : 1.; |
| std::uniform_real_distribution<> dis(-amplitude, amplitude); |
| for (size_t i = 0; i < DATA_SIZE * channelCount; ++i) { |
| input[i] = dis(gen); |
| } |
| for (size_t i = 0; i < coefs.size(); ++i) { |
| coefs[i] = (occupancy >> i & 1) * REF_COEFS[i]; |
| } |
| |
| android::audio_utils::BiquadFilter< |
| F, true /* SAME_COEF_PER_CHANNEL */, StateSpaceChannelOptimizedOptions> |
| biquadFilter(channelCount, coefs, optimized); |
| |
| // Run the test |
| while (state.KeepRunning()) { |
| benchmark::DoNotOptimize(input.data()); |
| benchmark::DoNotOptimize(output.data()); |
| biquadFilter.process(output.data(), input.data(), DATA_SIZE); |
| benchmark::ClobberMemory(); |
| } |
| state.SetComplexityN(state.range(1)); // O(channelCount) |
| } |
| |
| static void BM_BiquadFilterFloatOptimized(benchmark::State& state) { |
| BM_BiquadFilter<float>(state, true /* optimized */); |
| } |
| |
| static void BM_BiquadFilterFloatNonOptimized(benchmark::State& state) { |
| BM_BiquadFilter<float>(state, false /* optimized */); |
| } |
| |
| static void BM_BiquadFilterDoubleOptimized(benchmark::State& state) { |
| BM_BiquadFilter<double>(state, true /* optimized */); |
| } |
| |
| static void BM_BiquadFilterDoubleNonOptimized(benchmark::State& state) { |
| BM_BiquadFilter<double>(state, false /* optimized */); |
| } |
| |
| static void BiquadFilterQuickArgs(benchmark::internal::Benchmark* b) { |
| constexpr int CHANNEL_COUNT_BEGIN = 1; |
| constexpr int CHANNEL_COUNT_END = 24; |
| for (int k = 0; k < 1; k++) { // 0 for normal random data, 1 for subnormal random data |
| for (int i = CHANNEL_COUNT_BEGIN; i <= CHANNEL_COUNT_END; ++i) { |
| int j = (1 << android::audio_utils::kBiquadNumCoefs) - 1; // Full |
| b->Args({k, i, j}); |
| } |
| } |
| } |
| |
| static void BiquadFilterFullArgs(benchmark::internal::Benchmark* b) { |
| constexpr int CHANNEL_COUNT_BEGIN = 1; |
| constexpr int CHANNEL_COUNT_END = 4; |
| for (int k = 0; k < 2; k++) { // 0 for normal random data, 1 for subnormal random data |
| for (int i = CHANNEL_COUNT_BEGIN; i <= CHANNEL_COUNT_END; ++i) { |
| for (int j = 1; j < (1 << android::audio_utils::kBiquadNumCoefs); ++j) { // Occupancy |
| b->Args({k, i, j}); |
| } |
| } |
| } |
| } |
| |
| static void BiquadFilterDoubleArgs(benchmark::internal::Benchmark* b) { |
| constexpr int CHANNEL_COUNT_BEGIN = 1; |
| constexpr int CHANNEL_COUNT_END = 4; |
| for (int k = 0; k < 1; k++) { // 0 for normal random data, 1 for subnormal random data |
| for (int i = CHANNEL_COUNT_BEGIN; i <= CHANNEL_COUNT_END; ++i) { |
| int j = (1 << android::audio_utils::kBiquadNumCoefs) - 1; // Full |
| b->Args({k, i, j}); |
| } |
| } |
| } |
| |
| BENCHMARK(BM_BiquadFilterFloatOptimized)->Apply(BiquadFilterQuickArgs); |
| BENCHMARK(BM_BiquadFilterFloatOptimized)->Apply(BiquadFilterFullArgs); |
| // Other tests of interest |
| BENCHMARK(BM_BiquadFilterFloatNonOptimized)->Apply(BiquadFilterQuickArgs); |
| BENCHMARK(BM_BiquadFilterDoubleOptimized)->Apply(BiquadFilterDoubleArgs); |
| BENCHMARK(BM_BiquadFilterDoubleNonOptimized)->Apply(BiquadFilterDoubleArgs); |
| |
| BENCHMARK_MAIN(); |