# HG changeset patch # User Rik # Date 1629218812 25200 # Node ID e3e0193963ea74aee98eb6c904541e0eff0601e3 # Parent ac5e1b64f8c98fd391a73e8b9a0e671722a68dd9 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. diff -r ac5e1b64f8c9 -r e3e0193963ea libinterp/corefcn/filter.cc --- 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;