diff --git a/modules/menu_bench/config/install/system.menu.menu_bench.yml b/modules/menu_bench/config/install/system.menu.menu_bench.yml
new file mode 100644
index 0000000..02450df
--- /dev/null
+++ b/modules/menu_bench/config/install/system.menu.menu_bench.yml
@@ -0,0 +1,5 @@
+id: menu_bench
+label: 'Menu for benchmarking'
+description: ''
+langcode: en
+locked: false
diff --git a/modules/menu_bench/menu_bench.info.yml b/modules/menu_bench/menu_bench.info.yml
new file mode 100644
index 0000000..af109d0
--- /dev/null
+++ b/modules/menu_bench/menu_bench.info.yml
@@ -0,0 +1,5 @@
+name: 'Menu Bench'
+type: module
+description: 'Renders a menu with a lot of custom links. Used for benchmarking.'
+package: Testing
+core: 8.x
diff --git a/modules/menu_bench/menu_bench.install b/modules/menu_bench/menu_bench.install
new file mode 100644
index 0000000..4a1447f
--- /dev/null
+++ b/modules/menu_bench/menu_bench.install
@@ -0,0 +1,24 @@
+<?php
+
+function menu_bench_install() {
+  drupal_flush_all_caches();
+  if (\Drupal::entityManager()->hasDefinition('menu_link')) {
+    for ($i=0; $i<100; $i++) {
+      entity_create('menu_link', array(
+        'link_title' => 'Link ' . ($i+1),
+        'menu_name' => 'menu_bench',
+        'route_name' => 'menu_bench.decoy',
+      ))->save();
+    }
+  }
+  else {
+    for ($i=0; $i<100; $i++) {
+      entity_create('menu_link_content', array(
+        'title' => 'Link ' . ($i+1),
+        'bundle' => 'menu_link_content',
+        'menu_name' => 'menu_bench',
+        'route_name' => 'menu_bench.decoy',
+      ))->save();
+    }
+  }
+}
diff --git a/modules/menu_bench/menu_bench.routing.yml b/modules/menu_bench/menu_bench.routing.yml
new file mode 100644
index 0000000..fde2c13
--- /dev/null
+++ b/modules/menu_bench/menu_bench.routing.yml
@@ -0,0 +1,15 @@
+menu_bench.display:
+  path: '/menu-bench'
+  defaults:
+    _content: '\Drupal\menu_bench\MenuBenchController::display'
+    _title: 'Menu Bench'
+  requirements:
+    _access: 'TRUE'
+
+menu_bench.decoy:
+  path: '/menu-bench/decoy'
+  defaults:
+    _content: '\Drupal\menu_bench\MenuBenchController::decoy'
+    _title: 'Menu Bench'
+  requirements:
+    _access: 'TRUE'
diff --git a/modules/menu_bench/src/MenuBenchController.php b/modules/menu_bench/src/MenuBenchController.php
new file mode 100644
index 0000000..d4d53d1
--- /dev/null
+++ b/modules/menu_bench/src/MenuBenchController.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\menu_bench;
+
+class MenuBenchController {
+  function display() {
+    if (\Drupal::hasService('menu_link.tree')) {
+      return \Drupal::service('menu_link.tree')->renderMenu('menu_bench');
+    }
+    else {
+      $tree_service = \Drupal::service('menu.link_tree');
+      return $tree_service->buildRenderTree($tree_service->buildPageData('menu_bench'));
+    }
+  }
+  function decoy() {
+    return 'Nothing to see here.';
+  }
+}
