Skip to content

Commit 6159175

Browse files
committed
More align friendly in Knn (#3241)
1 parent c73a811 commit 6159175

File tree

3 files changed

+15
-16
lines changed

3 files changed

+15
-16
lines changed

ydb/library/yql/udfs/common/knn/knn-serializer.h

+13-14
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,23 @@
1111
using namespace NYql;
1212
using namespace NYql::NUdf;
1313

14-
enum EFormat : ui32 {
14+
enum EFormat : ui8 {
1515
FloatVector = 1
1616
};
1717

18+
static constexpr size_t HeaderLen = sizeof(ui8);
1819

1920
class TFloatVectorSerializer {
2021
public:
2122
static TUnboxedValue Serialize(const IValueBuilder* valueBuilder, const TUnboxedValue x) {
2223
auto serialize = [&x] (IOutputStream& outStream) {
23-
const EFormat format = EFormat::FloatVector;
24-
outStream.Write(&format, sizeof(ui32));
2524
EnumerateVector(x, [&outStream] (float element) { outStream.Write(&element, sizeof(float)); });
25+
const EFormat format = EFormat::FloatVector;
26+
outStream.Write(&format, HeaderLen);
2627
};
2728

2829
if (x.HasFastListLength()) {
29-
auto str = valueBuilder->NewStringNotFilled(sizeof(ui32) + x.GetListLength() * sizeof(float));
30+
auto str = valueBuilder->NewStringNotFilled(HeaderLen + x.GetListLength() * sizeof(float));
3031
auto strRef = str.AsStringRef();
3132
TMemoryOutput memoryOutput(strRef.Data(), strRef.Size());
3233

@@ -42,9 +43,8 @@ class TFloatVectorSerializer {
4243
}
4344

4445
static TUnboxedValue Deserialize(const IValueBuilder *valueBuilder, const TStringRef& str) {
45-
//skip format header, it was already read
46-
const char* buf = str.Data() + sizeof(ui32);
47-
const size_t len = str.Size() - sizeof(ui32);
46+
const char* buf = str.Data();
47+
const size_t len = str.Size() - HeaderLen;
4848

4949
if (len % sizeof(float) != 0)
5050
return {};
@@ -66,9 +66,8 @@ class TFloatVectorSerializer {
6666
}
6767

6868
static const TArrayRef<const float> GetArray(const TStringRef& str) {
69-
//skip format header, it was already read
70-
const char* buf = str.Data() + sizeof(ui32);
71-
const size_t len = str.Size() - sizeof(ui32);
69+
const char* buf = str.Data();
70+
const size_t len = str.Size() - HeaderLen;
7271

7372
if (len % sizeof(float) != 0)
7473
return {};
@@ -95,8 +94,8 @@ class TSerializerFacade {
9594
if (str.Size() == 0)
9695
return {};
9796

98-
const ui32* format = reinterpret_cast<const ui32*>(str.Data());
99-
switch (*format) {
97+
const ui8 format = str.Data()[str.Size() - HeaderLen];
98+
switch (format) {
10099
case EFormat::FloatVector:
101100
return TFloatVectorSerializer::Deserialize(valueBuilder, str);
102101
default:
@@ -108,8 +107,8 @@ class TSerializerFacade {
108107
if (str.Size() == 0)
109108
return {};
110109

111-
const ui32* format = reinterpret_cast<const ui32*>(str.Data());
112-
switch (*format) {
110+
const ui8 format = str.Data()[str.Size() - HeaderLen];
111+
switch (format) {
113112
case EFormat::FloatVector:
114113
return TFloatVectorSerializer::GetArray(str);
115114
default:

ydb/library/yql/udfs/common/knn/test/canondata/test.test_LazyListSerialization_/results.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"Data" = [
2121
[
2222
[
23-
"AQAAAAAAgD8AAABAAABAQAAAgEAAAKBA"
23+
"AACAPwAAAEAAAEBAAACAQAAAoEAB"
2424
]
2525
]
2626
]

ydb/library/yql/udfs/common/knn/test/canondata/test.test_ListSerialization_/results.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"Data" = [
2121
[
2222
[
23-
"AQAAAJqZmT8zMxNAmplZQAAAkEAzM7NA"
23+
"mpmZPzMzE0CamVlAAACQQDMzs0AB"
2424
]
2525
]
2626
]

0 commit comments

Comments
 (0)