diff --git a/benchtests/Makefile b/benchtests/Makefile
index 61077ea9b6f7d4c342192429a8d90ecdf9bdaea7..03311dd72856bf0e595a759b817cb772f0fd3a6f 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -38,7 +38,7 @@ string-benchset := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \
Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  strcat strchr strchrnul strcmp strcpy strcspn strlen \
Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \
Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok \
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  strcoll memcpy-large memmove-large memset-large
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  strcoll memcpy-large memcpy-random memmove-large memset-large
Â wcsmbs-benchset := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \
Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  wcscmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \
Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â  wmemchr wmemset wmemcmp
diff --git a/benchtests/bench-memcpy-random.c b/benchtests/bench-memcpy-random.c
new file mode 100644
index 0000000000000000000000000000000000000000..668d6a1d35074f4227be4e1ff424da556a377cef
--- /dev/null
+++ b/benchtests/bench-memcpy-random.c
@@ -0,0 +1,130 @@
+/* Measure memcpy functions.
+Â Â  Copyright (C) 2016 Free Software Foundation, Inc.
+Â Â  This file is part of the GNU C Library.
+
+Â Â  The GNU C 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 2.1 of the License, or (at your option) any later version.
+
+Â Â  The GNU C 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 a copy of the GNU Lesser General Public
+Â Â  License along with the GNU C Library; if not, see
+Â Â  <http://www.gnu.org/licenses/>.Â  */
+
+#define MIN_PAGE_SIZE 131072
+#define TEST_MAIN
+#define TEST_NAME "memcpy-random"
+#include "bench-string.h"
+
+IMPL (memcpy, 0)
+
+#define NUM_COPIES 2048
+#define NUM_DISTRÂ  1024
+
+typedef struct
+{
+Â  uint16_t src;
+Â  uint16_t dst;
+Â  uint16_t len;
+} copy_t;
+
+static copy_t copy[NUM_COPIES];
+static uint8_t copy_distribution[NUM_DISTR];
+
+typedef char *(*proto_t) (char *, const char *, size_t);
+
+
+static void
+init_copy_distribution (void)
+{
+Â  int i, n, pos = 0;
+Â  for (i = 0; i < 256; i++)
+Â Â Â  {
+Â Â Â Â Â  if (i < 8)
+Â Â Â Â Â Â  n = 1;
+Â Â Â Â Â  else if (i < 16)
+Â Â Â Â Â Â  n = 8;
+Â Â Â Â Â  else if (i < 32)
+Â Â Â Â Â Â  n = 6;
+Â Â Â Â Â  else if (i < 64)
+Â Â Â Â Â Â  n = 4;
+Â Â Â Â Â  else if (i < 128)
+Â Â Â Â Â Â  n = 2;
+Â Â Â Â Â  else
+Â Â Â Â Â Â  n = 1;
+
+Â Â Â Â Â  if ((i & 15) == 0)
+Â Â Â Â Â Â  n = n * 7;
+Â Â Â Â Â  else if ((i & 7) == 0)
+Â Â Â Â Â Â  n = n * 5;
+Â Â Â Â Â  else if ((i & 3) == 0)
+Â Â Â Â Â Â  n = n * 3;
+
+Â Â Â Â Â  for ( ; n > 0 && pos < NUM_DISTR; n--)
+Â Â Â Â Â Â  copy_distribution[pos++] = i;
+Â Â Â  }
+Â  for ( ; pos < NUM_DISTR; pos++)
+Â Â Â  copy_distribution[pos] = 255;
+}
+
+static void
+do_one_test (impl_t *impl, char *dst, char *src, copy_t *copy, size_t n)
+{
+Â  timing_t start, stop, cur;
+Â  size_t iters = INNER_LOOP_ITERS * 20;
+
+Â  TIMING_NOW (start);
+Â  for (int i = 0; i < iters; ++i)
+Â Â Â  for (int j = 0; j < n; j++)
+Â Â Â Â Â  CALL (impl, dst + copy[j].dst, src + copy[j].src, copy[j].len);
+Â  TIMING_NOW (stop);
+
+Â  TIMING_DIFF (cur, start, stop);
+
+Â  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+}
+
+static void
+do_test (size_t max_size)
+{
+Â  for (int i = 0; i < max_size; i++)
+Â Â Â  buf1[i] = i * 3;
+
+Â  for (int i = 0; i < NUM_COPIES; i++)
+Â Â Â  {
+Â Â Â Â Â  copy[i].dst = rand () & (max_size - 1);
+Â Â Â Â Â  copy[i].src = rand () & (max_size - 1);
+Â Â Â Â Â  copy[i].len = copy_distribution[rand () & (NUM_DISTR - 1)];
+Â Â Â  }
+
+Â  printf ("Memory size %6zd:", max_size);
+
+Â  FOR_EACH_IMPL (impl, 0)
+Â Â Â  do_one_test (impl, (char *) buf2, (char *) buf1, copy, NUM_COPIES);
+
+Â  putchar ('\n');
+}
+
+int
+test_main (void)
+{
+Â  test_init ();
+Â  init_copy_distribution ();
+
+Â  printf ("%23s", "");
+Â  FOR_EACH_IMPL (impl, 0)
+Â Â Â  printf ("\t%s", impl->name);
+Â  putchar ('\n');
+
+Â  for (int i = 4; i <= 64; i = i * 2)
+Â Â Â  do_test (i * 1024);
+
+Â  return ret;
+}
+
+#include "../test-skeleton.c"
