length can be cached