89 lines
3.5 KiB
Diff
89 lines
3.5 KiB
Diff
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;
|
|
}
|
|
};
|
|
|