Open brodieG opened 7 years ago
Clearly qassert triggers way fewer GCs:
qassert
> gcinfo(TRUE) [1] TRUE > simple_vet <- function(x) vet(numeric(2L) && !anyNA(.), x, stop=TRUE) > nums <- runif(2) > for(i in 1:5e4) simple_vet(nums) Garbage collection 206 = 155+20+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 207 = 156+20+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 208 = 157+20+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.5 Mbytes of vectors used (32%) Garbage collection 209 = 157+21+31 (level 1) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 210 = 158+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 211 = 159+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 212 = 160+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 213 = 161+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 214 = 162+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 215 = 163+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 216 = 164+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 217 = 165+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 218 = 166+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) Garbage collection 219 = 167+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.4 Mbytes of vectors used (32%) > simple_2 <- function(x) qassert(x, "N2") > for(i in 1:5e4) simple_qassert(nums) Error in simple_qassert(nums) : could not find function "simple_qassert" > for(i in 1:5e4) simple_2(nums) Garbage collection 220 = 168+21+31 (level 0) ... 35.8 Mbytes of cons cells used (38%) 16.5 Mbytes of vectors used (32%)
Part of the issue is we use R_alloc to initialize strings for every possible step an error could occur, which creates dozens of likely unnecessary allocations.
R_alloc
Clearly
qassert
triggers way fewer GCs: