diff --git a/flowbench/BenchEncrypt.cpp b/flowbench/BenchEncrypt.cpp
index 41d923a1af..ca10cfc83e 100644
--- a/flowbench/BenchEncrypt.cpp
+++ b/flowbench/BenchEncrypt.cpp
@@ -47,7 +47,7 @@ static void bench_encrypt(benchmark::State& state) {
 	auto key = StreamCipherKey::getGlobalCipherKey();
 	auto iv = getRandomIV();
 	auto data = getKey(bytes);
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		for (int chunk = 0; chunk < chunks; ++chunk) {
 			benchmark::DoNotOptimize(encrypt(key, iv, data.begin() + chunk * chunkSize, chunkSize));
 		}
@@ -64,7 +64,7 @@ static void bench_decrypt(benchmark::State& state) {
 	auto iv = getRandomIV();
 	auto data = getKey(bytes);
 	auto encrypted = encrypt(key, iv, data.begin(), data.size());
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		Arena arena;
 		DecryptionStreamCipher decryptor(key, iv);
 		for (int chunk = 0; chunk < chunks; ++chunk) {
diff --git a/flowbench/BenchHash.cpp b/flowbench/BenchHash.cpp
index 40d15db4ab..92d4a5e5a1 100644
--- a/flowbench/BenchHash.cpp
+++ b/flowbench/BenchHash.cpp
@@ -58,7 +58,7 @@ template <HashType hashType>
 static void bench_hash(benchmark::State& state) {
 	auto length = 1 << state.range(0);
 	auto key = getKey(length);
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		hash<hashType>(key, length);
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
diff --git a/flowbench/BenchIterate.cpp b/flowbench/BenchIterate.cpp
index 793c3fc307..8f2e8c6921 100644
--- a/flowbench/BenchIterate.cpp
+++ b/flowbench/BenchIterate.cpp
@@ -50,7 +50,7 @@ static void bench_iterate(benchmark::State& state) {
 	auto kv = getKV(size, size);
 	ListImpl mutations;
 	populate(mutations, items, size, kv.key, kv.value);
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		for (const auto& mutation : mutations) {
 			benchmark::DoNotOptimize(mutation);
 		}
diff --git a/flowbench/BenchMem.cpp b/flowbench/BenchMem.cpp
index 8696461efd..6db2ce28a8 100644
--- a/flowbench/BenchMem.cpp
+++ b/flowbench/BenchMem.cpp
@@ -31,7 +31,7 @@ static void bench_memcmp(benchmark::State& state) {
 	memset(b2.get(), 0, kLength);
 	b2.get()[kLength - 1] = 1;
 
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		benchmark::DoNotOptimize(memcmp(b1.get(), b2.get(), kLength));
 	}
 }
@@ -42,7 +42,7 @@ static void bench_memcpy(benchmark::State& state) {
 	std::unique_ptr<char[]> b2{ new char[kLength] };
 	memset(b1.get(), 0, kLength);
 
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		benchmark::DoNotOptimize(memcpy(b2.get(), b1.get(), kLength));
 	}
 }
diff --git a/flowbench/BenchMetadataCheck.cpp b/flowbench/BenchMetadataCheck.cpp
index c028e3deec..4e8b03dcc3 100644
--- a/flowbench/BenchMetadataCheck.cpp
+++ b/flowbench/BenchMetadataCheck.cpp
@@ -39,7 +39,7 @@ static const std::array<MutationRef, 5> mutations = {
 
 static void bench_check_metadata1(benchmark::State& state) {
 	const auto& m = mutations[state.range(0)];
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		benchmark::DoNotOptimize(KeyRangeRef(m.param1, m.param2).intersects(systemKeys));
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
@@ -47,7 +47,7 @@ static void bench_check_metadata1(benchmark::State& state) {
 
 static void bench_check_metadata2(benchmark::State& state) {
 	const auto& m = mutations[state.range(0)];
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		benchmark::DoNotOptimize(m.param2.size() > 1 && m.param2[0] == systemKeys.begin[0]);
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
diff --git a/flowbench/BenchPopulate.cpp b/flowbench/BenchPopulate.cpp
index 35213b4171..37dacc0478 100644
--- a/flowbench/BenchPopulate.cpp
+++ b/flowbench/BenchPopulate.cpp
@@ -35,7 +35,7 @@ static void bench_populate(benchmark::State& state) {
 	size_t items = state.range(0);
 	size_t size = state.range(1);
 	auto kv = getKV(size, size);
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		Standalone<VectorRef<MutationRef>> mutations;
 		mutations.reserve(mutations.arena(), items);
 		for (int i = 0; i < items; ++i) {
diff --git a/flowbench/BenchRandom.cpp b/flowbench/BenchRandom.cpp
index 47d607cffe..bd478a4ac5 100644
--- a/flowbench/BenchRandom.cpp
+++ b/flowbench/BenchRandom.cpp
@@ -23,9 +23,8 @@
 #include "flow/IRandom.h"
 
 static void bench_random(benchmark::State& state) {
-	while (state.KeepRunning()) {
-		double r = deterministicRandom()->random01();
-		benchmark::DoNotOptimize(r);
+	for (auto _ : state) {
+		benchmark::DoNotOptimize(deterministicRandom()->random01());
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
 }
diff --git a/flowbench/BenchRef.cpp b/flowbench/BenchRef.cpp
index 297e32a66b..434abf38c4 100644
--- a/flowbench/BenchRef.cpp
+++ b/flowbench/BenchRef.cpp
@@ -71,7 +71,7 @@ struct Factory<RefType::FlowReferenceThreadSafe> {
 
 template <RefType refType>
 static void bench_ref_create_and_destroy(benchmark::State& state) {
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		auto ptr = Factory<refType>::create();
 		benchmark::DoNotOptimize(ptr);
 		Factory<refType>::cleanup(ptr);
@@ -82,7 +82,7 @@ static void bench_ref_create_and_destroy(benchmark::State& state) {
 template <RefType refType>
 static void bench_ref_copy(benchmark::State& state) {
 	auto ptr = Factory<refType>::create();
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		auto ptr2 = ptr;
 		benchmark::DoNotOptimize(ptr2);
 	}
diff --git a/flowbench/BenchTimer.cpp b/flowbench/BenchTimer.cpp
index 90a542a3f9..1299fd1c07 100644
--- a/flowbench/BenchTimer.cpp
+++ b/flowbench/BenchTimer.cpp
@@ -23,17 +23,15 @@
 #include "flow/Platform.h"
 
 static void bench_timer(benchmark::State& state) {
-	while (state.KeepRunning()) {
-		double time = timer();
-		benchmark::DoNotOptimize(time);
+	for (auto _ : state) {
+		benchmark::DoNotOptimize(timer());
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
 }
 
 static void bench_timer_monotonic(benchmark::State& state) {
-	while (state.KeepRunning()) {
-		double time = timer_monotonic();
-		benchmark::DoNotOptimize(time);
+	for (auto _ : state) {
+		benchmark::DoNotOptimize(timer_monotonic());
 	}
 	state.SetItemsProcessed(static_cast<long>(state.iterations()));
 }
diff --git a/flowbench/BenchVersionVector.cpp b/flowbench/BenchVersionVector.cpp
index db8d1036cd..45079bf139 100644
--- a/flowbench/BenchVersionVector.cpp
+++ b/flowbench/BenchVersionVector.cpp
@@ -34,7 +34,7 @@ static void bench_vv_getdelta(benchmark::State& benchState) {
 
 	i = 0;
 	const int64_t numDeltas = benchState.range(1);
-	while (benchState.KeepRunning()) {
+	for (auto _ : benchState) {
 		vv.setVersion(Tag(0, i++), ++version);
 		i %= tags;
 
diff --git a/flowbench/BenchVersionVectorSerialization.cpp b/flowbench/BenchVersionVectorSerialization.cpp
index ea8de78fd8..66c14549f5 100644
--- a/flowbench/BenchVersionVectorSerialization.cpp
+++ b/flowbench/BenchVersionVectorSerialization.cpp
@@ -41,7 +41,7 @@ static void bench_serializable_traits_version(benchmark::State& state) {
 
 	size_t size = 0;
 	VersionVector deserializedVV;
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		Standalone<StringRef> msg = ObjectWriter::toValue(serializedVV, Unversioned());
 
 		// Capture the serialized buffer size.
@@ -71,7 +71,7 @@ static void bench_dynamic_size_traits_version(benchmark::State& state) {
 
 	size_t size = 0;
 	VersionVector deserializedVV;
-	while (state.KeepRunning()) {
+	for (auto _ : state) {
 		size = dynamic_size_traits<VersionVector>::size(serializedVV, context);
 
 		uint8_t* buf = context.allocate(size);