packer.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <yql/essentials/minikql/computation/mkql_computation_node.h>
  2. #include <yql/essentials/minikql/computation/mkql_computation_node_pack.h>
  3. #include <yql/essentials/minikql/computation/mkql_custom_list.h>
  4. #include <yql/essentials/minikql/comp_nodes/mkql_factories.h>
  5. #include <yql/essentials/minikql/invoke_builtins/mkql_builtins.h>
  6. #include <yql/essentials/minikql/mkql_program_builder.h>
  7. #include <yql/essentials/minikql/mkql_function_registry.h>
  8. #include <util/datetime/cputimer.h>
  9. using namespace NKikimr;
  10. using namespace NKikimr::NMiniKQL;
  11. using namespace NKikimr::NUdf;
  12. static const size_t LIST_SIZE = 5000000ul;
  13. int main(int, char**) {
  14. auto functionRegistry = CreateFunctionRegistry(CreateBuiltinRegistry());
  15. TScopedAlloc alloc(__LOCATION__);
  16. TTypeEnvironment env(alloc);
  17. TMemoryUsageInfo memInfo("bench");
  18. THolderFactory holderFactory(alloc.Ref(), memInfo, functionRegistry.Get());
  19. TProgramBuilder pgmBuilder(env, *functionRegistry);
  20. auto listType = pgmBuilder.NewListType(pgmBuilder.NewTupleType({
  21. pgmBuilder.NewOptionalType(pgmBuilder.NewDataType(EDataSlot::Uint64)),
  22. pgmBuilder.NewDataType(EDataSlot::Uint64)
  23. }));
  24. TUnboxedValueVector listItems;
  25. for (ui64 i = 0; i < LIST_SIZE; ++i) {
  26. TUnboxedValueVector tupleItems;
  27. if (i % 2 == 0) {
  28. tupleItems.emplace_back();
  29. } else {
  30. tupleItems.emplace_back(TUnboxedValuePod(i));
  31. }
  32. tupleItems.emplace_back(TUnboxedValuePod(i));
  33. listItems.emplace_back(holderFactory.VectorAsArray(tupleItems));
  34. }
  35. TUnboxedValue list(holderFactory.VectorAsArray(listItems));
  36. TValuePacker packer(true, listType);
  37. TSimpleTimer timer;
  38. TStringBuf packed = packer.Pack(list);
  39. Cerr << "[pack] Elapsed: " << timer.Get() << "\n";
  40. timer.Reset();
  41. auto unpackedList = packer.Unpack(packed, holderFactory);
  42. Cerr << "[unpack] Elapsed: " << timer.Get() << "\n";
  43. return 0;
  44. }