Files
oceanbase/deps/oblib/unittest/lib/checksum/test_crc64.cpp
oceanbase-admin cea7de1475 init push
2021-05-31 22:56:52 +08:00

99 lines
2.8 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include <pthread.h>
#include <gtest/gtest.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include "lib/checksum/ob_crc64.h"
using namespace oceanbase::common;
using namespace std;
char* rand_str(char* str, const int64_t len)
{
int64_t i;
for (i = 0; i < len; ++i)
str[i] = (char)('A' + rand() % 26);
str[++i] = '\0';
return str;
}
int64_t get_current_time_us()
{
timeval tv;
gettimeofday(&tv, 0);
return (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec;
}
TEST(TestCrc64, common)
{
const int64_t STR_LEN = 10240;
char* tmp_str = new char[STR_LEN];
char* str = NULL;
for (int64_t i = 1; i < (STR_LEN - 1); ++i) {
str = rand_str(tmp_str, i);
uint64_t manually_hash = crc64_sse42_manually(0, str, i);
uint64_t fast_manually_hash = fast_crc64_sse42_manually(0, str, i);
uint64_t sse42_hash = ob_crc64(0, str, i);
ASSERT_EQ(manually_hash, fast_manually_hash);
ASSERT_EQ(manually_hash, sse42_hash);
// cout << "st = "<< tmp_str << endl;
// cout << "crc64c = "<< manually_hash << endl;
}
}
TEST(TestCrc64, test_speed)
{
const int64_t STR_LEN = 2 << 20;
const int64_t COUNT = 1000;
char* tmp_str = new char[STR_LEN];
for (int64_t i = 2 << 8; i <= STR_LEN; i *= 2) {
int64_t start = get_current_time_us();
for (int64_t j = 0; j < COUNT; ++j) {
crc64_sse42_manually(0, tmp_str, i);
}
int64_t end = get_current_time_us();
cout << " crc64_sse42_manually, execut_count = " << COUNT << ", cost_us = " << end - start << " len = " << i
<< endl;
start = get_current_time_us();
for (int64_t j = 0; j < COUNT; ++j) {
fast_crc64_sse42_manually(0, tmp_str, i);
}
end = get_current_time_us();
cout << "fast_crc64_sse42_manually, execut_count = " << COUNT << ", cost_us = " << end - start << " len = " << i
<< endl;
start = get_current_time_us();
for (int64_t j = 0; j < COUNT; ++j) {
ob_crc64(0, tmp_str, i);
}
end = get_current_time_us();
cout << " ob_crc64(sse42), execut_count = " << COUNT << ", cost_us = " << end - start << " len = " << i
<< endl;
cout << endl;
cout << endl;
}
}
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}