The problem was indeed in the way we called librsync, namely the block
size to use. In the case of a 49MB file, the block size would have been
24k, which means that every block in the test had a change, so every
block got backed up on the incremental. I set it to max out at 2k and
it now gives the same performance as rdiff. This increases the number
of sig file entries and its size. Runtime is only increased a small
amount, so I think the tradeoffs are acceptable.
The best response may be to allow the user to set the maximum block size
via an option since some files only change at the end of the file.