3 ms·
> The non-AVX version might be improved by removing the if alltogether, and replacing dst++ with dst = followed by dst += (src[i] == ' ' || src[i] == '\r' || sr
by vardump 8y ago
> The non-AVX version might be improved by removing the if alltogether, and replacing dst++ with dst = followed by dst += (src[i] == ' ' || src[i] == '\r' || src[i] == '\n') ? 0 : 1
Could you give me an example where that would actually generate different code?
Every time I've checked, if 'if' form generates a branch, so will the ternary form. Of course, that's also what one would expect, because both forms would generate same or almost same AST.
- lostmsu 8y agoAs I mentioned below, the ifs were due to short-circuiting. Just replace || with |. Actually, I just tried that on MSVC, and to my surprise it became slower a little bit. See remove_scalar_2 here: https://godbolt.org/z/taCqw9 https://godbolt.org/z/taCqw9
- vardump 8y agoYou did manage to remove data dependant branch (which indeed should improve performance), but I guess the dependency chain it created was too long. It might even be a dependency through "dst" value. CPU reorder buffers are nowadays long, ~200 instructions, so not knowing where to write on the next loop iteration might be stall the core. Didn't have time to analyze this very deeply. Then again, not knowing (or more like only conditionally data dependant known, with a dependency to previous iteration) where to write on next round is a pretty fundamental problem when you want to remove chars from string.
- lostmsu 8y agoPerhaps branch prediction works better with jumps than CMOV. Or maybe it has something to do with HT (if it is on).