]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: unit test for crc32c
authorSage Weil <sage@inktank.com>
Wed, 4 Sep 2013 00:59:30 +0000 (17:59 -0700)
committerSage Weil <sage@inktank.com>
Wed, 4 Sep 2013 23:05:27 +0000 (16:05 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Dan Mick <dan.mick@inktank.com>
src/Makefile.am
src/test/common/test_crc32c.cc [new file with mode: 0644]

index 7d87c7b5f602485b5249ddb3f7412ba7aaf1768f..d93e63c4c4ebbefbd81092ffc3fbb29a24a39422 100644 (file)
@@ -779,6 +779,11 @@ unittest_arch_SOURCES = test/test_arch.c arch/intel.c arch/neon.c arch/probe.cc
 unittest_arch_CXXFLAGS = ${AM_CFLAGS}
 check_PROGRAMS += unittest_arch
 
+unittest_crc32c_SOURCES = test/common/test_crc32c.cc arch/intel.c arch/neon.c arch/probe.cc
+unittest_crc32c_CXXFLAGS = ${AM_CFLAGS} ${UNITTEST_CXXFLAGS}
+unittest_crc32c_LDADD = libcrc.la ${UNITTEST_LDADD} ${LIBGLOBAL_LDA}
+check_PROGRAMS += unittest_crc32c
+
 unittest_sharedptr_registry_SOURCES = test/common/test_sharedptr_registry.cc
 unittest_sharedptr_registry_CXXFLAGS = ${AM_CXXFLAGS} ${UNITTEST_CXXFLAGS}
 unittest_sharedptr_registry_LDADD = libcommon.la ${LIBGLOBAL_LDA} ${UNITTEST_LDADD}
diff --git a/src/test/common/test_crc32c.cc b/src/test/common/test_crc32c.cc
new file mode 100644 (file)
index 0000000..19a1dfb
--- /dev/null
@@ -0,0 +1,75 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <iostream>
+#include <string.h>
+
+#include "include/types.h"
+#include "include/crc32c.h"
+#include "include/utime.h"
+#include "common/Clock.h"
+
+#include "gtest/gtest.h"
+
+#include "common/sctp_crc32.h"
+#include "common/crc32c_intel_baseline.h"
+
+TEST(Crc32c, Small) {
+  const char *a = "foo bar baz";
+  const char *b = "whiz bang boom";
+  ASSERT_EQ(4119623852u, ceph_crc32c(0, (unsigned char *)a, strlen(a)));
+  ASSERT_EQ(881700046u, ceph_crc32c(1234, (unsigned char *)a, strlen(a)));
+  ASSERT_EQ(2360230088u, ceph_crc32c(0, (unsigned char *)b, strlen(b)));
+  ASSERT_EQ(3743019208u, ceph_crc32c(5678, (unsigned char *)b, strlen(b)));
+}
+
+TEST(Crc32c, Big) {
+  int len = 4096000;
+  char *a = (char *)malloc(len);
+  memset(a, 1, len);
+  ASSERT_EQ(31583199u, ceph_crc32c(0, (unsigned char *)a, len));
+  ASSERT_EQ(1400919119u, ceph_crc32c(1234, (unsigned char *)a, len));
+}
+
+TEST(Crc32c, Performance) {
+  int len = 1000 * 1024 * 1024;
+  char *a = (char *)malloc(len);
+  std::cout << "populating large buffer" << std::endl;
+  for (int i=0; i<len; i++)
+    a[i] = i & 0xff;
+  std::cout << "calculating crc" << std::endl;
+
+  {
+    utime_t start = ceph_clock_now(NULL);
+    unsigned val = ceph_crc32c(0, (unsigned char *)a, len);
+    utime_t end = ceph_clock_now(NULL);
+    float rate = (float)len / (float)(1024*1024) / (float)(end - start);
+    std::cout << "best choice = " << rate << " MB/sec" << std::endl;
+    ASSERT_EQ(261108528u, val);
+  }
+  {
+    utime_t start = ceph_clock_now(NULL);
+    unsigned val = ceph_crc32c(0xffffffff, (unsigned char *)a, len);
+    utime_t end = ceph_clock_now(NULL);
+    float rate = (float)len / (float)(1024*1024) / (float)(end - start);
+    std::cout << "best choice 0xffffffff = " << rate << " MB/sec" << std::endl;
+    ASSERT_EQ(3895876243u, val);
+  }
+  {
+    utime_t start = ceph_clock_now(NULL);
+    unsigned val = ceph_crc32c_sctp(0, (unsigned char *)a, len);
+    utime_t end = ceph_clock_now(NULL);
+    float rate = (float)len / (float)(1024*1024) / (float)(end - start);
+    std::cout << "sctp = " << rate << " MB/sec" << std::endl;
+    ASSERT_EQ(261108528u, val);
+  }
+  {
+    utime_t start = ceph_clock_now(NULL);
+    unsigned val = ceph_crc32c_intel_baseline(0, (unsigned char *)a, len);
+    utime_t end = ceph_clock_now(NULL);
+    float rate = (float)len / (float)(1024*1024) / (float)(end - start);
+    std::cout << "intel baseline = " << rate << " MB/sec" << std::endl;
+    ASSERT_EQ(261108528u, val);
+  }
+
+}