diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-14 12:13:56 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-06-14 12:13:56 +0300 |
commit | cc2baf0174ac4c2fb565a2bd31c662e8339e894a (patch) | |
tree | a1c540ed4d97df4d1e9ad389d96d0920284dc1e6 | |
parent | ecd2eabdea1586c36d01ae10e24af3d5a0a11d53 (diff) | |
download | ydb-cc2baf0174ac4c2fb565a2bd31c662e8339e894a.tar.gz |
intermediate changes
ref:ad3e40ce3a5041543013ca38b5b55ef688f0d8f7
-rw-r--r-- | build/platform/test_tool/host.ya.make.inc | 20 | ||||
-rw-r--r-- | tools/enum_parser/enum_serialization_runtime/README.md | 24 |
2 files changed, 34 insertions, 10 deletions
diff --git a/build/platform/test_tool/host.ya.make.inc b/build/platform/test_tool/host.ya.make.inc index 6fca1a3a96..243a682814 100644 --- a/build/platform/test_tool/host.ya.make.inc +++ b/build/platform/test_tool/host.ya.make.inc @@ -1,16 +1,16 @@ IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133394941) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133417405) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371849) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369279) ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133393969) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416393) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371250) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369156) ELSEIF (HOST_OS_LINUX AND HOST_ARCH_PPC64LE) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133394370) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416947) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371357) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369226) ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133395543) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133417897) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204372158) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204369350) ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3133393521) - DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3133416003) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:3204371182) + DECLARE_EXTERNAL_RESOURCE(TEST_TOOL3_HOST sbr:3204368989) ENDIF() diff --git a/tools/enum_parser/enum_serialization_runtime/README.md b/tools/enum_parser/enum_serialization_runtime/README.md index 7d2cbae4ce..b8b4dd92cf 100644 --- a/tools/enum_parser/enum_serialization_runtime/README.md +++ b/tools/enum_parser/enum_serialization_runtime/README.md @@ -1,2 +1,26 @@ +# Enum serialization runtime support library + +{% note warning %} + This library should not be used or referred directly. Use `GENERATE_ENUM_SERIALIZATION_WITH_HEADER` and `GENERATE_ENUM_SERIALIZATION` macros instead. + +{% endnote %} + +## Implementation details + +### Code bloat + +Использование шаблонов вида `TVector<EEnum>`, `std::array<EEnum>` или `TMap<EEnum, TStringBuf>`, а также алгоритмов поверх них, приводит к значительному разбуханию коде. Так как компилятор для разных перечислений вынужден генерировать разные специализации, даже если они компилируются в идентичный машинный код. +Можно во многом выиграть если хранить не массив из `EEnum`, а массив из `std::underlying_type_t<EEnum>` (или из `TSelectEnumRepresentationType<EEnum>::TType`). +Ведь различных типов-перечислений намного больше, чем целочисленных типов, на которых они базируются (и тем более больше, чем различных `TSelectEnumRepresentationType::TType`, коих всего четыре). +И когда компилятор встречает вызов `std::lower_bound`, то для двух массивов из двух перечислений `enum A: int {}` и `enum B: int{}` он создаст две специализации, а если использовать целочисленные типы — то только одну. +Всё это позволяет вынести вызовы вроде `std::lower_bound` в универсальные и переиспользуемые функции, принимающие например `(TArrayRef<const int> values, int enumValue)` своими аргументами. +За счёт этого код + 1) быстрее компилируется, + 2) результат получается более компактным, + 3) как следствие, он меньше засоряет во время исполнения кеш инструкций процессора одинаковыми или очень похожими специализациями функций. + + +Преобразование между `enum` и `int` выносится в пользовательский код (в шаблонные `inline` функции), и производится только в момент непосредственного использования (первым действием в семействе функций `ToString`, последним действием в семуйстве функций `FromString`), где оптимизирующий компилятор обычно может заменить их на no-op или на простые операции со значениями в регистрах. +А контейнеры вида `TVector<EEnum>` и `TMap<EEnum, ...>`, которые возвращаются из функций `util/generic/serialized_enum.h`, заменяются на специальные классы `TArrayView` и `TMappedDictView`. Они также поддерживают быстрое и преобразование из перечислений в целочисленные типы и обратно в момент использования, и не требуют создавать специализации для каждого из возможных типов-перечислений. |