Instead of increasing address every iteration of the loop, we can just keep
it fixed and double the number of bytes copied every iteration. This works
because the string to be generated is periodic.
For example, if we want to copy 9 bytes starting 2 bytes back:
In general, if s = size and d = (target_bytes_decoded - address), then the
number of calls to CopyBytes is reduced from (s/d) + 1 to log(s/d)/log(2) + 1.
The total time complexity is still O(s) because CopyBytes is presumably linear
in the number of bytes copied, but we end up doing fewer calls in total, which
is likely to be faster in practice, especially if s is large and d is small.
Instead of increasing
address
every iteration of the loop, we can just keep it fixed and double the number of bytes copied every iteration. This works because the string to be generated is periodic.For example, if we want to copy 9 bytes starting 2 bytes back:
Then the old version of the code would generate these intermediate states:
While the new version would double the range to be copied every time:
In general, if s = size and d = (target_bytes_decoded - address), then the number of calls to CopyBytes is reduced from (s/d) + 1 to log(s/d)/log(2) + 1.
The total time complexity is still O(s) because CopyBytes is presumably linear in the number of bytes copied, but we end up doing fewer calls in total, which is likely to be faster in practice, especially if
s
is large andd
is small.