\todo{Introduction} \section{Modifications to Primrose} %% API %% Mapping trait %% We add a new mapping trait to primrose to express KV maps %% \todo{add and list library types} %% the constraint solver has been updated to allow properties on dicts (dictproperty), but this was unused. %% Resiliency, etc \section{Cost models} %% Benchmarker crate %% each trait has its own set of benchmarks, which run different workloads %% benchmarker trait doesn't have Ns %% example benchmarks for hashmap and vec %% Code generation %% \code{candelabra::cost::benchmark} generates code which just calls \code{candelabra\_benchmarker} methods %% Ns are set there, and vary from [...] %% fitting done with least squares in \code{candelabra::cost::fit} %% list other methods tried %% simple, which helps 'smooth out' noisy benchmark results \section{Profiling} %% profiler type in \code{primrose\_library::profiler} %% wraps an 'inner' implementation and implements whatever operations it does, keeping track of number of calls %% on drop, creates new file in folder specified by env variable %% primrose results generated in \code{primrose::codegen}, which is called in \code{candelabra::profiler} %% picks the first valid candidate - performance doesn't really matter for this case %% each drop generates a file, so we get details of every individual collection allocated \section{Selection and Codegen} %% Generated code (opaque types) %% Selection Algorithm incl Adaptiv %% Implementation w/ const generics \section{Misc Concerns} \todo{Justify Rust as language} \todo{Explain cargo's role in rust projects \& how it is integrated} %% get project metadata from cargo %% available benchmarks and source directories %% works with most projects %% could be expanded to run as cargo command \todo{Caching and stuff} \todo{Ease of use} %% parse minimal amount of information from criterion benchmark %% most common benchmarking tool, closest there is to a standard %% should be easy to adapt if/when cargo ships proper benchmarking support