Hey,
I was experimenting with fuzzing but I had a problem, it was slow. I spend some time to find the reason, and I found it.
The problem is this code:
let value: ScryptoValue = scrypto_decode(&value).unwrap();
especially in system_struct_to_node_substates.
It is used with WASM code which is usually huge, sometimes has over 1M elements. This code has Vec which is parsed with:
ValueKind::Array => {
let element_value_kind = decoder.read_value_kind()?;
let length = decoder.read_size()?;
let mut elements = Vec::with_capacity(if length <= 1024 { length } else { 1024 });
for _ in 0..length {
elements.push(decoder.decode_deeper_body_with_value_kind(element_value_kind)?);
}
Ok(Value::Array {
element_value_kind,
elements,
})
}
So decoder.decode_deeper_body_with_value_kind(element_value_kind) is sometimes called even 1M times which takes a lot of time, 50-100 ms. I tried to optimize it using:
ValueKind::Array => {
let element_value_kind = decoder.read_value_kind()?;
match element_value_kind {
ValueKind::U8 => {
let length = decoder.read_size()?;
let slice = decoder.read_slice(length as usize)?;
Ok(Value::Array {
element_value_kind,
elements: slice.iter().map(|v| Value::U8 { value: *v }).collect(),
})
}
which makes it 4.5x faster but it's not an elegant solution. But it's hard to make such. The Value::U8 uses 48 bytes of memory, probably allocation of 1M * 48 bytes takes a lot of time. So I don't have an idea how to make it faster than that, maybe you'll find some better idea.
I also include a log from perf showing this issue:

Hey,
I was experimenting with fuzzing but I had a problem, it was slow. I spend some time to find the reason, and I found it.
The problem is this code:
especially in system_struct_to_node_substates.
It is used with WASM code which is usually huge, sometimes has over 1M elements. This code has Vec which is parsed with:
So
decoder.decode_deeper_body_with_value_kind(element_value_kind)is sometimes called even 1M times which takes a lot of time, 50-100 ms. I tried to optimize it using:which makes it 4.5x faster but it's not an elegant solution. But it's hard to make such. The
Value::U8uses 48 bytes of memory, probably allocation of 1M * 48 bytes takes a lot of time. So I don't have an idea how to make it faster than that, maybe you'll find some better idea.I also include a log from perf showing this issue:
