def __setitem__(self, uri: str, benchmark: Benchmark): """Add benchmark to cache.""" # Remove any existing value to keep the cache size consistent. if uri in self._benchmarks: self._size_in_bytes -= self._benchmarks[uri].ByteSize() del self._benchmarks[uri] size = benchmark.ByteSize() if self.size_in_bytes + size > self.max_size_in_bytes: if size > self.max_size_in_bytes: logger.warning( "Adding new benchmark with size %d bytes exceeds total " "target cache size of %d bytes", size, self.max_size_in_bytes, ) else: logger.debug( "Adding new benchmark with size %d bytes " "exceeds maximum size %d bytes, %d items", size, self.max_size_in_bytes, self.size, ) self.evict_to_capacity() self._benchmarks[uri] = benchmark self._size_in_bytes += size logger.debug( "Cached benchmark %s. Cache size = %d bytes, %d items", uri, self.size_in_bytes, self.size, )
def make_benchmark_of_size(size_in_bytes: int, target: int = 0) -> Benchmark: """Test helper. Generate a benchmark of the given size in bytes.""" target = target or size_in_bytes bm = Benchmark(program=File(contents=("." * target).encode("utf-8"))) size_offset = bm.ByteSize() - size_in_bytes if size_offset: return make_benchmark_of_size(size_in_bytes, size_in_bytes - size_offset) return bm