Reduce latency of query formatting, for queries that are complicated to build.
(bench_name: BenchName, table_id: &str, generate_query: F)
| 224 | #[inline(never)] |
| 225 | /// Reduce latency of query formatting, for queries that are complicated to build. |
| 226 | fn memo_query<F: FnOnce() -> String>(bench_name: BenchName, table_id: &str, generate_query: F) -> Arc<str> { |
| 227 | // fast path |
| 228 | let queries = QUERIES.read().unwrap(); |
| 229 | |
| 230 | if let Some(bench_queries) = queries.get(&bench_name) |
| 231 | && let Some(query) = bench_queries.get(table_id) |
| 232 | { |
| 233 | return query.clone(); |
| 234 | } |
| 235 | |
| 236 | // slow path |
| 237 | drop(queries); |
| 238 | let mut queries = QUERIES.write().unwrap(); |
| 239 | |
| 240 | let bench_queries = if let Some(bench_queries) = queries.get_mut(&bench_name) { |
| 241 | bench_queries |
| 242 | } else { |
| 243 | queries.insert(bench_name, HashMap::default()); |
| 244 | queries.get_mut(&bench_name).unwrap() |
| 245 | }; |
| 246 | |
| 247 | if let Some(query) = bench_queries.get(table_id) { |
| 248 | query.clone() |
| 249 | } else { |
| 250 | let query = generate_query(); |
| 251 | bench_queries.insert(table_id.to_string(), (&query[..]).into()); |
| 252 | bench_queries[table_id].clone() |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | lazy_static! { |
| 257 | // bench_name -> table_id -> query. |