mcst-linux-kernel/patches-2024.06.26/ceph-14.2.22/0015-hex-strings-processing...

89 lines
3.5 KiB
Diff
Raw Permalink Normal View History

2024-07-09 13:51:45 +03:00
Subject: performance patch for hex strings processing
Bug:
Tags: common
diff -rupN a/src/os/filestore/HashIndex.cc b/src/os/filestore/HashIndex.cc
--- a/src/os/filestore/HashIndex.cc 2021-08-24 17:28:11.649287807 +0300
+++ b/src/os/filestore/HashIndex.cc 2021-08-24 17:30:41.612422703 +0300
@@ -68,9 +68,14 @@ char reverse_hexdigit_bits(char c)
/// reverse nibble bits in a hex string
string reverse_hexdigit_bits_string(string s)
{
- for (unsigned i=0; i<s.size(); ++i)
- s[i] = reverse_hexdigit_bits(s[i]);
- return s;
+ static char hex_digit_reverse_table[256] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx084C2A6E19xxxxxxx5D3B7Fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ int ssize = s.size();
+ char ss[ssize + 1];
+ memcpy(ss, s.data(), ssize);
+ ss[ssize] = '\0';
+ for (int i=0; i<ssize; i++)
+ ss[i] = hex_digit_reverse_table[ss[i]];
+ return ss;
}
/// compare hex digit (as length 1 string) bitwise
@@ -87,9 +92,27 @@ bool cmp_hexdigit_bitwise(const string&
/// compare hex digit string bitwise
bool cmp_hexdigit_string_bitwise(const string& l, const string& r)
{
- string ll = reverse_hexdigit_bits_string(l);
- string rr = reverse_hexdigit_bits_string(r);
- return ll < rr;
+ static char hex_digit_reverse_table[256] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx084C2A6E19xxxxxxx5D3B7Fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ int lsize = l.size();
+ int rsize = r.size();
+ int minsize = 0;
+ if (lsize < rsize)
+ minsize = lsize + 1;
+ else
+ minsize = rsize + 1;
+ char ll[lsize + 1];
+ char rr[rsize + 1];
+ memcpy(ll, l.data(), lsize);
+ memcpy(rr, r.data(), rsize);
+ ll[lsize] = rr[rsize] = '\0';
+ for (int i = 0; i < minsize - 1; i++) {
+ ll[i] = hex_digit_reverse_table[ll[i]];
+ rr[i] = hex_digit_reverse_table[rr[i]];
+ }
+ if(memcmp(ll, rr, minsize)<0)
+ return true;
+ else
+ return false;
}
int HashIndex::cleanup() {
diff -rupN a/src/os/filestore/HashIndex.h b/src/os/filestore/HashIndex.h
--- a/src/os/filestore/HashIndex.h 2021-08-24 17:28:11.649287807 +0300
+++ b/src/os/filestore/HashIndex.h 2021-08-24 17:31:35.509174524 +0300
@@ -420,7 +420,27 @@ private:
struct CmpHexdigitStringBitwise {
bool operator()(const string& l, const string& r) const {
- return reverse_hexdigit_bits_string(l) < reverse_hexdigit_bits_string(r);
+ static char hex_digit_reverse_table[256] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx084C2A6E19xxxxxxx5D3B7Fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ int lsize = l.size();
+ int rsize = r.size();
+ int minsize = 0;
+ if (lsize < rsize)
+ minsize = lsize + 1;
+ else
+ minsize = rsize + 1;
+ char ll[lsize + 1];
+ char rr[rsize + 1];
+ memcpy(ll, l.data(), lsize);
+ memcpy(rr, r.data(), rsize);
+ ll[lsize] = rr[rsize] = '\0';
+ for (int i = 0; i < minsize - 1; i++) {
+ ll[i] = hex_digit_reverse_table[ll[i]];
+ rr[i] = hex_digit_reverse_table[rr[i]];
+ }
+ if(memcmp(ll, rr, minsize)<0)
+ return true;
+ else
+ return false;
}
};