perf: cache and reuse already allocated rows