diff --git a/benchmarks/benchmark/Benchmark.h b/benchmarks/benchmark/Benchmark.h
index 16ae5fa..ae5c1a2 100644
--- a/benchmarks/benchmark/Benchmark.h
+++ b/benchmarks/benchmark/Benchmark.h
@@ -34,27 +34,29 @@
 
   virtual std::string Name() = 0;
 
-  virtual void RunAll() = 0;
-
-  bool ShouldRun(std::vector<regex_t*>&);
+  virtual size_t RunAllArgs(std::vector<regex_t*>&) = 0;
 
   void SetBenchmarkBytesProcessed(uint64_t bytes) { bytes_processed_ += bytes; }
   void StopBenchmarkTiming();
   void StartBenchmarkTiming();
 
   // Run all of the benchmarks that have registered.
-  static bool RunAll(std::vector<regex_t*>&);
+  static size_t RunAll(std::vector<regex_t*>&);
 
   static std::vector<Benchmark*>& List();
 
   static int MaxNameColumnWidth();
 
 protected:
-  virtual int NameColumnWidth() = 0;
+  virtual size_t NameColumnWidth() = 0;
 
   uint64_t bytes_processed_;
   uint64_t total_time_ns_;
   uint64_t start_time_ns_;
+
+  static bool header_printed_;
+
+  static void PrintHeader();
 };
 
 template <typename T>
@@ -64,6 +66,7 @@
   virtual ~BenchmarkT() {}
 
 protected:
+  bool ShouldRun(std::vector<regex_t*>&, T arg);
   void RunWithArg(T arg);
   virtual void RunIterations(int, T) = 0;
   virtual std::string GetNameStr(T) = 0;
@@ -75,8 +78,14 @@
   virtual ~BenchmarkWithoutArg() {}
 
 protected:
-  virtual void RunAll() override {
-    RunWithArg(nullptr);
+  virtual size_t RunAllArgs(std::vector<regex_t*>& regs) override {
+    size_t benchmarks_run = 0;
+    if (BenchmarkT<void*>::ShouldRun(regs, nullptr)) {
+      PrintHeader();
+      RunWithArg(nullptr);
+      benchmarks_run++;
+    }
+    return benchmarks_run;
   }
 
   virtual void RunIterations(int iters, void*) override {
@@ -85,8 +94,8 @@
 
   virtual void Run(int) = 0;
 
-  virtual int NameColumnWidth() override {
-    return (int)Name().size();
+  virtual size_t NameColumnWidth() override {
+    return Name().size();
   }
 
   virtual std::string GetNameStr(void *) override;
@@ -104,20 +113,26 @@
   }
 
 protected:
-  virtual int NameColumnWidth() override {
-    int max = 0;
-    for (const auto arg : args_) {
-      max = std::max(max, (int)GetNameStr(arg).size());
+  virtual size_t NameColumnWidth() override {
+    size_t max = 0;
+    for (const auto& arg : args_) {
+      max = std::max(max, GetNameStr(arg).size());
     }
     return max;
   }
 
   std::string GetNameStr(T arg) override;
 
-  virtual void RunAll() override {
-    for (T arg : args_) {
-      BenchmarkT<T>::RunWithArg(arg);
+  virtual size_t RunAllArgs(std::vector<regex_t*>& regs) override {
+    size_t benchmarks_run = 0;
+    for (T& arg : args_) {
+      if (BenchmarkT<T>::ShouldRun(regs, arg)) {
+        Benchmark::PrintHeader();
+        BenchmarkT<T>::RunWithArg(arg);
+        benchmarks_run++;
+      }
     }
+    return benchmarks_run;
   }
 
   virtual void RunIterations(int iters, T arg) override {
