Personally I often prefer Attrib Wrangle SOP, but if I need to build a VOP network then I will use Bind if I don't need parameters. If I need parameters, then I always use parameters.
The speed differences between using ch directly in your Inline Code VOP or Snippet VOP comes from parameter binding and changing function signatures.
If you inspect the code generated by using ch directly, you get this code:
VOP_SNIPPET_snippet1(vector p; const float _bound_Time)
{
vector center = 0;
float dist = length ( p - center );
float frequency = ch("freq");
float amplitude = 0.1;
float speed = 2.0;
p.y = sin ( dist * frequency - _bound_Time * speed ) * amplitude;
}
So anything the frequency value changes, it recompiles the VEX code, that's why it's much slower.
Using a parameter VOP instead produces this code:
VOP_SNIPPET_snippet1(vector p; float freq; const float _bound_freq; const float _bound_Time)
{
vector center = 0;
float dist = length ( p - center );
float frequency = _bound_freq;
float amplitude = 0.1;
float speed = 2.0;
p.y = sin ( dist * frequency - _bound_Time * speed ) * amplitude;
}
As you can see in this code, frequency value is passed to the function so there is no need to recompile the code. If just calls the same function with a different value.
float freq is used to output the value.
Attribute Wrangle Core is exactly an Attribute VOP, except it doesn't have a VOP network inside of it. This means on loading networks from disk it can be faster as none of the VOP specific rules have to be applied. It will have no effect on actual execution speed.