Log
-
2020-04-12: 23, 24.6
๊ณผํ์์์ ๊ธฐ์์๋ฃ QCํ๋ R ์ฝ๋๋ฅผ ์งฐ๋๋ฐ, ๊ฝค ์ ๋จน์๋ค.
์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ๋ 8GB.
์ธํ์ผ๋ก ์ฌ์ฉํ๋ csv ํ์ผ์ด ์ต๋ 2GB ์ ๋๋ก ํฌ๊ธด ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์๋ค.
ํ์ง๋ง ๋ถ๋ช ์ธ๋ป ๋ณด๊ธฐ์ 8GB๊ฐ ๋์ง ์์ ๊ฒ ๊ฐ์๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋ ๋ถ์กฑ์ผ๋ก ์๋ฌ๊ฐ ์๊พธ ๋ฌ๋ค.
์ฝ์ด๋ค์ธ ํ์ผ์ ์๋์ผ๋ก ์ชผ๊ฐ ํ ์ด์ฌํ QC๋ฅผ ์งํํ์ง๋ง… ๊ฒฐ๊ตญ ์น๊ตฌ๊ฐ ๋งํด์ค ๊ธฐํ์ ๋๊ฒจ๋ฒ๋ ธ๋ค.
๋ด ์ถ์ธก์… ํจ์๊ฐ ์๋ํ๋ ๊ณผ์ ์์ ๋ด๋ถ์ ์ผ๋ก ๋ณ์๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ด ์์์ ๋๋ ๊ฒ ๊ฐ๋ค.
์์ผ๋ก csv ์ฉ๋์ ์กฐ๊ธ ์ค์ฌ์ ํด๊ฒฐํ ์ ์์ ๋ฏํ์ง๋ง,
๊ทธ๋๋ ์ด๋ฒ ๊ธฐํ์ ์ฝ๋ ์ฑ๋ฅ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ดํ ๋ด์ฉ์ ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ Hadley Godkham์ ์ฑ ์ ๋ค์ฌ๋ค๋ดค๋ค.
๋ด๊ฐ ์ํ๋ ๋ด์ฉ์ 23์ฅ์ ์์๊ณ , ์ฝ๋ ์ฑ๋ฅ(=run time) ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ด๋ จ ๋ด์ฉ์ด ๋ด๊ฒจ ์๋ค.
5. Techniques
23. Measuring performances
23.2 Profiling
23.2.1. Visualising profiles
Profiling์ ์ฝ๋ ํ์คํ์ค์ runtime์ ๋ถ์ํ๋ ๊ฒ์ ๋งํ๋ค.
R์์๋
- RStudio์ profile ๋ฉ๋ด๋ฅผ ์ด์ฉํ๊ฑฐ๋,
utils::Rprof()
,profvis::profvis()
๋ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
profvis
๊ฐ ๋ณด๊ธฐ ํธํ๋ฏ๋ก ์ด๊ฒ๋ง ์ ๋ฆฌํด์ผ์ง.
๋จผ์ ํ๋กํ์ผํ ์ํ ํจ์๋ฅผ ์์ฑํ๊ณ ,
|
|
ํ๋กํ์ผ ์งํ.
์ฝ๋๋ ๊ฐ๋จํ๋ค.
|
|
.Rmd๋ .html์์๋ ์ ์๋ํ์ง๋ง
.md์์๋ ์๋ํ์ง ์๋๋ค.
์ผ๋จ .html์์ ์บก์ณํ ์ด๋ฏธ์ง๋ก ๋์ฒดํ๋๋ฐ, .md์์๋ ์๋ํ๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ์ง?
Flame Graph ํญ์ ์๋ ํจ๋์์๋ ์คํ ํํ๋ก ๊ฐ ์ฝ๋์ ์คํ ์๊ฐ์ ๋ณด์ฌ์ค๋ค. ๊ฐ๋จํ ์ฝ๋์ ํ๋กํ์ผ ๊ฒฐ๊ณผ๋ฅผ ๋์ผ๋ก ํ์ธํ๊ธฐ ์ข๋ค.
์ฝ๋๊ฐ ๋ณต์กํ ๋๋ Dataํญ์์ ํ์ธํ๋ ๊ฒ ํธํ๋ค(๊ณ ํ๋ค). ํ์๊ธฐ ๊ตฌ์กฐ๋ก ๋ณผ ์ ์๋ค.
23.2.2. Memory profiling
running time๋ฟ๋ง ์๋๋ผ memory ์ฌ์ฉ ๋ด์ญ๋ ํ๋กํ์ผ๋ก ๋ถ์ํ ์ ์๋ค.
ํ๋กํ์ผ ๊ฒฐ๊ณผ์ <GC>
(i.e. garbage collector)๋ผ๋ ๊ฑธ ๋ณผ ์ ์๋๋ฐ, ๋ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์์ ๋ ์ญํ ์ ํ๋ค. ์ด๋ป๊ฒ ์๋๋๋์ง ์ดํด๋ณด์.
์ํ garbage ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํ๋กํ์ผ๋งํ๋ฉด…
|
|
์ ํจ๋์์ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ถ์ ๋ง๋๊ฐ ์๊ธด ๊ฑธ ๋ณผ ์ ์๋ค.
์ค๋ฅธ์ชฝ์ผ๋ก ๋ป์ ๊ฑด ์ฌ์ฉ ๋ ๋ฉ๋ชจ๋ฆฌ,
์ผ์ชฝ์ผ๋ก ๋ป์ ๊ฑด <GC>
๊ฐ ์ ๊ฑฐํ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋.
์ฐพ์๋ค.
๋ณธ๋ฌธ์์
Here the problem arises because of copy-on-modify (Section 2.3): each iteration of the loop creates another copy of x. Youโll learn strategies to resolve this type of problem in Section 24.6.
๋ผ๊ณ ์ธ๊ธํ๋๋ฐ,
์ ๊ธฐ copy-on-modify, creastes another copy of x ๋ถ๋ถ์ด ๋ด๊ฐ ์ถ์ธกํ ๋ถ๋ถ์ธ ๋ฏํ๋ค.
์์ธํ ์์ธ์ Section 2.3์, ํด๊ฒฐ๋ฒ์ Section 24.6์ ์ฐธ๊ณ ํ๋๋ค.
23.2.4. Exercises
- Profile the following function with torture = TRUE. What is surprising? Read the source code of rm() to figure out whatโs going on.
|
|
์๋ฌ๊ฐ ๋ฐ์ํ๋ค(‘integer'์ ‘coerceToInteger'์์ ๊ตฌํ๋์ง ์์ ์ ํ์ ๋๋ค). ์๋ฃจ์ ์ ๋ณด๋ ์์ง ํด๊ฒฐ์ด ์ ๋ ๋ฏ.
23.3. Microbenchmarking
Microbenchmark๋ profile์ ์์ฃผ ์์ ์ฝ๋ ๋จ์(i.e. ํจ์ ํ๋)์์ ์ํํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด csv ํ์ผ์ ์ฝ๋ ํจ์ read.csv
, readr::read_csv()
, data.table::fread()
์ด csv ํ์ผ ํ๋ ์ฝ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋น๊ตํ๋ ๊ฒ์ด ์๊ฒ ๋ค.
bench
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
|
|
## # A tibble: 2 x 6
## expression min median `itr/sec` mem_alloc `gc/sec`
## <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
## 1 sqrt(x) 900ns 1.1us 465768. 848B 0
## 2 x^0.5 5.8us 6.1us 114983. 848B 0
๊ฒฐ๊ณผ๋ tibble
ํํ๋ก ์ ์ฅ๋๋ค.
๊ฐ row์๋ ๋น๊ตํ๋ ค๋ expression์ด ์ ์ฅ๋๋ค.
์ฌ๊ธฐ์๋ x์ ๋ฃจํธ๋ฅผ ๊ณ์ฐํ๋ ๋ฐ sqrt()
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ(1ํ) ^
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ(2ํ)์ ๋น๊ตํ๋ค.
sqrt()
ํจ์๊ฐ ์ 6๋ฐฐ ๋น ๋ฅธ ๊ฒ์ผ๋ก ๋ํ๋ฌ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด…
|
|
## Loading required namespace: tidyr
์ด๋ ๊ฒ right-skewed ํํ์ ๊ทธ๋ฆผ์ด ๋ํ๋๋ค(๊ทธ๋์ ํ๊ท ๋ณด๋ค๋ ์ต์๊ฐ์ ๋น๊ตํ์).
23.3.3. Exercises
- Here are two other ways to compute the square root of a vector. Which do you think will be fastest? Which will be slowest? Use microbenchmarking to test your answers.
|
|
๋ฃจํธ ๊ณ์ฐํ๋ ๋ ๋ฐฉ๋ฒ์ ๋น๊ตํด๋ณด๋๋ค. ๋ฑ ๋ด๋ log ์์ ๋ค๊ฐ exp()๋ก ๋๋๋ฆฌ๋ ๊ฒ ๋๋ ค๋ณด์ธ๋ค.
bench::mark()
๋ฅผ ์ฌ์ฉํด์ sqrt()
๋ ๊ฐ์ด ๋น๊ตํด๋ณด์.
|
|
## # A tibble: 3 x 6
## expression min median `itr/sec` mem_alloc `gc/sec`
## <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
## 1 sqrt(x) 1us 1.1us 759671. 848B 0
## 2 x^(1/2) 6.1us 6.4us 141474. 848B 0
## 3 exp(log(x)/2) 13.6us 13.9us 59601. 848B 0
์๊ฐ๋๋ก ๋์๋ค. ๋๊ฐ ๋ฃจํธ ๊ตฌํ ๋ ๊ตณ์ด log-exp๋ฅผ ์ฌ์ฉํ ๊น…
mem_alloc ์ด์์ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ชจ๋ ๊ฐ์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ฌดํผ ์ด๋ฐ ์์ผ๋ก ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๋น๊ตํด๋ณผ ์ ์๋ค.
๊ฒฐ๋ก
profvis()
๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ
์ด๋ ๋ถ๋ถ์์ ์๊ฐ์ ๋ง์ด ์ก์๋จน๊ณ ,
์ด๋ ๋ถ๋ถ์์ ๋ด ์ฝ๋์ ์ฐ๋ ๊ธฐ๊ฐ ๋ง์ด ์๊ธฐ๋์ง ํ์
ํ ์ ์๊ฒ ๋ค.
profvis::profvis()
๊ฐ ์คํฌ๋ฆฝํธ ์ ์ฒด์ ์ํํ๋ ํ๋กํ์ผ์ด๋ผ๋ฉด,
bench::mark()
๋ ํ ๊ณผ์ ๊ณผ์ ์ ๋ํด ์คํ์๊ฐ&๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋น๊ตํด๋ณผ ์ ์๋ค.
ํน์ ์ฝ๋ ์ฑ๋ฅ์ ๊ณ ๋ฏผํด์ผ ํ ๋ ์ฌ์ฉํด๋ณด์.
24. Improving performance
24.6 Avoiding copies
์ด๋จ ๋ copy๊ฐ ์ผ์ด๋๋์ง ์๋ ค์ค ๋ฟ, ํด๊ฒฐ์ฑ
์ ์๋ ค์ฃผ์ง ์๋๋ค.
copy ์ผ์ด๋๋ ๊ฒฝ์ฐ ์์ฒด๋ฅผ ํผํ๋ผ๋ ๋ป์ธ ๋ฏ.
c()
, append()
, cbind
, rbind()
, paste()
, x[i] <- y
๋ฑ์ ์ฌ์ฉํ๋ฉด
์๋ก ๋ง๋ค object๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฒ ๋๋ค.
c์ธ์ด์์ ๋ ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๊ณ ์ถ์ ๋, temp
๋ฑ์ ์๋ก์ด ๋ณ์๋ฅผ ์ด์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒ ๊ฐ๋ค.
x <- 1
y <- 2
temp <- x
x <- y
y <- x
rm(temp)
์๋ ์์๋ฅผ ํตํด copy๊ฐ ์ผ๋ง๋ ์ฝ๋๋ฅผ ๋๋ฆฌ๊ฒ ํ๋์ง ๋ณด์ฌ์ค๋ค.
|
|
## # A tibble: 4 x 4
## expression min median `itr/sec`
## <bch:expr> <bch:tm> <bch:tm> <dbl>
## 1 loop10 28.7us 32us 24857.
## 2 loop100 1.11ms 1.29ms 614.
## 3 vec10 7us 7.5us 112153.
## 4 vec100 49us 49.9us 17895.
random_string()
์ ํตํด ๊ธธ์ด 50์ string์ ์ํ๋ ๋งํผ ๋ง๋ค๊ณ ,
collapse()
๋ paste()
๋ฅผ ์ด์ฉํด ํ ์ค๋ก ๋ฐ๊พผ๋ค.
์ฌ๊ธฐ์ for
๋ฌธ์ ๋จ์ ์ด ๋ํ๋๋ค.
paste()
๋ 100๊ฐ์ง๋ฆฌ๊ฐ 10๊ฐ์ง๋ฆฌ๋ณด๋ค 8๋ฐฐ ์ ๋ ๋๋ ธ๋ ๋ฐ๋ฉด,
for
๋ฌธ์์๋ ์ฝ 30๋ฐฐ ๋๋ ธ๋ค.
์ฑ๋ฅ ์๊ฐํ๋ค๋ฉด for
๋ฐ๋ณต๋ฌธ๋ณด๋ค๋ vectorized method๋ฅผ ์ฌ์ฉํ๋ผ๋ ๊ฒ ์ด๋ฐ ์ด์ ๋ค.
๊ฒฐ๋ก
์ธ์ ๋ณต์ฌ๊ฐ ์ผ์ด๋ ์ง ์์๋๊ณ , ๋๋๋ก ํผํ๋ฉด์ ์ฝ๋ฉํ์.