/* * 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 #include #include #include #include #include #include #include #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 input(DATA_SIZE); std::array 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>> biquads(filters); for (auto& biquad : biquads) { biquad.reset(new BiquadFilter(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 is 0 or 1 indicating if the input data is subnormal or not. Parameterized Test BM_BiquadFilter/A/B/C is 0 or 1 indicating if the input data is subnormal or not. is the channel count, starting from 1 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 using FilterType = android::audio_utils::BiquadStateSpace< T_, F_, true /* SEPARATE_CHANNEL_OPTIMIZATION */>; }; template 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 input(DATA_SIZE * channelCount); std::vector output(DATA_SIZE * channelCount); std::array coefs; // Initialize input buffer and coefs with deterministic pseudo-random values std::minstd_rand gen(occupancy); const F amplitude = isSubnormal ? std::numeric_limits::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(state, true /* optimized */); } static void BM_BiquadFilterFloatNonOptimized(benchmark::State& state) { BM_BiquadFilter(state, false /* optimized */); } static void BM_BiquadFilterDoubleOptimized(benchmark::State& state) { BM_BiquadFilter(state, true /* optimized */); } static void BM_BiquadFilterDoubleNonOptimized(benchmark::State& state) { BM_BiquadFilter(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();