Информация об изменениях

Сообщение Re[13]: [performance] чего-то я не понимаю в этой жизни от 02.07.2022 11:34

Изменено 02.07.2022 12:14 rg45

Re[13]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, reversecode, Вы писали:

R>std:from_chars кто нибудь добавит в тестирование ?


Попробовал std:from_chars, получилось примерно то же самое. Даже чуть хуже, потому что переход с wchar_t к char, тоже не совсем бесплатынй. Возможно, я просто не умею это готовить, можешь попробовать сам.

А вот попробовал заменить stoi наивнейшей рукописной реализацией, и получил 700 ms, что примерно в 5 раз быстрее, чем вариант с stoi и почти в два раза быстрее сишарпного варианта

  C++ 740 ms
#include <iostream>
#include <vector>
#include <string>
#include <chrono>

std::vector<std::wstring> MakeIntSequence(int size)
{
   std::vector<std::wstring> v;
   v.reserve(size);
   for (int i = 0; i < size; ++i)
   {
      const int number = (rand() * (RAND_MAX + 1) + rand()) * 2 + 1;
      v.push_back(std::to_wstring(number));
   }
   return v;
}

int ParseInt(const std::wstring& wstr)
{
   int res{};
   for (auto d : wstr)
   {
      res = res * 10 + d - '0';
   }
   return res;
}

int main()
{
   namespace tm = std::chrono;

   const auto vals = MakeIntSequence(0x4000000);

   const auto t0 = tm::steady_clock::now();

   int hash{};
   for (const auto& val : vals)
   {
      hash ^= ParseInt(val);
   }
   const auto dt = tm::duration_cast<tm::milliseconds>(tm::steady_clock::now() - t0);

   std::cout << "Hash = " << hash << std::endl;
   std::cout << "Processing time: " << dt.count() << "ms" << std::endl;
}


Я думаю, что если написать по уму, то можно получить еще более чувствительное ускорение.
Re[13]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, reversecode, Вы писали:

R>std:from_chars кто нибудь добавит в тестирование ?


Попробовал std:from_chars, получилось примерно то же самое. Даже чуть хуже, потому что переход с wchar_t к char, тоже не совсем бесплатынй. Возможно, я просто не умею это готовить, можешь попробовать сам.

А вот попробовал заменить stoi наивнейшей рукописной реализацией, и получил 700 ms, что примерно в 5 раз быстрее, чем вариант с stoi и почти в два раза быстрее сишарпного варианта

  C++ 740 ms
#include <iostream>
#include <vector>
#include <string>
#include <chrono>

std::vector<std::wstring> MakeIntSequence(int size)
{
   std::vector<std::wstring> v;
   v.reserve(size);
   for (int i = 0; i < size; ++i)
   {
      const int number = (rand() * (RAND_MAX + 1) + rand()) * 2 + 1;
      v.push_back(std::to_wstring(number));
   }
   return v;
}

int ParseInt(const std::wstring& wstr)
{
   int res{};
   for (auto d : wstr)
   {
      res = res * 10 + d - '0';
   }
   return res;
}

int main()
{
   namespace tm = std::chrono;

   const auto vals = MakeIntSequence(0x4000000);

   const auto t0 = tm::steady_clock::now();

   int hash{};
   for (const auto& val : vals)
   {
      hash ^= ParseInt(val);
   }
   const auto dt = tm::duration_cast<tm::milliseconds>(tm::steady_clock::now() - t0);

   std::cout << "Hash = " << hash << std::endl;
   std::cout << "Processing time: " << dt.count() << "ms" << std::endl;
}


Я думаю, что если написать по уму, то можно получить еще более чувствительное ускорение.

P.S. Заглянул в майкрософтовскую реализацию std::from_chars. Если в двух словах — это жопа. На какое там быстродействие можно надеяться, я х.з.