Skip to content

Commit ae043d7

Browse files
committed
Make node parsing in Exports::new() multi-threaded
Without this, `Exports::new()` has a very significant performance impact even for inventories that don't use inventory queries at all.
1 parent 99dad9e commit ae043d7

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

src/exports.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::collections::HashMap;
22

33
use anyhow::Result;
4+
use rayon::prelude::*;
45

56
use crate::node::Node;
67
use crate::Reclass;
@@ -14,11 +15,19 @@ pub struct Exports<'a> {
1415
impl<'a> Exports<'a> {
1516
// TODO(sg): ensure that we do proper ref lookups when rendering exports
1617
pub(crate) fn new(r: &'a Reclass) -> Result<Self> {
18+
let nodes: Vec<_> = r
19+
.nodes
20+
.par_iter()
21+
.map(|(n, _)| -> Result<(String, Node)> {
22+
let node = Node::parse(r, n)?;
23+
assert_eq!(n, &node.meta.name);
24+
Ok((n.clone(), node))
25+
})
26+
.collect();
1727
let mut exports = HashMap::new();
18-
for n in r.nodes.keys() {
19-
let node = Node::parse(r, n)?;
20-
assert_eq!(n, &node.meta.name);
21-
exports.insert(n.clone(), node);
28+
for v in nodes {
29+
let (name, node) = v?;
30+
exports.insert(name, node);
2231
}
2332
Ok(Self {
2433
exports,

src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,11 @@ impl Reclass {
261261

262262
/// Renders a single Node and returns the corresponding `NodeInfo` struct.
263263
pub fn render_node(&self, nodename: &str, exports: &Exports) -> Result<NodeInfo> {
264-
let mut n = Node::parse(self, nodename)?;
264+
let mut n = if let Some(n) = exports.exports.get(nodename) {
265+
n.clone()
266+
} else {
267+
Node::parse(self, nodename)?
268+
};
265269
n.render(self, exports)?;
266270
Ok(NodeInfo::from(n))
267271
}

0 commit comments

Comments
 (0)