Ctags: 병렬 ctags

에 λ§Œλ“  2016λ…„ 01μ›” 13일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: universal-ctags/ctags

λ‚΄κ°€ μ΄ν•΄ν•˜λŠ” ν•œ ctagsλŠ” 단일 μŠ€λ ˆλ“œμž…λ‹ˆλ‹€. 병렬화λ₯Ό 지원할 κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ? κ±°λŒ€ν•œ μ½”λ“œλ² μ΄μŠ€μ—μ„œ μž‘μ—… 속도λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  19 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”,

λ‚΄μž₯된 병렬 κ΅¬ν˜„μ΄ ν₯미둜울 수 μžˆμ§€λ§Œ λ‹€λ₯Έ λ””λ ‰ν† λ¦¬μ—μ„œ λ‹€λ₯Έ ctagλ₯Ό μ‹œμž‘ν•œ λ‹€μŒ μƒμ„±λœ νŒŒμΌμ„ λ³‘ν•©ν•˜μ—¬ 큰 μ½”λ“œλ² μ΄μŠ€ μ—…λ°μ΄νŠΈλ₯Ό λ³‘λ ¬ν™”ν•˜λŠ” 것이 이미 κ°€λŠ₯ν•©λ‹ˆλ‹€(단 ν•˜λ‚˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  νŒŒμΌμ—μ„œ !둜 μ‹œμž‘ν•˜λŠ” 쀄을 μ‚­μ œν•˜μ—¬ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이후에 λͺ¨λ“  νŒŒμΌμ— λŒ€ν•΄ sort --merge μ‚¬μš©).

κ·ΈλŸ¬λ‚˜ ν˜„λŒ€ 기계가 I/O 바인딩될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜κΈ° λ•Œλ¬Έμ— λ³‘λ ¬ν™”λœ ctagμ—μ„œ μ–΄λ–€ 속도 ν–₯상도 얻을 수 μžˆλ‹€κ³  ν™•μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ ν™•μΈν•˜λ €λ©΄ ν”„λ‘œνŒŒμΌλ§ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@mawww https://github.com/ggreer/the_silver_searcher κ°€ λ™μ˜ν•˜μ§€ μ•Šμ„ 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€ .wink :

μ—¬λŸ¬ ctagλ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 ν‘œμ€€ emacs https://github.com/bbatsov/projectile/blob/master/projectile.el#L180 -L183μ—μ„œ μ‘°μ •ν•˜κΈ°κ°€ 맀우 μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€.

@mawww https://github.com/ggreer/the_silver_searcher κ°€ λ™μ˜ν•˜μ§€ μ•Šμ„ 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€ .wink :

쒋은 지적.

μ—¬λŸ¬ ctagλ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 ν‘œμ€€ emacs https://github.com/bbatsov/projectile/blob/master/projectile.el#L180 -L183μ—μ„œ μ‘°μ •ν•˜κΈ°κ°€ 맀우 μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€.

μ‰˜ 슀크립트 λž˜νΌλŠ” 이미 λ¨Ό 길을 갈 수 μžˆμ§€λ§Œ, ctag에 직접 ν†΅ν•©ν•˜λŠ” 것이 더 효율적일 수 μžˆμŠ΅λ‹ˆλ‹€.

