Use performance.now() for sub-ms timing