Optimize ascii_pack in debug mode

This commit is contained in:
Roman Gershman 2022-03-12 12:06:32 +02:00
parent d5281721bd
commit 81ffb189ef
3 changed files with 15 additions and 13 deletions

2
helio

@ -1 +1 @@
Subproject commit 2a6629d7e47da545bede22507d04bd2de409b1cb
Subproject commit 408d201f365ce886f1b1e762810e81e0509ea8b9

View File

@ -208,7 +208,7 @@ constexpr bool kUseSmallStrings = true;
/// TODO: Ascii encoding becomes slow for large blobs. We should factor it out into a separate
/// file and implement with SIMD instructions.
constexpr bool kUseAsciiEncoding = false;
constexpr bool kUseAsciiEncoding = true;
} // namespace
@ -393,6 +393,9 @@ quicklist* RobjWrapper::GetQL() const {
return (quicklist*)inner_obj_;
}
#pragma GCC push_options
#pragma GCC optimize("Ofast")
// len must be at least 16
void ascii_pack(const char* ascii, size_t len, uint8_t* bin) {
unsigned i = 0;
@ -420,17 +423,14 @@ void ascii_unpack(const uint8_t* bin, size_t ascii_len, char* ascii) {
uint8_t p = 0;
unsigned i = 0;
auto step = [&] {
uint8_t src = *bin; // keep on stack in case we unpack inplace.
*ascii++ = (p >> (8 - i)) | ((src << i) & kM);
p = src;
++bin;
};
while (ascii_len >= 8) {
for (i = 0; i < 7; ++i) {
step();
uint8_t src = *bin; // keep on stack in case we unpack inplace.
*ascii++ = (p >> (8 - i)) | ((src << i) & kM);
p = src;
++bin;
}
ascii_len -= 8;
*ascii++ = p >> 1;
}
@ -443,6 +443,8 @@ void ascii_unpack(const uint8_t* bin, size_t ascii_len, char* ascii) {
}
}
#pragma GCC pop_options
// compares packed and unpacked strings. packed must be of length = binpacked_len(ascii_len).
bool compare_packed(const uint8_t* packed, const char* ascii, size_t ascii_len) {
unsigned i = 0;
@ -811,7 +813,7 @@ bool CompactObj::HasAllocated() const {
return true;
}
void CompactObj::GetString(string* res) const {
void __attribute__((noinline)) CompactObj::GetString(string* res) const {
string_view slice = GetSlice(res);
if (res->data() != slice.data()) {
res->assign(slice);

View File

@ -327,8 +327,8 @@ TEST_F(DflyEngineTest, Memcache) {
TEST_F(DflyEngineTest, LimitMemory) {
mi_option_enable(mi_option_limit_os_alloc);
string blob(1 << 15, 'a');
for (size_t i = 0; i < 1000; ++i) {
string blob(128, 'a');
for (size_t i = 0; i < 10000; ++i) {
auto resp = Run({"set", absl::StrCat(blob, i), blob});
ASSERT_THAT(resp, RespEq("OK"));
}