# HG changeset patch # User Arun Giridhar # Date 1712076830 14400 # Node ID 1077e4739169ca7356293fe03e53b6f96b1b2b53 # Parent 1db14e08bee4028e6393e96e87987215e1123ae7 assert.m: Preallocate string for pretty printing The string being used for pretty printing assertion failures was being grown sequentially. In certain cases such as the BISTs for `conv2`, printing known failures was taking several minutes, especially when compiled without compiler optimization flags. This patch uses preallocation, leading to some 7x to 14x speedup. See https://octave.discourse.group/t/conv2-test-time-rather-long/5446/9 diff -r 1db14e08bee4 -r 1077e4739169 scripts/testfun/assert.m --- a/scripts/testfun/assert.m Mon Apr 01 22:21:02 2024 -0400 +++ b/scripts/testfun/assert.m Tue Apr 02 12:53:50 2024 -0400 @@ -785,15 +785,24 @@ str = ["ASSERT errors for: assert " argin "\n"]; str = [str, "\n Location | Observed | Expected | Reason\n"]; - for i = 1:length (err.index) - leni = length (err.index{i}); - leno = length (err.observed{i}); - lene = length (err.expected{i}); - str = [str, sprintf("%*s%*s %*s%*s %*s%*s %s\n", - 6+fix(leni/2), err.index{i} , max (6-fix(leni/2), 0), "", - 6+fix(leno/2), err.observed{i}, max (6-fix(leno/2), 0), "", - 6+fix(lene/2), err.expected{i}, max (6-fix(lene/2), 0), "", - err.reason{i})]; + + pos = numel (str); + str(end + 1e6) = ' '; + for i = 1:numel (err.index) + leni = numel (err.index{i}); + leno = numel (err.observed{i}); + lene = numel (err.expected{i}); + tmp = sprintf("%*s%*s %*s%*s %*s%*s %s\n", + 6+fix(leni/2), err.index{i} , max (6-fix(leni/2), 0), "", + 6+fix(leno/2), err.observed{i}, max (6-fix(leno/2), 0), "", + 6+fix(lene/2), err.expected{i}, max (6-fix(lene/2), 0), "", + err.reason{i}); + if (pos + numel (tmp) >= numel (str)) + str(end + 1e6) = ' '; + endif + str((pos + 1):(pos + numel (tmp))) = tmp; + pos += numel (tmp); endfor + str = str(1:pos); endfunction