performance improvement: add cache