-
Notifications
You must be signed in to change notification settings - Fork 3
Diff Engines
SimpleRCS ์์๋ diff ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฌ ๋ฒ ์๋ค. ์ ์ด๋ ๊ฒ ๋ง๊ณ , ์ค์ ๋ก ๋ญ๊ฐ ๋์๊ฐ๊ณ ์๊ณ , ๋๋จธ์ง๋ ์ ์์ง๋ ๋ถ์ด์๋์ง๋ฅผ ์ ๋ฆฌํ๋ค.
commit()/checkout()์ด ๋ธํ๋ฅผ ๊ณ์ฐํ ๋ ๋ถ๋ฅด๋ ๊ฑด pydifflib.py์
StreamSequenceMatcher ๋ฑ ํ๋๋ค. ๋๋จธ์ง(Myers ๊ณ์ด, Cython ๋ฒ์ )๋
์ ๋ถ tools/bench_diff.py๋ฅผ ํตํ ๋น๊ต/๋ฒค์น๋งํฌ์ฉ์ผ๋ก๋ง ์กด์ฌํ๋ค.
ํด์ ๊ธฐ๋ฐ ๊ทธ๋ฆฌ๋ ๋งค์นญ์ด๋ค. ๋๋ต ์ด๋ฐ ์์๋ก ๋์ํ๋ค.
- ์์ชฝ ์ํ์ค๋ฅผ ํด์๋ก ์ธ๋ฑ์ฑํด์ ๋์ผํ ๋ผ์ธ๋ค์ ๋น ๋ฅด๊ฒ ์ฐพ๋๋ค
- ๋งค์นญ๋๋ ๋ธ๋ก๋ค์ ๊ทธ๋ฆฌ๋ํ๊ฒ ๊ณจ๋ผ ๋ถ์ธ๋ค
- ๋งค์นญ ์ ๋๊ณ ๋จ์ "๊ต์ฒด(replace)" ๊ตฌ๊ฐ๋ง ํ์ค
difflib์ผ๋ก ๋ค๋ฌ๋๋ค
์ต๋จ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ํ์ ์ผ๋ก ๋ณด์ฅํ์ง๋ ์๋๋ค. ํ์ง๋ง O(N)์ ๊ฐ๊น๊ฒ ๋น ๋ฅด๊ณ , ์ค๋ฌด์์ ๋์ค๋ diff ๊ฒฐ๊ณผ๊ฐ ๋๋ถ๋ถ ์ถฉ๋ถํ ์์ฐ์ค๋ฝ๋ค. ์ปค๋ฐ ๊ฒฝ๋ก์ฒ๋ผ "์ ํํ ์ต์ ํธ์ง ์คํฌ๋ฆฝํธ"๋ณด๋ค "๋น ๋ฅด๊ณ ํฉ๋ฆฌ์ ์ธ ๋ธํ"๊ฐ ๋ ์ค์ํ ์๋ฆฌ์ ๋ง๋ ์ ํ์ด๋ค.
myersdiff.py, myersdiff_ses.py, myersdiff_dmp.py๋ ์ ํต์ ์ธ Myers
O(ND) ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ์ด์ฌ ๊ตฌํ์ด๋ค. ์ด์ชฝ์ ์ต๋จ ํธ์ง ์คํฌ๋ฆฝํธ๋ฅผ
์ํ์ ์ผ๋ก ๋ณด์ฅํ๋ค โ Git์ xdiff๊ฐ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ณ์ด์ ์๊ณ ๋ฆฌ์ฆ.
- SES ๋ณํ: ํ์ค์ ์ธ ์ต๋จ ํธ์ง ์คํฌ๋ฆฝํธ ๊ณ์ฐ
- DMP ๋ณํ: Neil Fraser์ diff-match-patch ๋ฐฉ์๋๋ก "middle snake" ์ ๋ต์ ์ฐ๋ ๋ฆฌ์คํธ ์ฌ๋ผ์ด์ฑ ๋์ ์คํ์ ์ ๊ณ์ ๋๊ฒจ์ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก SES์ ๊ฐ์ ํธ์ง ์คํฌ๋ฆฝํธ๋ฅผ ๋ด์ง๋ง ๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
O(ND) ์๊ณ ๋ฆฌ์ฆ์ ์ฝ์ ์ ๋ ์
๋ ฅ์ด ๋ง์ด ๋ค๋ฅผ ๋ ์ฑ๋ฅ์ด ๋๋น ์ง๋ค๋ ๊ฒ์ด๋ค
โ ์ต์
์ ๊ฒฝ์ฐ 500KB ์ ๋ ํฌ๊ธฐ์ 10% ์ ๋๋ง ๋ฌ๋ผ๋ ์ด ๋จ์๋ก ๋๋ ค์ง ์
์๋ค. StreamSequenceMatcher๊ฐ ์ด ์ผ์ด์ค์์ ํจ์ฌ ์์ ํ๋ค.
์ ๋ Myers ๊ตฌํ์ ๊ทธ๋๋ก Cython์ผ๋ก ํฌํ
ํ ๊ฒ. ์์ ํ์ด์ฌ ๋๋น
15~26๋ฐฐ ๋น ๋ฅด๋ค๋ ๊ฑธ ๋ฒค์น๋งํฌ๋ก ํ์ธํ์ง๋ง, ์ง๊ธ์ ์ปค๋ฐ ๊ฒฝ๋ก์
์ฐ๊ฒฐ๋ผ ์์ง ์๋ค. pyproject.toml์ ext-modules์ ๋ฑ๋ก๋ผ ์์ด์
uv sync ์ ๊ฐ์ด ๋น๋๋๋ค.
docs/parser_benchmark.md์ ์๋ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฝํ๋ฉด:
- ์์ ๋ธํ ๋ธ๋ก(์๋ฐฑ ๋ฐ์ดํธ) ๊ธฐ์ค์ผ๋ก๋ ํ์/diff ์์ง ๊ฐ ์ฐจ์ด๊ฐ ์ฒด๊ฐ๋์ง ์๋๋ค โ ์ค์ฐจ๋ฒ์ ์.
- ๋ธ๋ก์ด ์ปค์ง์๋ก(1.6KB โ 92KB) ์ฐจ์ด๊ฐ ๋ฒ์ด์ง๋ค. ์ด๊ฑด diff ์์ง ์์ฒด๋ณด๋ค๋ ๋ธ๋ก ํ์ฑ ์ชฝ ์๊ธฐ์ง๋ง, ๊ฐ์ ์๋ฆฌ๋ก "ํฐ ์ ๋ ฅ์์ ๋ฒ์ด์ง๋ ๊ฒฉ์ฐจ"๊ฐ diff ์์ง ์ ํ์๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค.
- Cython ํฌํ ์ ์์ ํ์ด์ฌ ๋๋น 5~10๋ฐฐ ๋จ์ถ์ด ํ์ค์ ์ธ ๋ฒ์ โ ํ์ด์ฌ ๋ฐ์ดํธ์ฝ๋ ๋์คํจ์น ์ค๋ฒํค๋๋ฅผ ์์ ๋ ํจ๊ณผ๊ฐ ํฌ๋ค.
- ์ง๊ธ ๊ทธ๋๋ก ์จ๋ ๋๋ค.
StreamSequenceMatcher๋ ์ด๋ฏธ ํ๋ก๋์ ๊ฒฝ๋ก์์ ๊ฒ์ฆ๋๊ณ , ์ผ๋ฐ์ ์ธ ํ ์คํธ ํธ์ง(์ค ๋จ์ ์์ )์์๋ ์ต๋จ ํธ์ง ๊ฑฐ๋ฆฌ์ ์ค์ง์ ์ผ๋ก ์ฐจ์ด๊ฐ ์ ๋๋ค. - Myers ๊ณ์ด(ํนํ Cython ๋ฒ์ )์ด ์๋ฏธ ์์ด์ง๋ ์์ ์ "์ ํํ ์ต์ ํธ์ง ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ๋ค"๊ฑฐ๋, "๋๋์ ๋ธํ๋ฅผ ๋ฐฐ์น๋ก ์ฌ๊ณ์ฐํด์ผ ํ๋ค" ๊ฐ์ ํน์ํ ์๊ตฌ๊ฐ ์๊ฒผ์ ๋๋ค.
- ์๋ก diff ์๊ณ ๋ฆฌ์ฆ์ ๋ถ์ด๊ณ ์ถ๋ค๋ฉด
tools/bench_diff.py๊ฐ ์ด๋ฏธ ๋น๊ต ํ๋ ์์ ๊ฐ์ถ๊ณ ์์ผ๋ ๊ฑฐ๊ธฐ์ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํด์ ์ค์ธก๋ถํฐ ํ๋ ๊ฑธ ๊ถํ๋ค.
uv run tools/bench_diff.py์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ(peak, tracemalloc ๊ธฐ์ค) ๋ ๋ค ๋น๊ตํด์ค๋ค. ํน์ ์์ง
ํ๋๋ก ๋ ๋ฒ์ ์ฌ์ด diff๋ฅผ ์ง์ ๋ณด๊ณ ์ถ์ผ๋ฉด:
uv run tools/srcs_diff.py <ํ์ผ> --engine ses # ๋๋ dmp, pydifflib, myers, difflib