diff --git a/reports/4.2.9/chart-category-comparison.png b/reports/4.2.9/chart-category-comparison.png new file mode 100644 index 0000000..fb20e47 Binary files /dev/null and b/reports/4.2.9/chart-category-comparison.png differ diff --git a/reports/4.2.9/chart-dashboard.png b/reports/4.2.9/chart-dashboard.png new file mode 100644 index 0000000..e5cc43a Binary files /dev/null and b/reports/4.2.9/chart-dashboard.png differ diff --git a/reports/4.2.9/chart-duration-by-language.png b/reports/4.2.9/chart-duration-by-language.png new file mode 100644 index 0000000..71024be Binary files /dev/null and b/reports/4.2.9/chart-duration-by-language.png differ diff --git a/reports/4.2.9/chart-duration-histogram.png b/reports/4.2.9/chart-duration-histogram.png new file mode 100644 index 0000000..1a456c6 Binary files /dev/null and b/reports/4.2.9/chart-duration-histogram.png differ diff --git a/reports/4.2.9/chart-queue-vs-execution.png b/reports/4.2.9/chart-queue-vs-execution.png new file mode 100644 index 0000000..23b7e6c Binary files /dev/null and b/reports/4.2.9/chart-queue-vs-execution.png differ diff --git a/reports/4.2.9/chart-speed-leaders.png b/reports/4.2.9/chart-speed-leaders.png new file mode 100644 index 0000000..2f2735f Binary files /dev/null and b/reports/4.2.9/chart-speed-leaders.png differ diff --git a/reports/4.2.9/perf.json b/reports/4.2.9/perf.json new file mode 100644 index 0000000..ac38cb3 --- /dev/null +++ b/reports/4.2.9/perf.json @@ -0,0 +1,407 @@ +{ + "tag": "4.2.9", + "generated_at": "2026-01-23T10:05:34Z", + "parent_pipeline_id": 12057, + "child_pipeline_id": 12060, + "summary": { + "total_tests": 645, + "passed_tests": 645, + "failed_tests": 0, + "total_languages": 43, + "passed_languages": 43, + "avg_duration_seconds": 107, + "max_duration_seconds": 279, + "min_duration_seconds": 19, + "slowest_language": "ruby", + "fastest_language": "d" + }, + "languages": [ + { + "language": "ruby", + "status": "Passed", + "queued_duration": 6.326948, + "started_at": "2026-01-23T09:58:27Z", + "updated_at": "2026-01-23T10:03:06Z", + "job_id": 29092, + "duration_seconds": 279 + }, + { + "language": "deno", + "status": "Passed", + "queued_duration": 65.212386, + "started_at": "2026-01-23T09:59:29Z", + "updated_at": "2026-01-23T10:03:42Z", + "job_id": 29107, + "duration_seconds": 253 + }, + { + "language": "rust", + "status": "Passed", + "queued_duration": 126.54301, + "started_at": "2026-01-23T10:00:29Z", + "updated_at": "2026-01-23T10:04:23Z", + "job_id": 29113, + "duration_seconds": 234 + }, + { + "language": "crystal", + "status": "Passed", + "queued_duration": 64.455629, + "started_at": "2026-01-23T09:59:27Z", + "updated_at": "2026-01-23T10:03:08Z", + "job_id": 29105, + "duration_seconds": 221 + }, + { + "language": "java", + "status": "Passed", + "queued_duration": 127.285032, + "started_at": "2026-01-23T10:00:30Z", + "updated_at": "2026-01-23T10:04:09Z", + "job_id": 29114, + "duration_seconds": 219 + }, + { + "language": "cpp", + "status": "Passed", + "queued_duration": 120.451453, + "started_at": "2026-01-23T10:00:21Z", + "updated_at": "2026-01-23T10:03:08Z", + "job_id": 29111, + "duration_seconds": 167 + }, + { + "language": "javascript", + "status": "Passed", + "queued_duration": 1.947271, + "started_at": "2026-01-23T09:58:22Z", + "updated_at": "2026-01-23T10:01:08Z", + "job_id": 29090, + "duration_seconds": 166 + }, + { + "language": "python", + "status": "Passed", + "queued_duration": 1.297771, + "started_at": "2026-01-23T09:58:22Z", + "updated_at": "2026-01-23T10:01:07Z", + "job_id": 29089, + "duration_seconds": 165 + }, + { + "language": "php", + "status": "Passed", + "queued_duration": 7.795789, + "started_at": "2026-01-23T09:58:29Z", + "updated_at": "2026-01-23T10:01:07Z", + "job_id": 29094, + "duration_seconds": 158 + }, + { + "language": "perl", + "status": "Passed", + "queued_duration": 7.446579, + "started_at": "2026-01-23T09:58:28Z", + "updated_at": "2026-01-23T10:01:06Z", + "job_id": 29093, + "duration_seconds": 158 + }, + { + "language": "zig", + "status": "Passed", + "queued_duration": 165.884393, + "started_at": "2026-01-23T10:01:09Z", + "updated_at": "2026-01-23T10:03:42Z", + "job_id": 29119, + "duration_seconds": 153 + }, + { + "language": "scheme", + "status": "Passed", + "queued_duration": 11.814258, + "started_at": "2026-01-23T09:58:34Z", + "updated_at": "2026-01-23T10:01:07Z", + "job_id": 29101, + "duration_seconds": 153 + }, + { + "language": "commonlisp", + "status": "Passed", + "queued_duration": 63.913243, + "started_at": "2026-01-23T09:59:26Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29104, + "duration_seconds": 147 + }, + { + "language": "raku", + "status": "Passed", + "queued_duration": 71.864277, + "started_at": "2026-01-23T09:59:31Z", + "updated_at": "2026-01-23T10:01:52Z", + "job_id": 29109, + "duration_seconds": 141 + }, + { + "language": "powershell", + "status": "Passed", + "queued_duration": 26.433311, + "started_at": "2026-01-23T09:58:49Z", + "updated_at": "2026-01-23T10:01:04Z", + "job_id": 29102, + "duration_seconds": 135 + }, + { + "language": "typescript", + "status": "Passed", + "queued_duration": 2.665153, + "started_at": "2026-01-23T09:58:23Z", + "updated_at": "2026-01-23T10:00:21Z", + "job_id": 29091, + "duration_seconds": 118 + }, + { + "language": "ocaml", + "status": "Passed", + "queued_duration": 207.229716, + "started_at": "2026-01-23T10:01:47Z", + "updated_at": "2026-01-23T10:03:42Z", + "job_id": 29126, + "duration_seconds": 115 + }, + { + "language": "erlang", + "status": "Passed", + "queued_duration": 188.015742, + "started_at": "2026-01-23T10:01:57Z", + "updated_at": "2026-01-23T10:03:42Z", + "job_id": 29132, + "duration_seconds": 105 + }, + { + "language": "awk", + "status": "Passed", + "queued_duration": 70.275776, + "started_at": "2026-01-23T09:59:29Z", + "updated_at": "2026-01-23T10:01:08Z", + "job_id": 29108, + "duration_seconds": 99 + }, + { + "language": "haskell", + "status": "Passed", + "queued_duration": 187.953071, + "started_at": "2026-01-23T10:01:28Z", + "updated_at": "2026-01-23T10:03:06Z", + "job_id": 29125, + "duration_seconds": 98 + }, + { + "language": "groovy", + "status": "Passed", + "queued_duration": 65.116715, + "started_at": "2026-01-23T09:59:28Z", + "updated_at": "2026-01-23T10:01:06Z", + "job_id": 29106, + "duration_seconds": 98 + }, + { + "language": "go", + "status": "Passed", + "queued_duration": 121.402909, + "started_at": "2026-01-23T10:00:22Z", + "updated_at": "2026-01-23T10:01:54Z", + "job_id": 29112, + "duration_seconds": 92 + }, + { + "language": "kotlin", + "status": "Passed", + "queued_duration": 160.902907, + "started_at": "2026-01-23T10:01:04Z", + "updated_at": "2026-01-23T10:02:33Z", + "job_id": 29115, + "duration_seconds": 89 + }, + { + "language": "dart", + "status": "Passed", + "queued_duration": 172.483178, + "started_at": "2026-01-23T10:01:12Z", + "updated_at": "2026-01-23T10:02:34Z", + "job_id": 29123, + "duration_seconds": 82 + }, + { + "language": "fsharp", + "status": "Passed", + "queued_duration": 213.546325, + "started_at": "2026-01-23T10:01:53Z", + "updated_at": "2026-01-23T10:03:06Z", + "job_id": 29127, + "duration_seconds": 73 + }, + { + "language": "dotnet", + "status": "Passed", + "queued_duration": 214.573651, + "started_at": "2026-01-23T10:01:55Z", + "updated_at": "2026-01-23T10:03:06Z", + "job_id": 29129, + "duration_seconds": 71 + }, + { + "language": "prolog", + "status": "Passed", + "queued_duration": 215.153265, + "started_at": "2026-01-23T10:01:55Z", + "updated_at": "2026-01-23T10:03:04Z", + "job_id": 29130, + "duration_seconds": 69 + }, + { + "language": "forth", + "status": "Passed", + "queued_duration": 216.587287, + "started_at": "2026-01-23T10:01:56Z", + "updated_at": "2026-01-23T10:03:05Z", + "job_id": 29131, + "duration_seconds": 69 + }, + { + "language": "elixir", + "status": "Passed", + "queued_duration": 10.777275, + "started_at": "2026-01-23T09:58:32Z", + "updated_at": "2026-01-23T09:59:31Z", + "job_id": 29098, + "duration_seconds": 59 + }, + { + "language": "bash", + "status": "Passed", + "queued_duration": 9.592589, + "started_at": "2026-01-23T09:58:31Z", + "updated_at": "2026-01-23T09:59:29Z", + "job_id": 29096, + "duration_seconds": 58 + }, + { + "language": "lua", + "status": "Passed", + "queued_duration": 8.240926, + "started_at": "2026-01-23T09:58:30Z", + "updated_at": "2026-01-23T09:59:26Z", + "job_id": 29095, + "duration_seconds": 56 + }, + { + "language": "clojure", + "status": "Passed", + "queued_duration": 63.067493, + "started_at": "2026-01-23T09:59:25Z", + "updated_at": "2026-01-23T10:00:21Z", + "job_id": 29103, + "duration_seconds": 56 + }, + { + "language": "tcl", + "status": "Passed", + "queued_duration": 11.603923, + "started_at": "2026-01-23T09:58:33Z", + "updated_at": "2026-01-23T09:59:27Z", + "job_id": 29100, + "duration_seconds": 54 + }, + { + "language": "r", + "status": "Passed", + "queued_duration": 10.337757, + "started_at": "2026-01-23T09:58:32Z", + "updated_at": "2026-01-23T09:59:26Z", + "job_id": 29097, + "duration_seconds": 54 + }, + { + "language": "c", + "status": "Passed", + "queued_duration": 119.603493, + "started_at": "2026-01-23T10:00:20Z", + "updated_at": "2026-01-23T10:01:08Z", + "job_id": 29110, + "duration_seconds": 48 + }, + { + "language": "cobol", + "status": "Passed", + "queued_duration": 164.022284, + "started_at": "2026-01-23T10:01:07Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29116, + "duration_seconds": 46 + }, + { + "language": "fortran", + "status": "Passed", + "queued_duration": 164.835607, + "started_at": "2026-01-23T10:01:08Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29117, + "duration_seconds": 45 + }, + { + "language": "v", + "status": "Passed", + "queued_duration": 171.26956, + "started_at": "2026-01-23T10:01:11Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29121, + "duration_seconds": 42 + }, + { + "language": "objc", + "status": "Passed", + "queued_duration": 171.839862, + "started_at": "2026-01-23T10:01:11Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29122, + "duration_seconds": 42 + }, + { + "language": "nim", + "status": "Passed", + "queued_duration": 166.413462, + "started_at": "2026-01-23T10:01:10Z", + "updated_at": "2026-01-23T10:01:52Z", + "job_id": 29120, + "duration_seconds": 42 + }, + { + "language": "julia", + "status": "Passed", + "queued_duration": 173.014692, + "started_at": "2026-01-23T10:01:13Z", + "updated_at": "2026-01-23T10:01:53Z", + "job_id": 29124, + "duration_seconds": 40 + }, + { + "language": "csharp", + "status": "Passed", + "queued_duration": 214.031644, + "started_at": "2026-01-23T10:01:54Z", + "updated_at": "2026-01-23T10:02:34Z", + "job_id": 29128, + "duration_seconds": 40 + }, + { + "language": "d", + "status": "Passed", + "queued_duration": 165.579493, + "started_at": "2026-01-23T10:01:09Z", + "updated_at": "2026-01-23T10:01:28Z", + "job_id": 29118, + "duration_seconds": 19 + } +] +} diff --git a/reports/4.2.9/perf.md b/reports/4.2.9/perf.md new file mode 100644 index 0000000..e68dcb4 --- /dev/null +++ b/reports/4.2.9/perf.md @@ -0,0 +1,146 @@ +# Performance Report: 4.2.9 + +**Generated:** 2026-01-23T10:05:34Z +**Pipeline:** [#12060](https://git.unturf.com/engineering/unturf/un-inception/-/pipelines/12060) + +## Summary + +| Metric | Value | +|--------|-------| +| Total Tests | 645 | +| Passed | 645 | +| Failed | 0 | +| Pass Rate | 100.0% | +| Languages | 43 | +| Avg Duration | 107s | +| Slowest | ruby (279s) | +| Fastest | d (19s) | + +--- + +## Test Duration by Language + +The primary performance metric - how long each language takes to run its full test suite (15 tests per language). + +![Duration by Language](chart-duration-by-language.png) + +**Key observations:** +- **RUBY** and **DENO** are outliers at 90+ seconds +- Most languages cluster between 20-40 seconds +- Compiled languages (red) tend to be faster than interpreted (blue) +- **D** is the fastest at 19 seconds + +--- + +## Compiled vs Interpreted + +Comparing performance between compiled languages (C, Go, Rust, etc.) and interpreted languages (Python, Ruby, JavaScript, etc.). + +![Category Comparison](chart-category-comparison.png) + +**Findings:** +- 20 compiled languages vs 22 interpreted +- Compiled languages have lower median execution time +- Interpreted languages show more variance (wider spread) +- The white diamond marks the mean for each category + +--- + +## Duration Distribution + +Histogram showing how test durations are distributed across all 43 languages. + +![Duration Histogram](chart-duration-histogram.png) + +**Distribution analysis:** +- Most languages complete in 20-35 seconds (the peak) +- Mean (green dashed) and median (blue dotted) are close together +- Long tail on the right from slow outliers (ruby, deno) + +--- + +## Speed Leaders + +Side-by-side comparison of the 10 slowest and 10 fastest languages. + +![Speed Leaders](chart-speed-leaders.png) + +**Slowest (left):** RUBY, DENO, RUST, CRYSTAL, JAVA +**Fastest (right):** D, CSHARP, JULIA, NIM, OBJC + +--- + +## Queue vs Execution Time + +Scatter plot showing the relationship between CI queue wait time and actual test execution time. + +![Queue vs Execution](chart-queue-vs-execution.png) + +**Notes:** +- Queue time is how long the job waited for a runner +- Most jobs had similar queue times (clustered vertically) +- Outliers labeled - ruby and deno took longest to execute regardless of queue time + +--- + +## Dashboard + +Summary dashboard combining key metrics and visualizations. + +![Dashboard](chart-dashboard.png) + +--- + +## Raw Data + +### Per-Language Performance + +| Language | Status | Duration | +|----------|--------|----------| +| ruby | Passed | 279s | +| deno | Passed | 253s | +| rust | Passed | 234s | +| crystal | Passed | 221s | +| java | Passed | 219s | +| cpp | Passed | 167s | +| javascript | Passed | 166s | +| python | Passed | 165s | +| php | Passed | 158s | +| perl | Passed | 158s | +| zig | Passed | 153s | +| scheme | Passed | 153s | +| commonlisp | Passed | 147s | +| raku | Passed | 141s | +| powershell | Passed | 135s | +| typescript | Passed | 118s | +| ocaml | Passed | 115s | +| erlang | Passed | 105s | +| awk | Passed | 99s | +| haskell | Passed | 98s | +| groovy | Passed | 98s | +| go | Passed | 92s | +| kotlin | Passed | 89s | +| dart | Passed | 82s | +| fsharp | Passed | 73s | +| dotnet | Passed | 71s | +| prolog | Passed | 69s | +| forth | Passed | 69s | +| elixir | Passed | 59s | +| bash | Passed | 58s | +| lua | Passed | 56s | +| clojure | Passed | 56s | +| tcl | Passed | 54s | +| r | Passed | 54s | +| c | Passed | 48s | +| cobol | Passed | 46s | +| fortran | Passed | 45s | +| v | Passed | 42s | +| objc | Passed | 42s | +| nim | Passed | 42s | +| julia | Passed | 40s | +| csharp | Passed | 40s | +| d | Passed | 19s | + +--- + +*Report generated by UN Inception CI pipeline* diff --git a/reports/PERFORMANCE-HISTORY.md b/reports/PERFORMANCE-HISTORY.md index ffc5172..0787283 100644 --- a/reports/PERFORMANCE-HISTORY.md +++ b/reports/PERFORMANCE-HISTORY.md @@ -13,3 +13,4 @@ Tracking compile and test execution times across releases. | 4.2.6 | 2026-01-19 | 642 | 100.0% | 54s | haskell | awk | | 4.2.7 | 2026-01-23 | 631 | 99.8% | 117s | typescript | dotnet | | 4.2.8 | 2026-01-23 | 645 | 99.8% | 111s | kotlin | fortran | +| 4.2.9 | 2026-01-23 | 645 | 100.0% | 107s | ruby | d |