mt_param.cpp 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <util/datetime/cputimer.h>
  2. #include <yql/essentials/minikql/computation/mkql_computation_node.h>
  3. #include <yql/essentials/minikql/comp_nodes/mkql_factories.h>
  4. #include <yql/essentials/minikql/invoke_builtins/mkql_builtins.h>
  5. #include <yql/essentials/minikql/mkql_program_builder.h>
  6. #include <yql/essentials/minikql/mkql_function_registry.h>
  7. #include <yql/essentials/minikql/mkql_string_util.h>
  8. #include <util/datetime/cputimer.h>
  9. #include <util/system/thread.h>
  10. using namespace NKikimr;
  11. using namespace NKikimr::NMiniKQL;
  12. using namespace NKikimr::NUdf;
  13. const ui32 threadsCount = 10;
  14. const TString prefix = "VERRRRRRRRY LONG STRING";
  15. int main(int, char**) {
  16. auto functionRegistry = CreateFunctionRegistry(CreateBuiltinRegistry());
  17. auto randomProvider = CreateDefaultRandomProvider();
  18. auto timeProvider = CreateDefaultTimeProvider();
  19. TScopedAlloc alloc(__LOCATION__);
  20. TTypeEnvironment env(alloc);
  21. TProgramBuilder pgmBuilder(env, *functionRegistry);
  22. auto argType = pgmBuilder.NewDataType(EDataSlot::String);
  23. auto arg = pgmBuilder.Arg(argType);
  24. auto prefixNode = pgmBuilder.NewDataLiteral<NUdf::EDataSlot::String>(prefix);
  25. auto concat = pgmBuilder.Concat(prefixNode, arg);
  26. auto pgm = pgmBuilder.NewList(argType, { prefixNode, prefixNode, concat, concat });
  27. TExploringNodeVisitor explorer;
  28. explorer.Walk(pgm.GetNode(), env);
  29. TComputationPatternOpts opts(alloc.Ref(), env, GetBuiltinFactory(),
  30. functionRegistry.Get(), NUdf::EValidateMode::None, NUdf::EValidatePolicy::Exception, "OFF", EGraphPerProcess::Multi);
  31. auto pattern = MakeComputationPattern(explorer, pgm, { arg.GetNode(), pgm.GetNode() }, opts);
  32. TSimpleTimer timer;
  33. TVector<THolder<TThread>> threads;
  34. for (ui32 i = 0; i < threadsCount; ++i) {
  35. threads.emplace_back(MakeHolder<TThread>([pattern, opts, randomProvider, timeProvider]() {
  36. ui32 iters = 1000000;
  37. #if defined(_tsan_enabled_)
  38. iters /= 100;
  39. #endif
  40. for (ui32 i = 0; i < iters; ++i) {
  41. TScopedAlloc runAlloc(__LOCATION__);
  42. auto graph = pattern->Clone(opts.ToComputationOptions(*randomProvider, *timeProvider, &runAlloc.Ref()));
  43. TBindTerminator terminator(graph->GetTerminator());
  44. auto param = graph->GetEntryPoint(0, false);
  45. auto& ctx = graph->GetContext();
  46. TString s = ToString(i);
  47. param->SetValue(ctx, MakeString(s));
  48. auto resVal = graph->GetValue();
  49. auto val0 = resVal.GetElement(0);
  50. Y_ABORT_UNLESS(TStringBuf(val0.AsStringRef()) == prefix);
  51. Y_ABORT_UNLESS(val0.AsStringValue().RefCount() < 0);
  52. auto val1 = resVal.GetElement(1);
  53. Y_ABORT_UNLESS(TStringBuf(val1.AsStringRef()) == prefix);
  54. Y_ABORT_UNLESS(val1.AsStringValue().RefCount() < 0);
  55. auto val2 = resVal.GetElement(2);
  56. Y_ABORT_UNLESS(TStringBuf(val2.AsStringRef()) == prefix + s);
  57. Y_ABORT_UNLESS(val2.AsStringValue().RefCount() > 0);
  58. auto val3 = resVal.GetElement(3);
  59. Y_ABORT_UNLESS(TStringBuf(val3.AsStringRef()) == prefix + s);
  60. Y_ABORT_UNLESS(val3.AsStringValue().RefCount() > 0);
  61. }
  62. }));
  63. }
  64. for (ui32 i = 0; i < threadsCount; ++i) {
  65. threads[i]->Start();
  66. }
  67. for (ui32 i = 0; i < threadsCount; ++i) {
  68. threads[i]->Join();
  69. }
  70. Cerr << "Elapsed: " << timer.Get() << "\n";
  71. return 0;
  72. }