I choose to use << 2, because it immediately makes it obvious (to me) that the operation has no meaning in the business logic, we’re just converting from an offset measured in floats (or, say… shorts, <<1) to an offset in bytes. A multiplication by 4 (or 2, for that matter) actually hides what is happening, as we conceptually simply want to shift bits here. Primitives are POT for a reason… hence converting among them involves plain POT operations like bitshifting. A multiplication by 4 is easily confused with a meaningful value, like vertices in a quad or other values in your model. People get strides and offsets wrong all the time (involving trial and error until it doesn’t crash anymore). Using bit shifting is my way to separate business logic and POT unit conversion in a way that imho actually makes more sense than the simple multiplication.
Ramble ramble.
Whether this increases performance is irrelevant.