diff (3)

ソースコードが{$IF}の嵐になってしまってる…というのは置いておいて。

PukiWikiは移動経路をXとYの組で一歩ずつ配列に記憶していました。
これをX,Y,Count,Prev,RefCountでリンクリストにします。
CountはXとYが続けて同じように移動した時その幅を記録します。メモリを微妙に節約すると同時に差分の作成がやや速くなるはずです。
RefCountは参照カウントで、fpを上書きしていくのなら、参照されなくなる経路もあるはずだということで参照されなくなったら即座に解放してやります。これでメモリ食い過ぎは解決できました?

遥かにマシにはなってますが…それでも100Kの比較に100Mとか使います。

メモリマネージャはWin32のHeapCreate/HeapAlloc/HeapFree/HeapDestroyを使います。
簡易固定長メモリマネージャに、さらに適当に部分開放とか再割り当てとか付けたら遅すぎましたので、代替なのですが、Win32のヒープ関数にはHeapDestroyによって全部HeapFreeして回らなくても一括で解放されるお気楽メリットがあります。
…ですが、ヒープ関数でも、私の適当なロジックよりはマシなのですが、やはり遅すぎます。もともとヒープ関数は可変長なので無駄もきっとあります。

気合い入れて思いっきり高速な固定長メモリマネージャを書くしかないのかなあ…