@fommil 이 λ¬Έμ œμ— λŒ€ν•œ κ·Έ μ‚¬λžŒμ˜
그리고 μžμ‹ μ˜ ν…ŒμŠ€νŠΈμ—μ„œ λ„ˆλ¬΄ λ§Žμ€ μž‘μ—…μž μŠ€λ ˆλ“œκ°€ 병렬 처리λ₯Ό μ „ν˜€ ν•˜μ§€ μ•ŠλŠ” 것보닀 λΉ λ₯΄κ²Œ μ•…ν™”λ˜μ—ˆμŒμ„ μžμ‹ μ˜ μ»΄ν“¨ν„°μ—μ„œ μ–΄λ–»κ²Œ λ³΄μ—¬μ£Όμ—ˆλŠ”μ§€ μ£Όλͺ©ν•˜μ‹­μ‹œμ˜€. κ·€μ—½κΈ΄ ν•˜μ§€λ§Œ μ²˜λ¦¬ν•  ν•˜λ“œμ›¨μ–΄, OS 및 데이터에 크게 μ˜μ‘΄ν•  κ°€λŠ₯성이 λ†’κΈ° λ•Œλ¬Έμ— "N μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λ‚΄ ν…ŒμŠ€νŠΈμ—μ„œ 더 잘 μˆ˜ν–‰λ˜λŠ” 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€"보닀 더 합리적일 κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ 그것이 μ €μ—κ²Œ 그닀지 맀λ ₯적이지 μ•Šμ€ 또 λ‹€λ₯Έ μ΄μœ λŠ” 그것이 μš°λ¦¬μ—κ²Œ λ§Žμ€ 것을 쀄 것이라고 믿지 μ•Šμ„ 뿐만 μ•„λ‹ˆλΌ λ§Žμ€ μ–‘μ˜ 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ‰¬μš΄ μž‘μ—…μ΄ 될 κ²ƒμ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ CTags μ½”λ“œ κΈ°λ°˜μ€ μŠ€λ ˆλ“œλ₯Ό ꡬ문 λΆ„μ„ν•˜λŠ” 병렬 νƒœκ·Έλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•œ ν˜•νƒœκ°€ μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€. μƒλŒ€μ μœΌλ‘œ μ‰½κ²Œ _ν•  수 μžˆλŠ”_ λͺ¨λ“  것은 μ΄ˆκΈ°ν™”/디렉토리 탐색과 _ν•˜λ‚˜μ˜ 단일_ νŒŒμ„œ μŠ€λ ˆλ“œμž…λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ μ½”λ“œλ² μ΄μŠ€(특히 νŒŒμ„œ)의 λͺ¨λ“  κ³³μ—μ„œ μˆ˜ν–‰ν•  수 μžˆλŠ” 보닀 합리적인 μ΅œμ ν™”κ°€ μžˆλ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€.

ν™•μ‹€νžˆ λ©€ν‹°μŠ€λ ˆλ”©μ€ 잘 μ‚¬μš©ν•˜λ©΄ _ν•  수 μžˆλŠ”_ _λͺ‡ 가지_ 이점이 μžˆμ§€λ§Œ κ°€μž₯ ν₯미둜운 κ°œμ„  사항은 아닐 κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ 그것이 μ €μ—κ²Œ 그닀지 맀λ ₯적이지 μ•Šμ€ 또 λ‹€λ₯Έ μ΄μœ λŠ” […] λ§Žμ€ μ–‘μ˜ 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ‰¬μš΄ μž‘μ—…μ΄ 될 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν˜„μž¬ CTags μ½”λ“œ κΈ°λ°˜μ€ μŠ€λ ˆλ“œλ₯Ό ꡬ문 λΆ„μ„ν•˜λŠ” 병렬 νƒœκ·Έλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•œ ν˜•νƒœκ°€ μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€. μƒλŒ€μ μœΌλ‘œ μ‰½κ²Œ _ν•  수 μžˆλŠ”_ λͺ¨λ“  것은 μ΄ˆκΈ°ν™”/디렉토리 탐색과 _ν•˜λ‚˜μ˜ 단일_ νŒŒμ„œ μŠ€λ ˆλ“œμž…λ‹ˆλ‹€.

BTW, μ½”λ“œμ—μ„œ 이 μ˜μ—­μ„ κ°œμ„ ν•˜λŠ” 것이 쒋은 생각이 μ•„λ‹ˆλΌλŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€. 제 μƒκ°μ—λŠ” κ·Έλ ‡κ²Œ μƒκ°ν•©λ‹ˆλ‹€(특히 κ°€λŠ₯ν•œ 미래의 libctags의 경우). μ„±λŠ₯이 λͺ©ν‘œλΌλ©΄ μ•„λ§ˆλ„ (ν˜„μž¬) λ…Έλ ₯ν•  κ°€μΉ˜κ°€ μ—†μœΌλ©° 집쀑해야 ν•  더 μ€‘μš”ν•œ μ˜μ—­μ΄ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

