diff --git a/wpiutil/examples/writelog/writelog.cpp b/wpiutil/examples/writelog/writelog.cpp
new file mode 100644
index 0000000..6fdf763
--- /dev/null
+++ b/wpiutil/examples/writelog/writelog.cpp
@@ -0,0 +1,82 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <array>
+#include <chrono>
+#include <numeric>
+#include <string>
+#include <vector>
+
+#include "fmt/format.h"
+#include "wpi/DataLog.h"
+
+int main(int argc, char** argv) {
+  using std::chrono::duration_cast;
+  using std::chrono::high_resolution_clock;
+  using std::chrono::microseconds;
+
+  int kNumRuns = 10;
+
+  if (argc == 2) {
+    kNumRuns = std::stoi(argv[1]);
+  }
+
+  wpi::log::DataLog log;
+  log.SetFilename("test.wpilog");
+
+  auto testVec =
+      std::vector<std::pair<std::string, void (*)(wpi::log::DataLog&)>>();
+
+  testVec.push_back({"50 double append", [](auto& log) {
+                       wpi::log::DoubleLogEntry entry{log, "fifty", 1};
+                       for (int i = 0; i < 50; ++i) {
+                         entry.Append(1.3 * i, 20000 * i);
+                       }
+                     }});
+#if 0
+  testVec.push_back({"500k double append", [](auto& log) {
+                       wpi::log::DoubleLogEntry entry{log, "500k", 1};
+                       for (uint64_t i = 0; i < 500000; ++i) {
+                         entry.Append(1.3 * i, 20000 * i);
+                       }
+                     }});
+#endif
+  testVec.push_back({"50 string append", [](auto& log) {
+                       wpi::log::StringLogEntry entry{log, "string", 1};
+                       for (int i = 0; i < 50; ++i) {
+                         entry.Append("hello", 20000 * i);
+                       }
+                     }});
+
+  testVec.push_back(
+      {"Double array append", [](auto& log) {
+         wpi::log::DoubleArrayLogEntry entry{log, "double_array", 1};
+         entry.Append({1, 2, 3}, 20000);
+         entry.Append({4, 5}, 30000);
+       }});
+
+  testVec.push_back(
+      {"String array append", [](auto& log) {
+         wpi::log::StringArrayLogEntry entry{log, "string_array", 1};
+         entry.Append({"Hello", "World"}, 20000);
+         entry.Append({"This", "Is", "Fun"}, 30000);
+       }});
+
+  for (const auto& [name, fn] : testVec) {
+    auto resVec = std::vector<microseconds::rep>();
+    fmt::print("{}: ", name);
+
+    for (int i = 0; i < kNumRuns; ++i) {
+      auto start = high_resolution_clock::now();
+      fn(log);
+      auto stop = high_resolution_clock::now();
+      resVec.push_back(duration_cast<microseconds>(stop - start).count());
+    }
+
+    fmt::print("{}us\n",
+               std::accumulate(resVec.begin(), resVec.end(), 0) / kNumRuns);
+  }
+
+  return EXIT_SUCCESS;
+}
