alloc.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <util/datetime/cputimer.h>
  2. #include <yql/essentials/public/udf/udf_allocator.h>
  3. #include <yql/essentials/minikql/mkql_alloc.h>
  4. using namespace NKikimr;
  5. using namespace NKikimr::NMiniKQL;
  6. using namespace NKikimr::NUdf;
  7. namespace {
  8. inline void MyFree(const void* p, size_t) { return free(const_cast<void*>(p)); }
  9. template <void*(*Alloc)(ui64), void (*Free)(const void*,ui64)>
  10. void Test(const TString& name) {
  11. TSimpleTimer timer;
  12. for (ui32 i = 0; i < 100000000; ++i) {
  13. std::array<void*, 10> strs;
  14. for (ui32 j = 0; j < strs.size(); ++j) {
  15. void* p = Alloc(32);
  16. *((volatile char*)p) = 0xff;
  17. strs[j] = p;
  18. }
  19. for (ui32 j = 0; j < strs.size(); ++j) {
  20. void* p = strs[j];
  21. Free(p, 32);
  22. }
  23. }
  24. Cerr << "[" << name << "] Elapsed: " << timer.Get() << "\n";
  25. }
  26. }
  27. int main(int, char**) {
  28. Test<&malloc, &MyFree>("malloc");
  29. {
  30. TScopedAlloc sopedAlloc(__LOCATION__);
  31. Test<&UdfAllocateWithSize, &UdfFreeWithSize>("mkql");
  32. }
  33. return 0;
  34. }