BTW, ν”„λ‘œνŒŒμΌλŸ¬λ₯Ό μ‹œμž‘ν•˜κ³  μ—„μ²­λ‚œ μ–‘μ˜ 데이터λ₯Ό ν”„λ‘œνŒŒμΌλ§ν•˜λŠ” 것은 μ•„λ§ˆλ„ ν₯미둜울 κ²ƒμž…λ‹ˆλ‹€.

GNU 병렬이 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ–ΈκΈ‰ ν•œ 바와 같이 이전 , μ΅œμ ν™” λ…μ„œλŠ” ctagsλ₯Όμ—κ²Œ κ½€ 속도λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

I/Oκ°€ μΊμ‹œμ—μ„œ μ˜€λŠ” 경우 νŒŒμ„œμ˜ 병렬 싀행은 μž‘μ—… 속도λ₯Ό μƒλ‹Ήνžˆ 높일 수 μžˆμŠ΅λ‹ˆλ‹€(그리고 이것은 μ’…μ’… νŽΈμ§‘κΈ°μ—μ„œ λ””λ ‰ν† λ¦¬μ—μ„œ ctagsλ₯Ό μ‹€ν–‰ν•˜λŠ” N번째 κ²½μš°μž…λ‹ˆλ‹€).

@pragmaware IMO, λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν¬ν¬ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

