diff --git a/tests/benchmarks/encoding-bench.cpp b/tests/benchmarks/encoding-bench.cpp
new file mode 100644
index 0000000..3ab246d
--- /dev/null
+++ b/tests/benchmarks/encoding-bench.cpp
@@ -0,0 +1,133 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013-2020 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#define BOOST_TEST_MODULE ndn-cxx Encoding Benchmark
+#include "tests/boost-test.hpp"
+
+#include "ndn-cxx/encoding/tlv.hpp"
+#include "tests/benchmarks/timed-execute.hpp"
+
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/vector_c.hpp>
+
+#include <iostream>
+
+namespace ndn {
+namespace tlv {
+namespace tests {
+
+using namespace ndn::tests;
+
+template<size_t WIRE_SIZE>
+struct ReadVarNumberTest;
+
+template<>
+struct ReadVarNumberTest<1>
+{
+  static const uint8_t WIRE[];
+  static const uint64_t VALUE = 252;
+};
+const uint8_t ReadVarNumberTest<1>::WIRE[] = {0xfc};
+
+template<>
+struct ReadVarNumberTest<3>
+{
+  static const uint8_t WIRE[];
+  static const uint64_t VALUE = 253;
+};
+const uint8_t ReadVarNumberTest<3>::WIRE[] = {0xfd, 0x00, 0xfd};
+
+template<>
+struct ReadVarNumberTest<5>
+{
+  static const uint8_t WIRE[];
+  static const uint64_t VALUE = 65536;
+};
+const uint8_t ReadVarNumberTest<5>::WIRE[] = {0xfe, 0x00, 0x01, 0x00, 0x00};
+
+template<>
+struct ReadVarNumberTest<9>
+{
+  static const uint8_t WIRE[];
+  static const uint64_t VALUE = 4294967296;
+};
+const uint8_t ReadVarNumberTest<9>::WIRE[] = {0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00};
+
+template<size_t WIRE_SIZE, size_t ALIGNMENT_OFFSET>
+struct ReadVarNumberAlignTest : public ReadVarNumberTest<WIRE_SIZE>
+{
+  using AlignmentOffset = std::integral_constant<size_t, ALIGNMENT_OFFSET>;
+
+  static_assert(sizeof(ReadVarNumberTest<WIRE_SIZE>::WIRE) == WIRE_SIZE, "");
+};
+
+using ReadVarNumberTests = boost::mpl::vector<
+  ReadVarNumberAlignTest<1, 0>,
+  ReadVarNumberAlignTest<3, 0>,
+  ReadVarNumberAlignTest<3, 1>,
+  ReadVarNumberAlignTest<5, 0>,
+  ReadVarNumberAlignTest<5, 1>,
+  ReadVarNumberAlignTest<5, 2>,
+  ReadVarNumberAlignTest<5, 3>,
+  ReadVarNumberAlignTest<9, 0>,
+  ReadVarNumberAlignTest<9, 1>,
+  ReadVarNumberAlignTest<9, 2>,
+  ReadVarNumberAlignTest<9, 3>,
+  ReadVarNumberAlignTest<9, 4>,
+  ReadVarNumberAlignTest<9, 5>,
+  ReadVarNumberAlignTest<9, 6>,
+  ReadVarNumberAlignTest<9, 7>
+>;
+
+// Benchmark of ndn::tlv::readVarNumber with different number lengths and alignments.
+// For accurate results, it is required to compile ndn-cxx in release mode.
+// It is recommended to run the benchmark multiple times and take the average.
+BOOST_AUTO_TEST_CASE_TEMPLATE(ReadVarNumber, Test, ReadVarNumberTests)
+{
+  const int N_ITERATIONS = 100000000;
+
+  alignas(8) uint8_t buffer[16];
+  static_assert(Test::AlignmentOffset::value + sizeof(Test::WIRE) <= sizeof(buffer), "");
+  uint8_t* const begin = buffer + Test::AlignmentOffset::value;
+  std::memcpy(begin, Test::WIRE, sizeof(Test::WIRE));
+  const uint8_t* const end = begin + sizeof(Test::WIRE);
+
+  int nOks = 0;
+  int nCorrects = 0;
+  auto d = timedExecute([&] {
+    uint64_t number = 0;
+    for (int i = 0; i < N_ITERATIONS; ++i) {
+      const uint8_t* begin2 = begin; // make a copy because readVarNumber increments the pointer
+      nOks += readVarNumber(begin2, end, number);
+      nCorrects += number == Test::VALUE;
+      // use the number and the return value, so compiler won't optimize out their computation
+    }
+  });
+  BOOST_CHECK_EQUAL(nOks, N_ITERATIONS);
+  BOOST_CHECK_EQUAL(nCorrects, N_ITERATIONS);
+  std::cout << "size=" << sizeof(Test::WIRE)
+            << " offset=" << Test::AlignmentOffset::value
+            << " " << d << std::endl;
+}
+
+} // namespace tests
+} // namespace tlv
+} // namespace ndn
