8a4ee06570
improvise-i5tk's acceptance criterion 1 was a benchmark, on the ground that "this can dominate TUI rendering" is exactly as unevidenced as "it is fine". benches/grid_projection.rs is that benchmark, and it says no. One grid_of call, dense pivot grids, this machine: typical 100 x 4 = 400 cells whole-grid 1.902ms ratio 1.2x col_widths 45% large 1200 x 8 = 9600 cells whole-grid 185.644ms ratio 1.3x col_widths 64% 18k cells (gotcha 41) 3000 x 6 = 18000 cells whole-grid 402.435ms ratio 1.5x col_widths 42% pathological 9000 x 10 = 90000 cells whole-grid 5.235s ratio 1.5x col_widths 44% ratio is whole-grid over a 45x12 terminal window: 1.2-1.5x, against a fix whose stated cost is changing what a cache index MEANS in the TUI and putting every scroll site in scope. Wrong trade, so i5tk is closed on the measurement. Why the ratio is so low is the bigger finding. Two of the three whole-grid passes a frame performs are viewport-independent by construction: ui/viewport.rs::compute_col_widths takes no viewport and walks every (row, col) twice -- once for cell text, once for the column totals it must also size -- and a column total must sum every row including scrolled-past ones (gotcha 44). grid_of's own cell_display loop is the third pass and the only one windowing would touch. So the whole grid is evaluated about three times per frame, every result discarded, and at 18,000 cells a keypress costs four tenths of a second. Filed as improvise-jmjz; its fix is caching or one fused pass, which this benchmark has now distinguished from the windowing it rules out. No criterion crate: plain Instant, and test = false so cargo test does not run a target that takes seconds by design. Closes improvise-i5tk Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
77 lines
2.5 KiB
TOML
77 lines
2.5 KiB
TOML
[workspace]
|
|
members = [".", "crates/improvise-formula", "crates/improvise-core", "crates/improvise-protocol", "crates/improvise-io", "crates/improvise-command", "crates/improvise-wasm-client", "crates/improvise-ws-server", "crates/improvise-worker-server", "crates/gp-tree", "crates/improvise-gp"]
|
|
|
|
[package]
|
|
name = "improvise"
|
|
version = "0.1.0-rc2"
|
|
edition = "2024"
|
|
description = "Terminal pivot-table modeling in the spirit of Lotus Improv"
|
|
license = "Apache-2.0"
|
|
repository = "https://github.com/fiddlerwoaroof/improvise"
|
|
homepage = "https://github.com/fiddlerwoaroof/improvise"
|
|
readme = "README.md"
|
|
keywords = ["tui", "pivot", "spreadsheet", "data", "improv"]
|
|
categories = ["command-line-utilities", "visualization"]
|
|
|
|
[[bin]]
|
|
name = "improvise"
|
|
path = "src/main.rs"
|
|
|
|
# improvise-i5tk's acceptance criterion: whether the TUI's whole-grid GridCache
|
|
# is worth narrowing to a viewport is a measurement, not an argument.
|
|
# `test = false`: it takes seconds by design, and the suite's rule is that no
|
|
# single test binary exceeds two of them.
|
|
[[bench]]
|
|
name = "grid_projection"
|
|
harness = false
|
|
test = false
|
|
|
|
[dependencies]
|
|
gp-tree = { path = "crates/gp-tree" }
|
|
improvise-core = { path = "crates/improvise-core" }
|
|
improvise-formula = { path = "crates/improvise-formula" }
|
|
improvise-io = { path = "crates/improvise-io" }
|
|
improvise-command = { path = "crates/improvise-command" }
|
|
ratatui = "0.30"
|
|
crossterm = "0.29"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
anyhow = "1"
|
|
thiserror = "2"
|
|
indexmap = { version = "2", features = ["serde"] }
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
flate2 = "1"
|
|
unicode-width = "^0.2"
|
|
csv = "1"
|
|
clap = { version = "4.6.7", features = ["derive"] }
|
|
enum_dispatch = "0.3.13"
|
|
|
|
[dev-dependencies]
|
|
# Only `tests/grid_frame_agreement.rs` needs it: that test drives the TUI
|
|
# widget and the browser client over ONE `GridCache` and asserts they draw
|
|
# the same grid frame (improvise-anr9). A dev-dependency, so the terminal
|
|
# binary does not grow a wasm client; `improvise-wasm-client` builds
|
|
# natively, which is how its own tests already run.
|
|
improvise-wasm-client = { path = "crates/improvise-wasm-client" }
|
|
improvise-protocol = { path = "crates/improvise-protocol" }
|
|
pest = "2.9.1"
|
|
pest_derive = "2.9.1"
|
|
pest_meta = "2.9.1"
|
|
proptest = "1"
|
|
tempfile = "3"
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = true
|
|
codegen-units = 1
|
|
strip = true
|
|
|
|
[profile.profiling]
|
|
inherits = "release"
|
|
strip = false
|
|
debug = 2
|
|
|
|
# The profile that 'dist' will build with
|
|
[profile.dist]
|
|
inherits = "release"
|