2025-02-20

テキストエディタ高速化するためにある人が書いたBigListを改造して、リーフノードリンクリストでつないだら全列挙が早くなって、スタックオーバーフローしなくなった。

ただ、その代わり元々のコードにあったノードの共有機はいらなそうなので省くことにした。

Core i5 10400F、メモリー16GBで、100文字×100行=1億文字を突っ込んで、あれこれ操作した場合はこのくらいの速度で動く。

benchmark start

Allocated GC Memory:60,392bytes

add time:1728 ms

Allocated GC Memory:416,037,968bytes

replace 1 time:5776 ms

Allocated GC Memory:416,082,104bytes

replace 2 time:5694 ms

Allocated GC Memory:416,082,272bytes

replace 3 time:5196 ms

Allocated GC Memory:416,082,296bytes

enumratotion time:1179 ms

Allocated GC Memory:416,082,440bytes

clear buffer

Allocated GC Memory:82,360bytes

Finished.Hit Any Key

https://github.com/rirufa/FooList

ListやGapBufferだとGCに優しくないけど、BigListだとLOH入りしないので、GCに優しいのだ。

その代わり速度はBigListの中身はRopeなので、少し遅くなるのだ。

Ropeで、リーフノードリンクリストでつないだ場合、挿入と削除、追加、ランダムアクセスはO(Log N)、全列挙はO(N)なのだ

MITライセンスなんで商用でも問題ないけど、元々のBigListのライセンスに不穏なことが書いてあったので、気になるなら、自分で書き直したほうがいい。

元々のBigListはこの本を参考にしたようなのだ

The rebalancing algorithm is from "Ropes: an Alternative to Strings", by

Boehm, Atkinson, and Plass, in SOFTWARE--PRACTICE AND EXPERIENCE, VOL. 25(12), 1315–1330 (DECEMBER 1995).

https://www.cs.tufts.edu/comp/150FP/archive/hans-boehm/ropes.pdf

  • ちなみに俺はIQ84の境界知能で、発達障害持ちなのだ。 言語性106~120、動作性は60ぐらいなのだ。 言語性の下位項目は正常で、単語が飛びぬけて高いのだ。 動作性の下位項目はほぼ正常で...

    • 素直にすげーな 自力でよくやった おれも自力でAndrew Ng教授のコースとかとったけど微分からやり直す羽目になって大変だったわ 半年くらいやってた

  • BigList<T>の内部で使われているやつをGapBuffer<T>に置き換えてみたら、リーフノードのサイズが32768だと遅くなるけど、最大メモリー使用量はそこまで変わらんな。 ブロックサイ...

  • RopeもといBigListでさくさくエディターの置き換え処理をやってみた。 使用したマシンはCore i7 14700、メモリー32GB、Intel ARC A750。 100万行×100文字を置き換え。 addはバッファーの構...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん