current commit
180118.1.31 · Add benchmark results plotting scripts
#!/usr/bin/env Rscript

# Usage:
#
#     plot.r data.csv
#
# Output will be placed in SVG files.

library(ggplot2)

args <- commandArgs(trailingOnly = TRUE)

data <- read.table(args[1], header = TRUE, sep = ",")

jitterBoxPlot <- function(data, operation, titleText) {
    print(paste(operation, "---------------------------------------------------------------------------"))

    operationData <- subset(data, data$Operation == operation)

    operationData$Implementation.and.Browser <- factor(
        operationData$Implementation.and.Browser,
        levels = c(
            "JavaScript.Chrome.Canary",
            "WebAssembly.Chrome.Canary",
            "JavaScript.Firefox.Nightly",
            "WebAssembly.Firefox.Nightly"
        )
    )

    chromeJs <- subset(operationData,
                       operationData$Implementation.and.Browser == "JavaScript.Chrome.Canary")$Time
    print(paste("mean: scala.js: Chrome+JS =", mean(chromeJs)))
    print(paste("cv: scala.js: Chrome+JS =", sd(chromeJs) / mean(chromeJs)))

    chromeWasm <- subset(operationData,
                         operationData$Implementation.and.Browser == "WebAssembly.Chrome.Canary")$Time
    print(paste("mean: scala.js: Chrome+Wasm =", mean(chromeWasm)))
    print(paste("cv: scala.js: Chrome+Wasm =", sd(chromeWasm) / mean(chromeWasm)))

    firefoxJs <- subset(operationData,
                        operationData$Implementation.and.Browser == "JavaScript.Firefox.Nightly")$Time
    print(paste("mean: scala.js: Firefox+JS =", mean(firefoxJs)))
    print(paste("cv: scala.js: Firefox+JS =", sd(firefoxJs) / mean(firefoxJs)))

    firefoxWasm <- subset(operationData,
                          operationData$Implementation.and.Browser == "WebAssembly.Firefox.Nightly")$Time
    print(paste("mean: scala.js: Firefox+Wasm =", mean(firefoxWasm)))
    print(paste("cv: scala.js: Firefox+Wasm =", sd(firefoxWasm) / mean(firefoxWasm)))

    print(paste("normalized: Chrome =", mean(chromeWasm) / mean(chromeJs)))
    print(paste("normalized: Firefox =", mean(firefoxWasm) / mean(firefoxJs)))

    thePlot <- ggplot(operationData,
                      aes(x = operationData$Implementation.and.Browser,
                          y = operationData$Time,
                          color = operationData$Implementation.and.Browser,
                          pch = operationData$Implementation.and.Browser)) +
        geom_boxplot(outlier.shape = NA) +
        geom_jitter(position = position_jitter(width = 0.1)) +
        scale_y_continuous(limits = quantile(operationData$Time, c(NA, 0.99))) +
        expand_limits(y = 0) +
        theme(legend.position = "none",
              axis.text.x = element_text(angle = 45, hjust = 1),
              axis.title.x = element_blank()) +
        ggtitle(titleText) +
        labs(y = "Time (ms)",
             subtitle = "Scala.JS Source Map (Mappings String Size = 14,964,446)")

    ## print(thePlot)
    svgFile <- paste(operation, ".scalajs.svg", sep="")
    ggsave(plot = thePlot,
           file = svgFile,
           device = "svg")
}

largeData <- subset(data, Mappings.Size==14964446)

jitterBoxPlot(largeData, "set.first.breakpoint", "Set First Breakpoint")
jitterBoxPlot(largeData, "subsequent.setting.breakpoints", "Subsquent Setting Breakpoints")

jitterBoxPlot(largeData, "first.pause.at.exception", "First Pause at Exception")
jitterBoxPlot(largeData, "subsequent.pausing.at.exceptions", "Subsequent Pausing at Exceptions")

jitterBoxPlot(largeData, "parse.and.iterate", "Parse and Iterate Each Mapping")
jitterBoxPlot(largeData, "iterate.already.parsed", "Already Parsed, Iterate Each Mapping")

meanPlot <- function(data, operation, titleText) {
    operationData <- subset(data, data$Operation == operation)

    operationData$Implementation.and.Browser <- factor(
        operationData$Implementation.and.Browser,
        levels = c(
            "JavaScript.Chrome.Canary",
            "WebAssembly.Chrome.Canary",
            "JavaScript.Firefox.Nightly",
            "WebAssembly.Firefox.Nightly"
        )
    )

    thePlot <- ggplot(operationData,
                      aes(x = operationData$Mappings.Size,
                          y = operationData$Time,
                          color = operationData$Implementation.and.Browser,
                          pch = operationData$Implementation.and.Browser)) +
        stat_summary(fun.y = mean, geom = "line") +
        stat_summary(fun.y = mean, geom = "point") +
        geom_point() +
        theme(legend.position = "bottom",
              legend.direction="vertical",
              legend.title = element_blank()) +
        scale_y_continuous(limits = quantile(operationData$Time, c(NA, 0.99))) +
        ## scale_x_log10() +
        ## scale_y_log10() +
        expand_limits(y = 0) +
        ggtitle(titleText) +
        labs(x = "Mappings String Size",
             y = "Time (ms)",
             subtitle = "Mean")

    ## print(thePlot)
    svgFile <- paste(operation, ".mean.svg", sep="")
    ggsave(plot = thePlot,
           file = svgFile,
           device = "svg")
}

meanPlot(data, "set.first.breakpoint", "Set First Breakpoint")
meanPlot(data, "subsequent.setting.breakpoints", "Subsequent Setting Breakpoints")
meanPlot(data, "first.pause.at.exception", "First Pause at Exception")
meanPlot(data, "subsequent.pausing.at.exceptions", "Subsequent Pausing at Exceptions")
meanPlot(data, "parse.and.iterate", "Parse and Iterate Each Mapping")
meanPlot(data, "iterate.already.parsed", "Already Parsed, Iterate Each Mapping")