Здравствуйте, Codealot, Вы писали:
C>Какой полет фантазии. Явно, у тебя какие-то комплексы на эту тему.
У меня профдеформация. Консалтинг по распутыванию специфических факапов много лет, поэтому есть некоторое имя в индустрии. Так вот, редкий день проходит без писем в стиле "ааа, я скачал с гитхаба проект, а оно там все не работает! срочно нужна помощь! Денег нет, сроки горят, ну что тебе сложно?".
Я пытался по молодости помогать из доброты душевной, практически в 100% случаев с описанным выше результатом — чем больше помогаешь, тем больше все не работает и все вокруг виноваты. А как перестаешь отвечать — вообще во врага народа превращаешься. А у корпоративных клиентов, платящих за каждый чих, все наоборот. Покажешь один раз, потом через год видишь, как они это довели до ума, отполировали и развили идею.
Если хочешь, можешь считать это комплексом. Этот аккаунт создан исключительно для трындежа и выпускания пара, поэтому все написанное им стоит воспринимать с хорошей долей лимона и рюмкой виски.
Re[12]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, Quebecois, Вы писали:
Q>есть некоторое имя в индустрии.
Куда деваться.
Q>Если хочешь, можешь считать это комплексом. Этот аккаунт создан исключительно для трындежа и выпускания пара, поэтому все написанное им стоит воспринимать с хорошей долей лимона и рюмкой виски.
Похоже, рюмкой там дело не ограничилось.
Ад пуст, все бесы здесь.
Re[21]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, Codealot, Вы писали:
C>Настроение всю неделю, хоть волком вой.
Понимаю и сочувствую. А что мешает извиниться?
C>Ты бы поосторожнее с такими угрозами. Никогда не знаешь, чем это может закончиться для тебя.
Фигасе, ты наглый. Ты бы за языком лучше следил, вместо того чтоб советы давать. Потому что для тебя это точно добром не закончится, если будешь себя так в жизни вести.
Здравствуйте, reversecode, Вы писали: R>std:from_chars кто нибудь добавит в тестирование ?
Попробовал std:from_chars, получилось примерно то же самое. Даже чуть хуже, потому что переход с wchar_t к char, тоже не совсем бесплатынй. Возможно, я просто не умею это готовить, можешь попробовать сам.
А вот попробовал заменить stoi наивнейшей самописной реализацией, и получил ~700 ms, что примерно в 5 раз быстрее, чем вариант с stoi и почти в два раза быстрее сишарпного(6.0) варианта
C++ 740 ms
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <random>
std::vector<std::wstring> MakeIntSequence(int size)
{
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(0, std::numeric_limits<int>::max());
std::vector<std::wstring> v;
v.reserve(size);
for (int i = 0; i < size; ++i)
{
v.push_back(std::to_wstring(distrib(gen)));
}
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 = " << std::hex << hash << std::endl;
std::cout << "Processing time: " << std::dec << dt.count() << "ms" << std::endl;
}
Я думаю, что если написать по уму, то можно получить еще более чувствительное ускорение.
P.S. Заглянул в майкрософтовскую реализацию std::from_chars. Если в двух словах — это жопа. На какое там быстродействие можно надеяться, я х.з.
Здравствуйте, Codealot, Вы писали:
R>>Ну, что, скажу прямо, я удивлен. Нужно будет поиграться с плюсовым кодом, побробовать что-то вместо stoi. Насколько можно этот код ускорить.
C>Вот и я удивляюсь.
σ>> > In other cases, if any character requires more than 8-bits to represent it, all the characters are stored using two bytes for each — UTF-16 representation. σ>> К концу десятилетия (следующего), возможно (правда, я сомневаюсь), догадаются, что можно хранить в байте те символы, которым этого хватает, даже если есть символы, которым байта не хватает. Последние можно хранить больше, чем в одном байте. ·> А ещё можно и сразу bzip-ом паковать и в блокчейн записывать.
Ничего себе задымление всего-то от намёка на UTF-8…
Re[14]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, σ, Вы писали:
σ> σ>> К концу десятилетия (следующего), возможно (правда, я сомневаюсь), догадаются, что можно хранить в байте те символы, которым этого хватает, даже если есть символы, которым байта не хватает. Последние можно хранить больше, чем в одном байте.
σ> ·> А ещё можно и сразу bzip-ом паковать и в блокчейн записывать.
σ> Ничего себе задымление всего-то от намёка на UTF-8…
Здравствуйте, rudzuk, Вы писали:
R>Какая то у тебя наивная ParseInt. А недопустимые символы, а знаки?
А я разве где-то предлагал прямо в таком виде включить это в продакшен? Это всего лишь примитивный пруф-оф-концепт, использованный для оценнки возможностей оптимизации производительности.
Разумеется, для продакшен утилиты потребуется обработка ошибок, что повлечет определенные накладные расходы. В то же время, здесь не все еще использованы возможности по оптимизации, например, можно обрабатывать не поразрядно, а сразу сотнями или даже тысячами. Для этого можно использовать таблицы вместо арифметики. Кстати майкрософтовская реализация std::from_chars и использует таблицы, только быстродействие по-прежнему унылое, почему-то.
Здравствуйте, Codealot, Вы писали:
R>>На тот случай, если ты опять захочешь включить моя-твоя-не-понимать, расшифрую: один пример мой (можешь взять любой из...), а второй тот, который, по твоим словам, сливает сишарпному в пять раз.
C>Именно твой. Тот, который исполняется ~3.5 секунды против 1.2 для C#.
Я не пойму, ты правда такой или прикидываешься? Речь о двух С++ примерах — один мой, второй твой — тот, который в пять раз медленнее, который упоминался в стартовом сообщении. Этого примера так никто и не видел до сих пор. Как, интересно, ты понял высказывание
Здравствуйте, rg45, Вы писали:
r> R>Какая то у тебя наивная ParseInt. А недопустимые символы, а знаки?
r> А я разве где-то предлагал прямо в таком виде включить это в продакшен? Это всего лишь примитивный пруф-оф-концепт, использованный для оценнки возможностей оптимизации производительности.
Если уж бенчишь, то делать нужно как в продакшен, а то не тест, а читерство какое-то.
Здравствуйте, rudzuk, Вы писали:
R>Если уж бенчишь, то делать нужно как в продакшен, а то не тест, а читерство какое-то.
Я это делал в большей мере для себя, а не для того, чтоб кому-то, что-то доказать. Мне этой грубой оценки хватило, чтоб получить представление. Хотите точнее — берите и делайте.
--
Re[17]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, rudzuk, Вы писали:
R>Если уж бенчишь, то делать нужно как в продакшен, а то не тест, а читерство какое-то.
И кстати, стратегии обработки ошибок тоже могут быть разные. Один из возможных подходов — отсутствие обработки ошибок. В этом случае просто описываются прекондишены, которые обязан обеспечить программист, в противном случае — behavior is undefined и досвидос. В стандартной библиотеке навалом таких функций — тот же memcpy, например.
Здравствуйте, rg45, Вы писали:
r> R>Если уж бенчишь, то делать нужно как в продакшен, а то не тест, а читерство какое-то.
r> Я это делал в большей мере для себя, а не для того, чтоб кому-то, что-то доказать. Мне этой грубой оценки хватило, чтоб получить представление. Хотите точнее — берите и делайте.
Ты принес на форум, заявив, что оно в два раза быстрее шарпа
Здравствуйте, rudzuk, Вы писали:
R>Адски неудобная кодировка для обработки строк.
Адски удобная кодировка. Самая удобная из всех. Вдвойне более компактная и удобная при сериализации данных. Никаких тебе big-endian/little-endian. В UTF-8 codepoints от 1-4 байт, в UTF-16 codepoints от 2-х до 4 байт, чем она удобнее ?
Re[19]: [performance] чего-то я не понимаю в этой жизни
Здравствуйте, Videoman, Вы писали:
V> R>Адски неудобная кодировка для обработки строк.
V> Адски удобная кодировка. Самая удобная из всех. Вдвойне более компактная и удобная при сериализации данных. Никаких тебе big-endian/little-endian. В UTF-8 codepoints от 1-4 байт, в UTF-16 codepoints от 2-х до 4 байт, чем она удобнее ?
Для сериализации удобная, базара нет. Для обработки строк неудобная.
1. Итерация символов требует несколько проверок последовательностей (4), вместо единственной в UTF-16;
2. Все что за пределами ascii кодируется, либо тем же количеством байт, что и в UTF-16, либо большим.
3. В UTF-16 почти все что нужно лежит в пределах BMP (т.е. суррогатная пара не требуется), а значит такие строки могут иметь индексный доступ.