more caching, less memory allocation