changeset 29980:e3e0193963ea

Improve performance of filter along dimensions > 1 (bug #60928). Replacing code pattern using while loop to calculate offset with division and multiplication leads to 100X improvement in filtering along second dimension. * filter.cc (filter (b, a, x, si, dim)): Replace while loop to calculate offset with division and multiplication.
author Rik <rik@octave.org>
date Tue, 17 Aug 2021 09:46:52 -0700
parents ac5e1b64f8c9
children 0c3d248a3b44
files libinterp/corefcn/filter.cc
diffstat 1 files changed, 2 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/filter.cc	Tue Aug 17 09:12:20 2021 -0700
+++ b/libinterp/corefcn/filter.cc	Tue Aug 17 09:46:52 2021 -0700
@@ -120,14 +120,9 @@
         x_offset = num * x_len;
       else
         {
-          octave_idx_type x_offset2 = 0;
           x_offset = num;
-          while (x_offset >= x_stride)
-            {
-              x_offset -= x_stride;
-              x_offset2++;
-            }
-          x_offset += x_offset2 * x_stride * x_len;
+          octave_idx_type n_strides = num / x_stride;
+          x_offset += n_strides * x_stride * (x_len - 1);
         }
       octave_idx_type si_offset = num * si_len;