A preliminary run with n=10 and num_vecs=10k got me thinking and I don't think that this comparison will be fair, because it is heavily dependant on the number of examples for the RFDotFeatures as well.
The RFDotFeatures needs to compute the projected vectors again and again for each dot product, while even the RFPreprocessor only does that once per example and then it's the straightforward dot product.