일본어 ν…μŠ€νŠΈλ₯Ό μ½λŠ” 경우 https://qiita.com/dalance/items/c76141a097e25fabefe8 기사λ₯Ό
(이 λŒ“κΈ€μ„ μž‘μ„±ν•˜λ‹€κ°€ ptags용 git μ €μž₯μ†Œλ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€(https://github.com/dalance/ptags). νŽ˜μ΄μ§€λŠ” μ˜μ–΄λ‘œ μž‘μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.)

μž‘μ„±μžκ°€ κ°œλ°œν•œ ptagsλΌλŠ” 도ꡬλ₯Ό λ³΄κ³ ν•©λ‹ˆλ‹€. 이 λ„κ΅¬λŠ” Rust둜 μž‘μ„±λ˜μ—ˆμœΌλ©° ctagsλ₯Ό λž˜ν•‘ν•©λ‹ˆλ‹€.
μž…λ ₯ μ„ΈνŠΈμ— λŒ€ν•΄ λ³‘λ ¬λ‘œ ctagλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
λ‚˜λŠ” κ·Έκ²ƒμ˜ λ‚΄λΆ€λ₯Ό μ•½νƒˆν•˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ‚˜ λΆ„λͺ…νžˆ μ—¬λŸ¬ ctag ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

κ²°κ³ΌλŠ” μƒλ‹Ήνžˆ μΈμƒμ μž…λ‹ˆλ‹€. 단일 μ²˜λ¦¬λ³΄λ‹€ 5λ°° λΉ λ¦…λ‹ˆλ‹€. CPU μˆ˜λŠ” κΈ°λ‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ ν¬κΈ°λŠ” μΆ©λΆ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€(=128GB). μž‘μ„±μžλŠ” νŽ˜μ΄μ§€ μΊμ‹œλ₯Ό 뜨겁게 λ§Œλ“€κΈ° μœ„ν•΄ λ™μΌν•œ μž…λ ₯ μ„ΈνŠΈμ— λŒ€ν•΄ 10번 ptagsλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μž‘μ—…μ€ ptags와 같은 λž˜νΌμ—μ„œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ 이 ν›Œλ₯­ν•œ κ²°κ³Όλ₯Ό λ¬΄μ‹œν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
λ‚˜λŠ” 빨리 ν•΄ν‚Ήν–ˆλ‹€. https://github.com/masatake/ctags/tree/parallel
μƒˆλ‘œ λ„μž…λœ μ˜΅μ…˜ --_parallel은 _parallelμ—μ„œ μ—¬λŸ¬ ctags ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

μž‘μ—…μž ν”„λ‘œμ„ΈμŠ€μ˜ 수인 8은 ν•˜λ“œ μ½”λ”©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ λ…ΈνŠΈ PCμ—λŠ” 8개의 μ½”μ–΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.
λ©”λͺ¨λ¦¬λŠ” 32GBμž…λ‹ˆλ‹€. λŒ€μƒ μž…λ ₯은 μ΅œμ‹  Linux 컀널 μ†ŒμŠ€ νŠΈλ¦¬μž…λ‹ˆλ‹€.
λ‚΄ .ctagsλŠ” μΆ©λΆ„νžˆ 털이 μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ³ΌλŠ” 거의 λ™μΌν•©λ‹ˆλ‹€. 2~3λ°° λΉ λ¦…λ‹ˆλ‹€.

[yamato@master]~/var/ctags-github% cat run.sh
cat run.sh
for i in $(seq 1 5); do
    echo "#"
    echo "# TRAIL #$i"
    echo "#"
    echo "# parallel 8"
    time  ./ctags    --_parallel -R  ~/var/linux > /dev/null
    echo "# single"
    time  ./ctags -o - --sort=no -R  ~/var/linux > /dev/null
done
[yamato@master]~/var/ctags-github% bash run.sh 
bash run.sh 
#
# TRAIL #1
#
# parallel 8

real    0m29.073s
user    3m5.791s
sys 0m32.347s
# single

real    1m21.397s
user    1m14.601s
sys 0m6.521s
#
# TRAIL #2
#
# parallel 8

real    0m29.746s
user    3m4.601s
sys 0m32.175s
# single

real    1m26.660s
user    1m19.176s
sys 0m7.191s
#
# TRAIL #3
#
# parallel 8

real    0m28.290s
user    3m2.524s
sys 0m31.081s
# single

real    1m21.927s
user    1m14.775s
sys 0m6.896s
#
# TRAIL #4
#
# parallel 8

real    0m28.644s
user    3m3.839s
sys 0m31.756s
# single

real    1m13.319s
user    1m7.294s
sys 0m5.843s
#
# TRAIL #5
#
# parallel 8

real    0m29.274s
user    3m9.387s
sys 0m32.363s
# single

real    1m13.621s
user    1m7.487s
sys 0m5.941s
[yamato@master]~/var/ctags-github% 

(두 개의 νƒœκ·Έ νŒŒμΌμ„ λΉ„κ΅ν•΄λ΄€μŠ΅λ‹ˆλ‹€. μ°¨μ΄λŠ” μ—†μŠ΅λ‹ˆλ‹€.)

λ§Œμ‘±κ³ΌλŠ” 거리가 λ©€μ§€λ§Œ μ‹œμž‘ν•˜κΈ°μ— 쒋은 κ³³μž…λ‹ˆλ‹€.

λ…Έλ™μžλ“€μ˜ μ‚°μΆœλ¬Όμ„ λͺ¨μ•„μ•Ό ν•˜λŠ”μ§€ 말아야 ν•˜λŠ”μ§€ κΆκΈˆν•˜λ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @masatake μ €λŠ” μž‘μ—…ν•  κ³„νšμ΄ μ—†λŠ” μ—΄λ¦° 티켓을 λͺ¨λ‘ λ‹«μœΌλ €κ³  ν•©λ‹ˆλ‹€. 이 ν‹°μΌ“ μž‘μ—…μ— 관심이 μžˆμœΌμ‹œλ©΄ ν…μŠ€νŠΈλ₯Ό μƒˆ 티켓에 볡사해 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” μ•žμœΌλ‘œ 이 ν•­λͺ©μ— λŒ€ν•΄ μž‘μ—…ν•  κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ° ν† λ‘ μ˜ 기둝이 λ‚˜μ—κ²Œ κ°€μΉ˜κ°€ 있기 λ•Œλ¬Έμ— 이 ν•­λͺ©μ„ 열어두고 μ‹ΆμŠ΅λ‹ˆλ‹€.

@masatake μ—¬μ „νžˆ μƒˆ ν‹°μΌ“μ—μ„œ 이 티켓에 μ—°κ²°ν•˜κ³  전체 기둝을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒˆ μž‘μ—…μ„ μœ„ν•΄ "Issues" 탭을 μ •λ¦¬ν•˜λ €κ³  ν•˜κ³  이 ν‹°μΌ“κ³Ό 같은 μ–΄μˆ˜μ„ ν•œ λ‚΄μš©μ΄ λ°©ν•΄κ°€ λ˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이것은 μ €μ—κ²Œ 정말 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

@fommil , Universal Ctags 의 원동λ ₯인 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€ . 버그(λ˜λŠ” GitHub μš©μ–΄λ‘œ "문제")λ₯Ό μ—΄λ©΄ 이 버그가 ν”„λ‘œμ νŠΈμ˜ 속성이 λ©λ‹ˆλ‹€. λ‚˜λŠ” 당신이 그것을 ν•΄μ œν•˜κ³  그것에 λŒ€ν•œ 이메일을 받지 μ•Šμ„ 수 μžˆλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

재개μž₯.

@dtikhonov @masatake 이 티켓을 https://github.com/issues 보기의 μœ μΌν•œ ν‹°μΌ“μž…λ‹ˆλ‹€.

티켓이 λ‹«ν˜€ μžˆμ§€ μ•ŠμœΌλ©΄ 이 λ³΄κΈ°μ—μ„œ 티켓을 μ œκ±°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ꡬ독을 μ·¨μ†Œν•˜λ”λΌλ„.

사싀, 티켓을 생성할 λ•Œ 리포지토리 μ†Œμœ μžκ°€ 이 μ œμ–΄ κΆŒν•œμ„ κ°€μ§ˆ 쀄은 λͺ°λžμŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ κ·Έλ ‡κ²Œ ν•˜μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

이 μž‘μ—…μ„ ν•˜λ €λ©΄ μƒˆ 티켓을 λ§Œλ“€κ³  이 티켓을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. λͺ¨λ“  토둠은 λ³΄μ‘΄λ©λ‹ˆλ‹€. λ˜λŠ” https://github.com/universal-ctags/ctags/issues/761#issuecomment -373720839의 λ‚΄μš©μ„ λ³΅μ‚¬ν•˜μ—¬ μƒˆ 티켓에 λΆ™μ—¬λ„£μœΌμ„Έμš”.

이것은 λ‚΄κ°€ 많이 λ¬»λŠ” 것이 μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

볡사-λΆ™μ—¬λ„£κΈ°λ₯Ό μœ„ν•œ μž„μ‹œ GitHub 계정을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆκΉŒ?
κ·Έλž˜μ„œ 당신은 슀슀둜 볡사-λΆ™μ—¬λ„£κΈ°λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
그런 λ‹€μŒ 계정을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Όλ‘ , 이것이 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μœ μΌν•œ 방법이라면 κ·Έλ ‡κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ™„λ£Œ! 이 티켓을 닫을 수 있게 ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚΄ TODO μž‘μ—…μ„ 크게 μ •λ¦¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

JulienPivard picture JulienPivard  Β·  16μ½”λ©˜νŠΈ

songouyang picture songouyang  Β·  15μ½”λ©˜νŠΈ

jespinal picture jespinal  Β·  8μ½”λ©˜νŠΈ

cweagans picture cweagans  Β·  13μ½”λ©˜νŠΈ

cweagans picture cweagans  Β·  4μ½”λ©˜νŠΈ