From edff0e613818fd80f36204227ba22292e1aa1527 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:04:17 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20matrix=20ncol(as.data.frame?= =?UTF-8?q?(x))=20coercion=20overhead=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ’‘ What: R/aFIPC.R λ‚΄λΆ€μ˜ μ—΄ 개수 탐색 λ‘œμ§μ—μ„œ λΆˆν•„μš”ν•œ as.data.frame() ν˜•λ³€ν™˜ 제거. 🎯 Why: λ‹¨μˆœνžˆ ncol()을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 행렬을 λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것은 O(N) λ©”λͺ¨λ¦¬ ν• λ‹Ή 및 볡사 μ˜€λ²„ν—€λ“œλ₯Ό 유발. πŸ“Š Impact: λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ ν• λ‹Ή 제거 및 μ‹€ν–‰ μ‹œκ°„ 단좕. πŸ”¬ Measurement: test_local() 전체 ν…ŒμŠ€νŠΈ 정상 톡과 확인. --- .jules/bolt.md | 3 +++ R/aFIPC.R | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index 7d3c603f..ec5a0dcf 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -16,3 +16,6 @@ ## 2025-02-12 - R μ–Έμ–΄μ—μ„œ 반볡적인 mirt λͺ¨λΈ 생성 μ‹œ λΆˆν•„μš”ν•œ λ°μ΄ν„°ν”„λ ˆμž„ λΆ€λΆ„μ§‘ν•© μΆ”μΆœ μ΅œμ ν™” **Learning:** Rμ—μ„œ λ°μ΄ν„°ν”„λ ˆμž„μ˜ νŠΉμ • 열을 μΆ”μΆœν•˜λŠ” μž‘μ—…(`df[cols]`)은 O(N)의 λ©”λͺ¨λ¦¬ 볡사λ₯Ό μˆ˜λ°˜ν•©λ‹ˆλ‹€. `autoFIPC`μ—μ„œ `mirt` λͺ¨λΈμ˜ νŒŒλΌλ―Έν„°λ₯Ό μ„€μ •ν•˜κ±°λ‚˜ ν˜ΈμΆœν•˜λŠ” κ³Όμ • 쀑에 `newformXDataK[colnames(newFormModel@Data$data)]` μ½”λ“œκ°€ λ°˜λ³΅ν•΄μ„œ μ‚¬μš©λ˜μ—ˆκ³ , 심지어 `ncol()`을 μœ„ν•΄ λ‹¨μˆœνžˆ 개수λ₯Ό ꡬ할 λ•Œλ„ μ‚¬μš©λ˜μ–΄ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό μ˜€λ²„ν—€λ“œλ₯Ό μ΄ˆλž˜ν–ˆμŠ΅λ‹ˆλ‹€. **Action:** μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 λ‚΄λΆ€μ—μ„œ λΆˆν•„μš”ν•˜κ²Œ λ°μ΄ν„°ν”„λ ˆμž„ λΆ€λΆ„μ§‘ν•© 연산이 λ°˜λ³΅λ˜μ§€ μ•Šλ„λ‘ μ™ΈλΆ€μ—μ„œ ν•œ 번만 `linkedFormData <- newformXDataK[colnames(newFormModel@Data$data)]`둜 캐싱(caching)ν•œ λ’€, `ncol(linkedFormData)`와 `data = linkedFormData` ν˜•νƒœλ‘œ μž¬μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ 볡사와 O(N) μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. +## 2026-09-16 - R μ–Έμ–΄μ—μ„œ ncol() μ‚¬μš© μ‹œ λΆˆν•„μš”ν•œ as.data.frame() ν˜•λ³€ν™˜ 제거 +**Learning:** Rμ—μ„œ λ‹¨μˆœνžˆ μ—΄ 개수λ₯Ό μ„ΈκΈ° μœ„ν•΄ 행렬을 λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜(`ncol(as.data.frame(matrix))`)ν•˜λŠ” 것은 λΆˆν•„μš”ν•œ O(N) λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό 볡사 μ˜€λ²„ν—€λ“œλ₯Ό μœ λ°œν•˜μ—¬ μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚΅λ‹ˆλ‹€. `ncol()` ν•¨μˆ˜λŠ” 기본적으둜 ν–‰λ ¬(matrix)을 κΈ°λ³Έ μ§€μ›ν•©λ‹ˆλ‹€. +**Action:** μ—΄ 개수λ₯Ό 계산할 λ•Œ λŒ€μƒμ΄ ν–‰λ ¬μ΄κ±°λ‚˜ λ°μ΄ν„°ν”„λ ˆμž„μΌ 수 μžˆλŠ” 경우, λΆˆν•„μš”ν•œ ν˜•λ³€ν™˜ 없이 `ncol(target_object)`와 같이 직접 ν˜ΈμΆœν•˜μ—¬ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 볡사와 O(N) μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. diff --git a/R/aFIPC.R b/R/aFIPC.R index 62546519..c96d7411 100644 --- a/R/aFIPC.R +++ b/R/aFIPC.R @@ -86,8 +86,8 @@ autoFIPC <- if (!is.character(itemtype)) stop('Security Error: itemtype must be a character vector') nItems <- NA_integer_ - if (is.data.frame(newformXData) || is.matrix(newformXData)) nItems <- ncol(as.data.frame(newformXData)) - else if (is.data.frame(oldformYData) || is.matrix(oldformYData)) nItems <- ncol(as.data.frame(oldformYData)) + if (is.data.frame(newformXData) || is.matrix(newformXData)) nItems <- ncol(newformXData) + else if (is.data.frame(oldformYData) || is.matrix(oldformYData)) nItems <- ncol(oldformYData) if (!is.na(nItems) && !(length(itemtype) == 1 || length(itemtype) == nItems)) stop(sprintf('Security Error: itemtype must be length 1 or length %d (number of items).', nItems)) # boolean parameter validation