Skip to content

Instantly share code, notes, and snippets.

@traversc
Last active April 21, 2025 02:44
Show Gist options
  • Save traversc/a5382a24b7fbaf89b2926fc1804104b0 to your computer and use it in GitHub Desktop.
Save traversc/a5382a24b7fbaf89b2926fc1804104b0 to your computer and use it in GitHub Desktop.
Sakura multiclass hashmap benchmark
library(sakura)
library(microbenchmark)
library(dplyr)
class_names <- sapply(1:48, function(i) {
paste0("class", i)
})
sfuncs <- lapply(1:48, function(i) {
function(x) as.raw(i)
})
ufuncs <- lapply(1:48, function(i) {
function(x) {
if(x != i) stop("wrong serialization function")
result <- new.env()
class(result) <- paste0("class",i)
result
}
})
config1 <- sakura::serial_config(class = class_names[1],
sfunc = sfuncs[[1]],
ufunc = ufuncs[[1]])
config16 <- sakura::serial_config(class = class_names[1:16],
sfunc = sfuncs[1:16],
ufunc = ufuncs[1:16])
config48 <- sakura::serial_config(class = class_names,
sfunc = sfuncs,
ufunc = ufuncs)
generate_class_list <- function(k, m, n) {
lapply(1:n, function(i) {
result <- new.env()
class_name <- paste0("class", sample.int(k, 1))
if(m > 0) {
extra_inherits <- paste0("class", LETTERS[1:m])
class(result) <- sample(c(class_name, extra_inherits))
} else {
class(result) <- class_name
}
result
})
}
list_k1_m0_n1 <- generate_class_list(1,0,1)
list_k1_m0_n20000 <- generate_class_list(1,0,20000)
list_k16_m0_n20000 <- generate_class_list(16,0,20000)
list_k16_m2_n20000 <- generate_class_list(16,2,20000)
list_k48_m2_n20000 <- generate_class_list(48,2,20000)
mb <- microbenchmark(
k1_m0_n1 = sakura::serialize(list_k1_m0_n1, config1),
k1_m0_n20000 = sakura::serialize(list_k1_m0_n20000, config1),
k16_m0_n20000 = sakura::serialize(list_k16_m0_n20000, config16),
k16_m2_n20000 = sakura::serialize(list_k16_m2_n20000, config16),
k48_m2_n20000 = sakura::serialize(list_k48_m2_n20000, config48), times = 10, unit = "ms")
print(mb, signif=2)
k1_m0_n1 <- sakura::serialize(list_k1_m0_n1, config1)
k1_m0_n20000 <- sakura::serialize(list_k1_m0_n20000, config1)
k16_m0_n20000 <- sakura::serialize(list_k16_m0_n20000, config16)
k16_m2_n20000 <- sakura::serialize(list_k16_m2_n20000, config16)
k48_m2_n20000 <- sakura::serialize(list_k48_m2_n20000, config48)
mb <- microbenchmark(
k1_m0_n1 = sakura::unserialize(k1_m0_n1, config1),
k1_m0_n20000 = sakura::unserialize(k1_m0_n20000, config1),
k16_m0_n20000 = sakura::unserialize(k16_m0_n20000, config16),
k16_m2_n20000 = sakura::unserialize(k16_m2_n20000, config16),
k48_m2_n20000 = sakura::unserialize(k48_m2_n20000, config48), times = 10, unit = "ms")
print(mb, signif=2)
# check result correctness
res <- sakura::unserialize(k48_m2_n20000, config48)
class_original <- sapply(1:length(list_k48_m2_n20000), function(i) {
class(list_k48_m2_n20000[[i]]) %>% grep("[0-9]", ., value=T)
})
class_unserialized <- sapply(res, class)
all(class_original == class_unserialized) # [1] TRUE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment