This is an R Markdown Notebook for exploring the performance of the lua-protobuf library.

Load the libraries we will use:

library(readr)
library(dplyr)

Attaching package: 'dplyr'

The following objects are masked from 'package:stats':

    filter, lag

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(ggplot2)

Load the data produced by protobuf_bench.lua:

data <- read_delim("https://gist.githubusercontent.com/lukego/504dc8d35fd55e96f3f55be6b493d284/raw/82e716ec71ce1d97cbf79b64183d31b9a157bad3/lua-protobuf-bench.csv", "!")
Parsed with column specification:
cols(
  filename = col_character(),
  bytes = col_integer(),
  load.sec = col_double(),
  decode.sec = col_double(),
  encode.sec = col_double()
)
data$loops = 100000 # (This field was missing in the version that produced this data)
data <- mutate(data, msg.usec = (load.sec + decode.sec + encode.sec) * 1000000 / loops)
data <- filter(data, bytes<10240) # Consider only "small-medium" messages < 10K

Check overall percentage of time loading data verses decoding and encoding:

loadtime <- sum(data$load.sec)
decodetime <- sum(data$decode.sec)
encodetime <- sum(data$encode.sec)
totaltime <- loadtime + decodetime + encodetime
list(load.percent = loadtime*100/totaltime,
     decode.percent = decodetime*100/totaltime,
     encode.percent = encodetime*100/totaltime)
$load.percent
[1] 13.46786

$decode.percent
[1] 51.55125

$encode.percent
[1] 34.9809

Plot microseconds elapsed verses message size with a linear regression line:

ggplot(data, aes(y = msg.usec, x = bytes)) +
  geom_point(color = "blue", alpha = 0.5) +
  geom_smooth(method="lm", se=F, color = "red", alpha=0.5) +
  labs(y = "microseconds per message (read+decode+encode)",
       x = "protobuf message size in bytes")

Check the slope and fit of the linear model quantitatively too:

model <- lm(bytes ~ msg.usec, data=data)
summary(model)

Call:
lm(formula = bytes ~ msg.usec, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-1028.09   -74.98   -13.11    32.51  2195.30 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  50.6828    13.6495   3.713 0.000231 ***
msg.usec     22.6836     0.2696  84.133  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 242.4 on 436 degrees of freedom
Multiple R-squared:  0.942, Adjusted R-squared:  0.9418 
F-statistic:  7078 on 1 and 436 DF,  p-value: < 2.2e-16

Linear model seems to fit pretty well both visually and with Rsquared.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2sgZm9yIGV4cGxvcmluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGx1YS1wcm90b2J1ZiBsaWJyYXJ5LgoKTG9hZCB0aGUgbGlicmFyaWVzIHdlIHdpbGwgdXNlOgoKYGBge3IgbWVzc2FnZT1GfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKTG9hZCB0aGUgZGF0YSBwcm9kdWNlZCBieSBwcm90b2J1Zl9iZW5jaC5sdWE6CgpgYGB7ciBtZXNzYWdlPUZ9CmRhdGEgPC0gcmVhZF9kZWxpbSgiaHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9sdWtlZ28vNTA0ZGM4ZDM1ZmQ1NWU5NmYzZjU1YmU2YjQ5M2QyODQvcmF3LzgyZTcxNmVjNzFjZTFkOTdjYmY3OWI2NDE4M2QzMWI5YTE1N2JhZDMvbHVhLXByb3RvYnVmLWJlbmNoLmNzdiIsICIhIikKZGF0YSRsb29wcyA9IDEwMDAwMCAjIChUaGlzIGZpZWxkIHdhcyBtaXNzaW5nIGluIHRoZSB2ZXJzaW9uIHRoYXQgcHJvZHVjZWQgdGhpcyBkYXRhKQpkYXRhIDwtIG11dGF0ZShkYXRhLCBtc2cudXNlYyA9IChsb2FkLnNlYyArIGRlY29kZS5zZWMgKyBlbmNvZGUuc2VjKSAqIDEwMDAwMDAgLyBsb29wcykKZGF0YSA8LSBmaWx0ZXIoZGF0YSwgYnl0ZXM8MTAyNDApICMgQ29uc2lkZXIgb25seSAic21hbGwtbWVkaXVtIiBtZXNzYWdlcyA8IDEwSwpgYGAKCkNoZWNrIG92ZXJhbGwgcGVyY2VudGFnZSBvZiB0aW1lIGxvYWRpbmcgZGF0YSB2ZXJzZXMgZGVjb2RpbmcgYW5kIGVuY29kaW5nOgoKYGBge3J9CmxvYWR0aW1lIDwtIHN1bShkYXRhJGxvYWQuc2VjKQpkZWNvZGV0aW1lIDwtIHN1bShkYXRhJGRlY29kZS5zZWMpCmVuY29kZXRpbWUgPC0gc3VtKGRhdGEkZW5jb2RlLnNlYykKdG90YWx0aW1lIDwtIGxvYWR0aW1lICsgZGVjb2RldGltZSArIGVuY29kZXRpbWUKbGlzdChsb2FkLnBlcmNlbnQgPSBsb2FkdGltZSoxMDAvdG90YWx0aW1lLAogICAgIGRlY29kZS5wZXJjZW50ID0gZGVjb2RldGltZSoxMDAvdG90YWx0aW1lLAogICAgIGVuY29kZS5wZXJjZW50ID0gZW5jb2RldGltZSoxMDAvdG90YWx0aW1lKQpgYGAKClBsb3QgbWljcm9zZWNvbmRzIGVsYXBzZWQgdmVyc2VzIG1lc3NhZ2Ugc2l6ZSB3aXRoIGEgbGluZWFyIHJlZ3Jlc3Npb24gbGluZToKCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHkgPSBtc2cudXNlYywgeCA9IGJ5dGVzKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUYsIGNvbG9yID0gInJlZCIsIGFscGhhPTAuNSkgKwogIGxhYnMoeSA9ICJtaWNyb3NlY29uZHMgcGVyIG1lc3NhZ2UgKHJlYWQrZGVjb2RlK2VuY29kZSkiLAogICAgICAgeCA9ICJwcm90b2J1ZiBtZXNzYWdlIHNpemUgaW4gYnl0ZXMiKQpgYGAKCkNoZWNrIHRoZSBzbG9wZSBhbmQgZml0IG9mIHRoZSBsaW5lYXIgbW9kZWwgcXVhbnRpdGF0aXZlbHkgdG9vOgoKYGBge3J9Cm1vZGVsIDwtIGxtKGJ5dGVzIH4gbXNnLnVzZWMsIGRhdGE9ZGF0YSkKc3VtbWFyeShtb2RlbCkKYGBgCgpMaW5lYXIgbW9kZWwgc2VlbXMgdG8gZml0IHByZXR0eSB3ZWxsIGJvdGggdmlzdWFsbHkgYW5kIHdpdGggUnNxdWFyZWQu