enh(query): opt decomp performance.

This commit is contained in:
Haojun Liao 2023-01-04 19:46:02 +08:00
parent b0885dddba
commit 3373324668
1 changed files with 52 additions and 28 deletions

View File

@ -274,46 +274,70 @@ int32_t tsDecompressINTImp(const char *const input, const int32_t nelements, cha
int32_t elems = selector_to_elems[(int32_t)selector]; int32_t elems = selector_to_elems[(int32_t)selector];
// Optimize the performance, by remove the constantly switch operation. // Optimize the performance, by remove the constantly switch operation.
int32_t v = 0; int32_t v = 0;
uint64_t zigzag_value; uint64_t zigzag_value = 0;
uint64_t mask = INT64MASK(bit);
switch (type) { switch (type) {
case TSDB_DATA_TYPE_BIGINT: { case TSDB_DATA_TYPE_BIGINT: {
for (int32_t i = 0; i < elems; i++) { if (selector == 0 || selector == 1) {
if (selector == 0 || selector == 1) { zigzag_value = 0;
zigzag_value = 0;
} else { for (int32_t i = 0; i < elems; i++) {
zigzag_value = ((w >> (4 + v)) & INT64MASK(bit)); int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);
int64_t curr_value = diff + prev_value;
prev_value = curr_value;
*((int64_t *)output + _pos) = (int64_t)curr_value;
_pos++;
v += bit;
if ((++count) == nelements) break;
} }
} else {
for (int32_t i = 0; i < elems; i++) {
zigzag_value = ((w >> (4 + v)) & mask);
int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value); int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);
int64_t curr_value = diff + prev_value; int64_t curr_value = diff + prev_value;
prev_value = curr_value; prev_value = curr_value;
*((int64_t *)output + _pos) = (int64_t)curr_value; *((int64_t *)output + _pos) = (int64_t)curr_value;
_pos++; _pos++;
v += bit; v += bit;
if ((++count) == nelements) break; if ((++count) == nelements) break;
}
} }
} break; } break;
case TSDB_DATA_TYPE_INT: { case TSDB_DATA_TYPE_INT: {
for (int32_t i = 0; i < elems; i++) { if (selector == 0 || selector == 1) {
if (selector == 0 || selector == 1) { zigzag_value = 0;
zigzag_value = 0; for (int32_t i = 0; i < elems; i++) {
} else { int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);
zigzag_value = ((w >> (4 + v)) & INT64MASK(bit)); int64_t curr_value = diff + prev_value;
prev_value = curr_value;
*((int32_t *)output + _pos) = (int32_t)curr_value;
_pos++;
v += bit;
if ((++count) == nelements) break;
} }
} else {
for (int32_t i = 0; i < elems; i++) {
zigzag_value = ((w >> (4 + v)) & mask);
int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value); int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);
int64_t curr_value = diff + prev_value; int64_t curr_value = diff + prev_value;
prev_value = curr_value; prev_value = curr_value;
*((int32_t *)output + _pos) = (int32_t)curr_value; *((int32_t *)output + _pos) = (int32_t)curr_value;
_pos++; _pos++;
v += bit; v += bit;
if ((++count) == nelements) break; if ((++count) == nelements) break;
}
} }
} break; } break;
case TSDB_DATA_TYPE_SMALLINT: { case TSDB_DATA_TYPE_SMALLINT: {
@ -321,7 +345,7 @@ int32_t tsDecompressINTImp(const char *const input, const int32_t nelements, cha
if (selector == 0 || selector == 1) { if (selector == 0 || selector == 1) {
zigzag_value = 0; zigzag_value = 0;
} else { } else {
zigzag_value = ((w >> (4 + v)) & INT64MASK(bit)); zigzag_value = ((w >> (4 + v)) & mask);
} }
int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value); int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);
@ -341,7 +365,7 @@ int32_t tsDecompressINTImp(const char *const input, const int32_t nelements, cha
if (selector == 0 || selector == 1) { if (selector == 0 || selector == 1) {
zigzag_value = 0; zigzag_value = 0;
} else { } else {
zigzag_value = ((w >> (4 + v)) & INT64MASK(bit)); zigzag_value = ((w >> (4 + v)) & mask);
} }
int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value); int64_t diff = ZIGZAG_DECODE(int64_t, zigzag_value);