142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.6 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 <gtest/gtest.h>
 | |
| #include "storage/blocksstable/encoding/ob_encoding_bitset.h"
 | |
| #include "lib/time/ob_time_utility.h"
 | |
| #include <vector>
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace blocksstable
 | |
| {
 | |
| 
 | |
| using namespace common;
 | |
| 
 | |
| TEST(BitSet, set_get)
 | |
| {
 | |
|   const int64_t sset_cnt = 50;
 | |
|   const int64_t lset_cnt = 400;
 | |
| 
 | |
|   uint64_t s[1];
 | |
|   uint64_t l[8];
 | |
| 
 | |
|   std::vector<int64_t> s_pos;
 | |
|   std::vector<int64_t> l_pos;
 | |
| 
 | |
|   BitSet sset;
 | |
|   ASSERT_EQ(OB_SUCCESS, sset.init(s, sset_cnt));
 | |
|   BitSet lset;
 | |
|   ASSERT_EQ(OB_SUCCESS, lset.init(l, lset_cnt));
 | |
| 
 | |
|   for (int64_t tn = 0; tn < 1000; ++tn) {
 | |
|     sset.reset();
 | |
|     lset.reset();
 | |
|     s_pos.clear();
 | |
|     l_pos.clear();
 | |
| 
 | |
|     int64_t i = 0;
 | |
|     while(i < sset_cnt) {
 | |
|       sset.set(i);
 | |
|       s_pos.push_back(i);
 | |
|       i += random() % 5 + 1;
 | |
|     }
 | |
| 
 | |
|     for(i = 0; i < sset_cnt; ++i) {
 | |
|       std::vector<int64_t>::iterator iter = std::find(s_pos.begin(), s_pos.end(), i);
 | |
|       if (s_pos.end() != iter) {
 | |
|         ASSERT_TRUE(sset.get(i))
 | |
|           << "i: " << i << std::endl;
 | |
|         ASSERT_EQ(iter - s_pos.begin(), sset.get_ref(i))
 | |
|           << "i: " << i << std::endl;
 | |
|       } else {
 | |
|         ASSERT_FALSE(sset.get(i))
 | |
|           << "i: " << i << std::endl;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     i = 0;
 | |
|     while(i < lset_cnt) {
 | |
|       lset.set(i);
 | |
|       l_pos.push_back(i);
 | |
|       i += random() % 5 + 1;
 | |
|     }
 | |
| 
 | |
|     for(i = 0; i < lset_cnt; ++i) {
 | |
|       std::vector<int64_t>::iterator iter = std::find(l_pos.begin(), l_pos.end(), i);
 | |
|       if (l_pos.end() != iter) {
 | |
|         ASSERT_TRUE(lset.get(i))
 | |
|           << "i: " << i << std::endl;
 | |
|         ASSERT_EQ(iter - l_pos.begin(), lset.get_ref(i))
 | |
|           << "i: " << i << std::endl;
 | |
|       } else {
 | |
|         ASSERT_FALSE(lset.get(i))
 | |
|           << "i: " << i << std::endl;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST(BitSet, perf)
 | |
| {
 | |
|   const int64_t lset_cnt = 400;
 | |
|   const int64_t pct = 10;
 | |
|   const int64_t loops_cnt = 10000;
 | |
| 
 | |
|   uint64_t l[8];
 | |
|   std::vector<int64_t> l_pos;
 | |
|   BitSet lset;
 | |
|   ASSERT_EQ(OB_SUCCESS, lset.init(l, lset_cnt));
 | |
|   uint64_t bitset_time_used = 0;
 | |
|   uint64_t bins_time_used = 0;
 | |
|   uint64_t begin_time = 0;
 | |
|   uint64_t end_time = 0;
 | |
| 
 | |
|   for (int64_t j = 0; j < loops_cnt; ++j) {
 | |
|     lset.reset();
 | |
|     l_pos.clear();
 | |
|     int64_t i = 0;
 | |
|     while(i < lset_cnt) {
 | |
|       lset.set(i);
 | |
|       l_pos.push_back(i);
 | |
|       i += random() % pct + 1;
 | |
|     }
 | |
|     // get ref
 | |
|     begin_time = ::oceanbase::common::ObTimeUtility::current_time();
 | |
|     for (i = 0; i < l_pos.size(); ++i) {
 | |
|       lset.get_ref(l_pos.at(i));
 | |
|     }
 | |
|     end_time = ::oceanbase::common::ObTimeUtility::current_time();
 | |
|     bitset_time_used += end_time - begin_time;
 | |
| 
 | |
|     // binary search
 | |
|     begin_time = ::oceanbase::common::ObTimeUtility::current_time();
 | |
|     for (i = 0; i < l_pos.size(); ++i) {
 | |
|       std::lower_bound(l_pos.begin(), l_pos.end(), l_pos.at(i));
 | |
|     }
 | |
|     end_time = ::oceanbase::common::ObTimeUtility::current_time();
 | |
|     bins_time_used += end_time - begin_time;
 | |
|   }
 | |
|   printf("bitset time: %ld us\n", bitset_time_used);
 | |
|   printf("binary search time: %ld us\n", bins_time_used);
 | |
| 
 | |
| }
 | |
| 
 | |
| } // end namespace blocksstable
 | |
| } // end namespace oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
