reworked to remove virtual call for benchmark timing