Generated: 2026-08-05 17:35:36 IDT
R analog of benchmark_model_fits_python.html — same three tables, same table shape, same three-color row coding.
This report compares the performance of EDI's Rcpp-optimized model fitting paths against low-level canonical R implementations (e.g., glm.fit, lm.fit, coxph.fit) where possible.
These rows are read from build metadata compiled into the loaded EDI shared object via edi_build_info_cpp().
Compilation warning: EDI model-fit timings are sensitive to the compiler flags used to build the loaded EDI.so. If EDI is compiled without the proper optimized flags, or with flags that are known to degrade these kernels such as problematic LTO builds, the benchmark can show substantial performance regressions that reflect the binary build rather than the modeling algorithms.
/home/kapelner/R/x86_64-pc-linux-gnu-library/4.7/EDI/libs/EDI.so2026-08-05 17:18:26configure-generated header compiled into EDI.so2026-08-04 19:53:02 IDTLAPTOP-J2T9TGGBR Under development (unstable) (2026-04-23 r89955) -- "Unsuffered Consequences"CXX20 at build: g++CXX20STD at build: -std=gnu++20CXX20FLAGS at build: -O3 -march=native -funroll-loops -fno-math-errno -UNDEBUG -Wall -pedantic -g -O0SHLIB_OPENMP_CXXFLAGS at build: unavailableEDI_PORTABLE=0, EDI_DISABLE_VECTORIZATION=0, EDI_NATIVE_SPEED=1, EDI_NATIVE_LTO=0PKG_CPPFLAGS at build: ``PKG_CXXFLAGS at build: $(SHLIB_OPENMP_CXXFLAGS) -DNDEBUG -DEIGEN_NO_DEBUG -Wno-ignored-attributes -march=native -mtune=native -fno-lto; override CXXFLAGS+=-O3PKG_LIBS at build: $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -ltbb12 -fstack-protector15.2.0TRUEFALSEFALSEAll benchmarks were performed on a synthetic clinical-trial-scale dataset generated for each response type. The data generation process ensures numerical stability and fair solver comparison by using the following parameters:
iBCRD, and 4 continuous covariates ($X \sim \text{Normal}(0, 1)$).iBCRD design.InferenceSurvivalStratCoxPHRegr, the benchmark injects low-cardinality covariates before outcome generation so the row exercises a genuinely stratified Cox fit rather than the unstratified fallback.fast_logistic_regression_cpp, fast_ordinal_regression_cpp) with all design matrices and fixed inputs pre-built outside the timed region. There is no R6 object instantiation, no cached state management, no warm start storage, and no standard error computation in the timed region — only the raw numerical solver.glm.fit, lm.fit, coxph.fit) with pre-built design matrices. If a canonical package exposes no low-level function, the formula-based API is used instead.system.time; paths below 0.01 ms use microbenchmark(times = 5000) instead.Timing Pval reports a Welch two-sample t-test comparing the EDI and canonical timing replicate distributions for each row. The unlabeled final column marks thresholds with *** for p < 0.001, ** for p < 0.01, and * for p < 0.05.Speedup > 1 and Timing Pval < 0.05; light grey rows indicate NA timing comparisons from a failed fit; light blue rows are estimators with no canonical R implementation at all (only EDI is timed, Canonical Time/Speedup/Timing Pval are NA by design).InferenceContinQuantileRegr → quantreg::rq.fit/rq, InferenceIncidExactFisher → stats::fisher.test, InferenceSurvivalKMDiff's Wald standard error → survival::survfit, InferenceAllSimpleWilcox's Wald p-value → stats::wilcox.test) were run through the same timing harness as every other row, but are omitted from the tables below. Since EDI and canonical are executing effectively the same underlying call in these cases, any measured timing delta reflects incidental implementation details (argument pre-building, table construction) rather than a genuine numerical-kernel speedup, and would misrepresent EDI's actual overhead over the wrapped function — which is negligible.package_metadata/python_bindings_package_spec.md for the underlying baseline-gap analysis.EDI faster, significant NA timing comparison no canonical R implementation
| Class | Response | EDI Time (ms) | Canonical Pkg | Canonical Func | Canonical Time (ms) | Speedup | Timing Pval | |
|---|---|---|---|---|---|---|---|---|
| InferenceAllSimpleWilcox | continuous | 0.30 | stats | HL median pairwise diff | 2.22 | 7.42x | 5.71e-17 | *** |
| InferenceContinGLMM (pairs) | continuous | 0.31 | None | no canonical R implementation | NA | NA | NA | |
| InferenceContinOLS | continuous | 0.02 | stats | lm.fit | 0.10 | 5.45x | 2.54e-23 | *** |
| InferenceContinRobustRegr | continuous | 0.12 | MASS | rlm(MM) | 61.75 | 498.44x | 2.98e-34 | *** |
| InferenceIncidBinomialIdentityRiskDiff | incidence | 0.18 | stats | glm.fit(ident) | 14.91 | 81.64x | 1.01e-23 | *** |
| InferenceIncidGCompRiskDiff | incidence | 0.19 | stats | glm.fit+gcomp(RD) | 1.84 | 9.77x | 8.94e-24 | *** |
| InferenceIncidGCompRiskRatio | incidence | 0.19 | stats | glm.fit+gcomp(RR) | 1.85 | 9.71x | 3.14e-20 | *** |
| InferenceIncidKKCondLogitGLMMOneLik | incidence | 27.29 | None | no canonical R implementation | NA | NA | NA | |
| InferenceIncidLogBinomial | incidence | 2.60 | stats | glm.fit(log) | 16.62 | 6.39x | 4.6e-30 | *** |
| InferenceIncidLogRegr | incidence | 0.16 | stats | glm.fit | 1.92 | 12.06x | 2.87e-23 | *** |
| InferenceIncidModifiedPoisson | incidence | 0.14 | stats | glm.fit(modified) | 2.49 | 17.62x | 2.89e-23 | *** |
| InferenceIncidProbitRegr | incidence | 0.41 | stats | glm.fit(probit) | 2.47 | 6x | 2.25e-21 | *** |
| InferenceIncidRiskDiff | incidence | 0.02 | stats | lm.fit(LPM) | 0.18 | 7.71x | 3.96e-27 | *** |
| InferenceCountGLMM (pairs) | count | 11.25 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountHurdleNegBin | count | 2.23 | pscl | hurdle(nb) | 58.12 | 26.03x | 5.41e-33 | *** |
| InferenceCountHurdlePoisson | count | 1.97 | pscl | hurdle | 23.00 | 11.67x | 1.87e-32 | *** |
| InferenceCountHurdlePoisson (pairs) | count | 6.34 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountKKCondPoissonOneLik | count | 0.12 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountNegBin | count | 0.53 | MASS | glm.nb | 64.50 | 121.44x | 1.07e-33 | *** |
| InferenceCountPoisson | count | 0.13 | stats | glm.fit | 2.68 | 21.27x | 6.28e-23 | *** |
| InferenceCountQuasiPoisson | count | 0.15 | stats | glm.fit(quasi) | 2.23 | 14.52x | 4.79e-25 | *** |
| InferenceCountRobustPoisson | count | 0.17 | stats | glm.fit | 2.80 | 16.9x | 1.1e-20 | *** |
| InferenceCountZeroInflatedNegBin | count | 1.43 | pscl | zeroinfl(nb) | 212.00 | 148.73x | 1.3e-23 | *** |
| InferenceCountZeroInflatedPoisson | count | 4.34 | pscl | zeroinfl | 85.17 | 19.63x | 4.9e-24 | *** |
| InferencePropBetaRegr | proportion | 1.20 | betareg | betareg.fit | 39.21 | 32.77x | 2.49e-30 | *** |
| InferencePropFractionalLogit | proportion | 0.16 | stats | glm.fit(quasi) | 1.67 | 10.2x | 9.95e-21 | *** |
| InferencePropGCompMeanDiff | proportion | 0.24 | stats | glm.fit(quasi)+gcomp | 1.97 | 8.07x | 2.41e-22 | *** |
| InferencePropZeroOneInflatedBetaRegr | proportion | 7.71 | None | no canonical R implementation | NA | NA | NA | |
| InferenceSurvivalCoxPHRegr | survival | 0.41 | survival | coxph.fit(breslow) | 0.68 | 1.68x | 9.57e-23 | *** |
| InferenceSurvivalKKWeibullFrailtyOneLik | survival | 3.74 | None | no canonical R implementation | NA | NA | NA | |
| InferenceSurvivalKMDiff | survival | 0.02 | survival | survfit(median) | 4.66 | 223.63x | 2.07e-27 | *** |
| InferenceSurvivalLogRank | survival | 0.03 | survival | survdiff | 3.35 | 118.09x | 7.7e-19 | *** |
| InferenceSurvivalRestrictedMeanDiff | survival | 0.02 | survival | survfit(rmean) | 3.88 | 186.91x | 2.38e-29 | *** |
| InferenceSurvivalStratCoxPHRegr | survival | 0.82 | survival | coxph.fit(strat) | 1.13 | 1.39x | 2.43e-07 | *** |
| InferenceSurvivalWeibullRegr | survival | 0.07 | survival | survreg | 5.01 | 70.58x | 2.07e-23 | *** |
| InferenceOrdinalAdjCatLogitRegr | ordinal | 0.60 | VGAM | vglm(acat) | 18.19 | 30.25x | 7.42e-19 | *** |
| InferenceOrdinalCLMM (pairs) | ordinal | 29.70 | None | no canonical R implementation | NA | NA | NA | |
| InferenceOrdinalCauchitRegr | ordinal | 0.72 | ordinal | clm(cauchit) | 14.43 | 20.14x | 4.52e-28 | *** |
| InferenceOrdinalCloglogRegr | ordinal | 0.59 | ordinal | clm(cloglog) | 10.08 | 17x | 1.54e-27 | *** |
| InferenceOrdinalContRatioRegr | ordinal | 0.27 | VGAM | vglm(cratio) | 17.27 | 63.97x | 1.59e-29 | *** |
| InferenceOrdinalGCompMeanDiff | ordinal | 0.60 | ordinal | clm+gcomp | 16.23 | 26.89x | 4.3e-13 | *** |
| InferenceOrdinalGLMM (pairs) | ordinal | 62.88 | None | no canonical R implementation | NA | NA | NA | |
| InferenceOrdinalOrderedProbitRegr | ordinal | 0.52 | ordinal | clm(probit) | 9.37 | 17.95x | 1.83e-14 | *** |
| InferenceOrdinalPropOddsRegr | ordinal | 0.63 | ordinal | clm | 9.10 | 14.46x | 3.59e-23 | *** |
| InferenceOrdinalStereotypeLogitRegr | ordinal | 1.35 | None | no canonical R implementation | NA | NA | NA |
This table compares the performance of Full Inference (Model Fit + Standard Error calculation + P-value derivation).
Unlike the point-estimation table above, these results include the computational cost of the variance-covariance matrix (Hessian or Fisher Information) and the Wald test statistic calculation.
All paths (EDI and Canonical) use a reduced sample size ($N=200$) for this full-inference benchmark to ensure iterative stability.
Stratified Cox Exception: For InferenceSurvivalStratCoxPHRegr, the benchmark injects low-cardinality covariates before outcome generation so the row exercises a genuinely stratified Cox fit rather than the unstratified fallback.
EDI regression models (Logistic, Poisson) are benchmarked using the IRLS optimizer for these Wald tests.
Solver-Only Prebuilds: Benchmark setup prebuilds exposed observed-data design matrices, reduced design matrices, strata IDs, and other fixed working inputs outside the timed region when the implementation exposes those hooks. The timed region then measures the full-inference kernel on those fixed inputs.
Limitation: Some canonical comparators only expose formula-based APIs rather than comparable low-level fit kernels. Those rows remain included, but their canonical timings may still contain formula/model-frame overhead beyond the numerical solver, variance, and p-value work itself.
Timing Note: All timings are medians over 30 warmed runs measured with adaptive batched system.time; paths below 0.01 ms use microbenchmark(times = 5000) instead.
Timing P-Value: Timing Pval reports a Welch two-sample t-test comparing the EDI and canonical timing replicate distributions for each row. The unlabeled final column marks thresholds with *** for p < 0.001, ** for p < 0.01, and * for p < 0.05.
Row Highlighting: Light green rows indicate Speedup > 1 and Timing Pval < 0.05; light grey rows indicate NA timing comparisons from a failed fit; light blue rows are estimators with no canonical R implementation at all (only EDI is timed, Canonical Time/Speedup/Timing Pval are NA by design).
EDI faster, significant NA timing comparison no canonical R implementation
| Class | Response | EDI Time (ms) | Canonical Pkg | Canonical Func | Canonical Time (ms) | Speedup | Timing Pval | |
|---|---|---|---|---|---|---|---|---|
| InferenceAllSimpleMeanDiffPooledVar | continuous | 0.12 | stats | t.test(pool) | 0.49 | 4.2x | 1.6e-14 | *** |
| InferenceContinGLMM (pairs) | continuous | 0.14 | None | no canonical R implementation | NA | NA | NA | |
| InferenceContinLin | continuous | 0.43 | stats | lm.fit(interact)+Wald | 0.74 | 1.73x | 0.524 | |
| InferenceContinOLS | continuous | 0.02 | stats | lm.fit+Wald | 0.09 | 4.01x | 2.02e-29 | *** |
| InferenceContinRobustRegr | continuous | 0.06 | MASS | rlm+summary | 1.69 | 27.33x | 2.29e-28 | *** |
| InferenceIncidGCompRiskDiff | incidence | 0.10 | stats | glm+gcomp(RD)+Wald | 3.35 | 33.73x | 2.35e-22 | *** |
| InferenceIncidGCompRiskRatio | incidence | 0.09 | stats | glm+gcomp(RR)+Wald | 2.94 | 31.1x | 5.47e-22 | *** |
| InferenceIncidKKCondLogitGLMMOneLik | incidence | 5.37 | None | no canonical R implementation | NA | NA | NA | |
| InferenceIncidLogBinomial | incidence | 0.32 | stats | glm.fit+Wald(log) | 4.88 | 15.17x | 2.2e-15 | *** |
| InferenceIncidLogRegr | incidence | 0.08 | stats | glm.fit+Wald | 0.98 | 11.84x | 9.55e-28 | *** |
| InferenceIncidMiettinenNurminenRiskDiff | incidence | 0.01 | DescTools | BinomDiffCI(mn) | 0.87 | 60.27x | 1.67e-27 | *** |
| InferenceIncidNewcombeRiskDiff | incidence | 0.11 | DescTools | BinomDiffCI(score) | 0.92 | 8.63x | 1.23e-30 | *** |
| InferenceIncidProbitRegr | incidence | 0.12 | stats | glm.fit(probit)+Wald | 1.23 | 10.52x | 9.28e-27 | *** |
| InferenceIncidRiskDiff | incidence | 0.02 | stats | prop.test | 0.58 | 23.49x | 7.63e-25 | *** |
| InferenceCountGLMM (pairs) | count | 2.34 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountHurdleNegBin | count | 0.44 | pscl | hurdle(nb)+summary | 18.46 | 42.04x | 1.65e-21 | *** |
| InferenceCountHurdlePoisson | count | 0.95 | pscl | hurdle+summary | 13.82 | 14.58x | 1.73e-31 | *** |
| InferenceCountHurdlePoisson (pairs) | count | 0.52 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountKKCondPoissonOneLik | count | 0.06 | None | no canonical R implementation | NA | NA | NA | |
| InferenceCountNegBin | count | 0.21 | MASS | glm.nb+summary | 42.00 | 204.13x | 5.18e-28 | *** |
| InferenceCountPoisson | count | 0.08 | stats | glm.fit+Wald | 1.24 | 15.88x | 1.07e-30 | *** |
| InferenceCountQuasiPoisson | count | 0.06 | stats | glm.fit+Wald(quasi) | 1.11 | 18.97x | 5.18e-30 | *** |
| InferenceCountRobustPoisson | count | 0.11 | sandwich | glm+vcovHC | 4.91 | 46.22x | 1.55e-30 | *** |
| InferenceCountZeroInflatedNegBin | count | 0.91 | pscl | zeroinfl(nb)+summary | 85.17 | 93.08x | 5.2e-25 | *** |
| InferenceCountZeroInflatedPoisson | count | 1.77 | pscl | zeroinfl+summary | 38.50 | 21.77x | 3.44e-33 | *** |
| InferencePropBetaRegr | proportion | 0.38 | betareg | betareg+summary | 21.56 | 56.11x | 1.38e-22 | *** |
| InferencePropGCompMeanDiff | proportion | 0.09 | stats | glm(quasi)+gcomp+Wald | 3.01 | 32.99x | 7.52e-26 | *** |
| InferencePropZeroOneInflatedBetaRegr | proportion | 1.14 | None | no canonical R implementation | NA | NA | NA | |
| InferenceSurvivalCoxPHRegr | survival | 0.21 | survival | coxph.fit(breslow)+Wald | 0.60 | 2.81x | 1.46e-30 | *** |
| InferenceSurvivalGehanWilcox | survival | 0.02 | survival | survdiff(rho=1) | 2.20 | 136.34x | 2.04e-31 | *** |
| InferenceSurvivalKKWeibullFrailtyOneLik | survival | 1.38 | None | no canonical R implementation | NA | NA | NA | |
| InferenceSurvivalLogRank | survival | 0.14 | survival | survdiff | 5.38 | 39.73x | 2.54e-26 | *** |
| InferenceSurvivalStratCoxPHRegr | survival | 0.54 | survival | coxph.fit(strat)+Wald | 0.80 | 1.48x | 8.88e-16 | *** |
| InferenceSurvivalWeibullRegr | survival | 0.09 | survival | survreg+summary | 4.03 | 46.66x | 9.22e-26 | *** |
| InferenceOrdinalAdjCatLogitRegr | ordinal | 0.18 | VGAM | vglm+summary | 18.38 | 101.95x | 7.6e-33 | *** |
| InferenceOrdinalCLMM (pairs) | ordinal | 9.08 | None | no canonical R implementation | NA | NA | NA | |
| InferenceOrdinalContRatioRegr | ordinal | 0.09 | VGAM | vglm+summary | 18.46 | 213.08x | 2.86e-30 | *** |
| InferenceOrdinalGCompMeanDiff | ordinal | 0.40 | ordinal | clm+gcomp+Wald | 8.46 | 21x | 1.57e-31 | *** |
| InferenceOrdinalGLMM (pairs) | ordinal | 13.26 | None | no canonical R implementation | NA | NA | NA | |
| InferenceOrdinalJonckheereTerpstraTest | ordinal | 0.09 | clinfun | jonckheere | 1.55 | 17.57x | 1.61e-32 | *** |
| InferenceOrdinalPropOddsRegr | ordinal | 0.21 | ordinal | clm+summary | 7.05 | 33.35x | 1.54e-32 | *** |
| InferenceOrdinalRidit | ordinal | 0.06 | stats | mean(ridit) | 0.41 | 7.52x | 1.59e-30 | *** |
| InferenceOrdinalStereotypeLogitRegr | ordinal | 0.33 | None | no canonical R implementation | NA | NA | NA |
To ensure that the benchmark results are highly precise, reproducible, and represent the actual computation speed of the numerical solvers, the benchmarking harness uses the following garbage collection and cache management strategies:
Garbage collection cycles run automatically by the R interpreter and can introduce significant, arbitrary pauses that skew timing measurements. To isolate the execution time of the code from R's GC overhead:
gctorture(FALSE) before running timing loops.system.time() path, we invoke gc(verbose = FALSE) immediately before timing each replicate. This starts the timer on a clean, compacted heap, minimizing the likelihood of triggering an automatic garbage collection cycle mid-replicate.bench::mark() engine with the filter_gc = TRUE parameter, which automatically tracks and discards timing iterations during which a garbage collection event occurred.Both EDI and canonical timing expressions receive a single validation/warm-up call executed once before the calibration loop begins. This puts the machine code and working data into the instruction and data caches in the same warmed state for both sides, so the official timed replicates start on equal footing.
EDI timings call exported C++ functions directly — no R6 objects are instantiated during benchmarking. As a result, no R6 result caches exist to manage. Each call to the C++ solver (e.g. fast_logistic_regression_cpp, fast_ordinal_regression_cpp) starts from a freshly zero-initialized parameter vector (or a model-specific data-driven initialization when smart_cold_start = TRUE). No prior-fit results are carried across timing repetitions, so every replication is a genuine cold start for the numerical optimizer.
This table is an exhaustive inventory of every fast_* scalar math kernel in EDI/src — used inside the NegBin/Beta/ZINB/Hurdle likelihoods, KK21 negative-binomial fitting, probit cold-start heuristics, ordinal cloglog/cauchit link derivatives, and LRT/score-test p-values — against base R's vectorized equivalents.
Unlike the model-fit tables above, these are not full estimators: each row is a single vectorized special-function evaluation (digamma, trigamma, log-gamma, log-beta, error function, normal CDF/PDF/quantile (both closed-form and log-scale), chi-squared upper-tail p-value, arctangent, softplus, and the mu-parameterized negative-binomial density) over a fixed-length vector, with no design matrix, optimizer, or R6 object involved on either side.
Vector length: All rows evaluate the function over a vector of length $N=5000$; inputs are drawn from a domain realistic for each kernel's actual call sites in EDI (e.g. shape/rate-like values in $(0.5, 50)$ for digamma/trigamma/lgamma, probabilities in $(0, 1)$ for qnorm).
Bare Metal EDI Timing: Eight kernels (digamma, trigamma, lgamma, lbeta, dnbinom_mu, qnorm, log_pnorm, log_dnorm) call the package's own exported fast_*_vec_cpp wrapper (EDI/src/fast_math_utils.cpp, documented and exported via roxygen/NAMESPACE like any other EDI function) directly from the installed package — no separate compile step. The remaining six (pchisq_upper, erfc, pnorm_fast, dnorm_fast, atan, log1pexp) aren't promoted to package exports yet, so those rows call a thin bare-metal wrapper compiled standalone via Rcpp::sourceCpp() against the same EDI/src leaf headers (benchmark/fast_math_utils_bench.cpp) — same convention as benchmark/fast_trigamma_speed_compare.cpp. Either way, the wrapper just loops the internal fast_* scalar kernel over the input vector — no R6, no caching, no warm starts.
Canonical R Timing: The base R column calls the corresponding vectorized base/stats function directly on the same input vector (e.g. digamma(), lgamma(), stats::qnorm(), stats::dnbinom(..., mu = , log = TRUE)).
Timing Note: All timings use the same adaptive batched system.time/microbenchmark harness as the tables above (medians over 30 cold samples; paths below 0.01 ms fall back to microbenchmark(times = 5000)).
Timing P-Value: Timing Pval reports a Welch two-sample t-test comparing the EDI and base R timing replicate distributions for each row. The unlabeled final column marks thresholds with *** for p < 0.001, ** for p < 0.01, and * for p < 0.05.
Row Highlighting: Light green rows indicate Speedup > 1 and Timing Pval < 0.05; light grey rows indicate NA timing comparisons from a failed evaluation.
EDI faster, significant NA timing comparison no canonical R implementation
| Function | Response | EDI Time (ms) | Canonical Pkg | Canonical Func | Canonical Time (ms) | Speedup | Timing Pval | |
|---|---|---|---|---|---|---|---|---|
| dnorm_fast | utility | 0.05 | base/stats | dnorm | 0.13 | 2.62x | 3.77e-24 | *** |
| fast_atan | utility | 0.06 | base/stats | atan | 0.12 | 2.12x | 3.25e-21 | *** |
| fast_digamma | utility | 0.08 | base/stats | digamma | 0.55 | 6.78x | 3.44e-39 | *** |
| fast_dnbinom_mu | utility | 0.47 | base/stats | dnbinom(mu=, log=TRUE) | 0.64 | 1.35x | 4.61e-14 | *** |
| fast_erfc | utility | 0.11 | base/stats | 2*pnorm(-x*sqrt(2)) | 0.35 | 3.17x | 1.37e-30 | *** |
| fast_lbeta | utility | 0.28 | base/stats | lbeta | 0.69 | 2.43x | 8.8e-44 | *** |
| fast_lgamma | utility | 0.09 | base/stats | lgamma | 0.20 | 2.18x | 6.35e-19 | *** |
| fast_log1pexp | utility | 0.11 | base/stats | log1p(exp(x)) | 0.15 | 1.43x | 3.31e-13 | *** |
| fast_log_dnorm | utility | 0.02 | base/stats | dnorm(log=TRUE) | 0.09 | 5x | 3.14e-29 | *** |
| fast_log_pnorm | utility | 0.14 | base/stats | pnorm(log.p=TRUE) | 0.35 | 2.49x | 1.52e-28 | *** |
| fast_pchisq_upper | utility | 0.65 | base/stats | pchisq(lower.tail=FALSE) | 0.98 | 1.51x | 1.77e-28 | *** |
| fast_qnorm | utility | 0.05 | base/stats | qnorm | 0.11 | 2.33x | 1.03e-12 | *** |
| fast_trigamma | utility | 0.04 | base/stats | trigamma | 0.71 | 19.3x | 5.84e-33 | *** |
| pnorm_fast | utility | 0.09 | base/stats | pnorm | 0.32 | 3.37x | 8.02e-31 | *** |