There isn’t a simple answer.
The sampling of a GraphicsBuffer is actually a Load in a StructuredBuffer.
Let’s take the theoretical results from NVidia Ampere in this performance test and assuming your sampling is linear (for instance, based on the ParticleId), we have:
StructuredBuffer<float4>.Load linear: 9.839ms
versus
Texture2D<RGBA32F>.Sample(bilinear) linear: 49.592ms
However, it’s not fair, the Ampere texture sampling is quater rate with RGBA32F and the sampling of a Texture2D requires twice more data than a Texture1D to process the bilinear filter.
Furthermore, even if the loading of the next adress can be virtually free, the linear interpolation requires some additional computation.
If we are comparing the same result with Intel Iris, we have:
StructuredBuffer<float4>.Load linear: 868.643ms
versus
Texture2D<RGBA32F>.Sample(bilinear) linear: 918.780ms
These timings are almost equivalent.
In the end, theoretically, the sampling of GraphicsBuffer could be faster but I’m pretty sure there are platforms where the texture fetching is actually more efficient thanks to the optimized sampler interpolation.
I won’t expect a significative difference in one direction or the other with a real world case. I would advise you to use the simplest approach for your case, unless your targeted platform is really GPU bound, in that case, you will have to profile to adjust your decision.