Re[39]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 03.07.22 18:11
Оценка:
Здравствуйте, Codealot, Вы писали:

R>>А кто тебе какую аргументацию обещал


C>Ну да, было бы странно ожидать от тебе подобных аргументации.


Тем не менее, ты ждешь чего-то.
--
Re[28]: [performance] чего-то я не понимаю в этой жизни
От: B0FEE664  
Дата: 04.07.22 13:13
Оценка:
Здравствуйте, Marty, Вы писали:

M>JSON какие-то дураки придумали

Согласен. JSON совершенно точно придумали дураки.
И каждый день — без права на ошибку...
Re: [performance] чего-то я не понимаю в этой жизни
От: B0FEE664  
Дата: 04.07.22 15:45
Оценка:
Здравствуйте, Codealot, Вы писали:

C>
C>        auto num = std::stoi(cur);
C>

C>Для тех же данных, код на C++ выполняется за 5.9 секунд и на C# за 1.2 секунды.
C>

Преобразование строки в число? Так это никогда нормально в С++ не работало и не работает.
Хотите быстрого когда — пишите парсинг руками.

Кстати, раз речь про Юникод...
Вот любопытно, скажем цифра '٨' должна конвертироваться в число или нет?
И каждый день — без права на ошибку...
Re[2]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 15:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Преобразование строки в число? Так это никогда нормально в С++ не работало и не работает.

BFE>Хотите быстрого когда — пишите парсинг руками.

Вот здесь
Автор: rg45
Дата: 03.07.22
есть два примера для сравниния — на C++ и на C# — с максимально приближенным кодом и рукописными процедурами парсинга — примитивными, но равноценными. И пример на C++ проигрывает примеру на C# процентов на 10 — 15. Не в пять раз, конечно, но проигрывает! Пока никто не смог даже предположительно объяснить, как такое может быть. Там быстродействие зависит от значений во входной последовательности. Этому вопросу я тоже уже уделил внимание — все примерно равноценно.
--
Re[26]: [performance] чего-то я не понимаю в этой жизни
От: σ  
Дата: 04.07.22 17:35
Оценка:
R>Этот же пример на С++ для сравнения здесь: http://rsdn.org/forum/cpp/8307046.1
Автор: rg45
Дата: 02.07.22


R>Вот такая херь, мальчики и девочки


Платформу, компиляторы, их опции так и не опубликуют?
Re[3]: [performance] чего-то я не понимаю в этой жизни
От: ArtDenis Россия  
Дата: 04.07.22 17:55
Оценка: 7 (1)
Здравствуйте, rg45, Вы писали:

R>Вот здесь
Автор: rg45
Дата: 03.07.22
есть два примера для сравниния — на C++ и на C# — с максимально приближенным кодом и рукописными процедурами парсинга — примитивными, но равноценными. И пример на C++ проигрывает примеру на C# процентов на 10 — 15. Не в пять раз, конечно, но проигрывает! Пока никто не смог даже предположительно объяснить, как такое может быть.


Оптимизатор JIT умеет профилировать и дополнительно оптимизировать налету учитывая особенности исполнения кода. Возможно дело в этом. Чтобы это повторить в плюсах, придётся немного попотеть: https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations ))
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[27]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 18:01
Оценка:
Здравствуйте, σ, Вы писали:

σ>Платформу, компиляторы, их опции так и не опубликуют?


— msvc(cl): 143 toolset, x64, Latest C++ Working Draft (/std:c++latest), Maximum Optimization (Favor Speed) (/O2)
— cs: .NET 6.0, Any CPU, "Release", Target OS: "None"

Достаточно?
--
Re[28]: [performance] чего-то я не понимаю в этой жизни
От: σ  
Дата: 04.07.22 18:04
Оценка:
R>- msvc(cl): 143 toolset, x64, Latest C++ Working Draft (/std:c++latest), Maximum Optimization (Favor Speed) (/O2)

Без `/GS-`?
Re[29]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 18:15
Оценка:
Здравствуйте, σ, Вы писали:

R>>- msvc(cl): 143 toolset, x64, Latest C++ Working Draft (/std:c++latest), Maximum Optimization (Favor Speed) (/O2)


σ>Без `/GS-`?


Было просто /GS, попробовал /GS-, никаких ощутимых изменений не вижу.

Вот полный список опций:

/permissive- /ifcOutput "x64\Release\" /GS- /GL /W4 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc143.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /std:c++latest /FC /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Ot /Fp"x64\Release\ParseIntCpp.pch" /diagnostics:column
--
Re[4]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 18:20
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Оптимизатор JIT умеет профилировать и дополнительно оптимизировать налету учитывая особенности исполнения кода. Возможно дело в этом. Чтобы это повторить в плюсах, придётся немного попотеть: https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations ))


Супер! Ща мы быстренько найдем желающих попотеть... Ау, желающие! Все сюда!
--
Re[4]: [performance] чего-то я не понимаю в этой жизни
От: kov_serg Россия  
Дата: 04.07.22 20:04
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Оптимизатор JIT умеет профилировать и дополнительно оптимизировать налету учитывая особенности исполнения кода. Возможно дело в этом. Чтобы это повторить в плюсах, придётся немного попотеть: https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations ))


Предыдущий раз ошибся на 3 порядка. Но не важно.

Всё очень зависит от того как будут расположены строки в памяти, а не от реализации parseInt.
Если расположить строки последовательно друг за другом с выравниванием на 4 байта получим 2х кратное ускорение (с тем же кодом)
Отредактировано 04.07.2022 21:35 kov_serg . Предыдущая версия . Еще …
Отредактировано 04.07.2022 21:12 kov_serg . Предыдущая версия .
Отредактировано 04.07.2022 20:36 kov_serg . Предыдущая версия .
Отредактировано 04.07.2022 20:28 kov_serg . Предыдущая версия .
Re[3]: [performance] чего-то я не понимаю в этой жизни
От: Videoman Россия https://hts.tv/
Дата: 04.07.22 20:07
Оценка:
Здравствуйте, rg45, Вы писали:

R>Да не в этом сейчас вопрос. Непонятно, каким образом плюсовый вариант может быть в пять раз медленнее шарпного, даже в исходном виде.


А если убрать throw из метода Parse и сделать метод inline, скорость у С++ вырастает ?
Я c C# дела не имел. Я не пойму, нельзя сравнить assembler С# на выходе с выхлопом С++ ?
Re[4]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 20:42
Оценка: 2 (1)
Здравствуйте, Videoman, Вы писали:

V>А если убрать throw из метода Parse и сделать метод inline, скорость у С++ вырастает ?


Такой вариант уже был: http://rsdn.org/forum/cpp/8306833.1
Автор: rg45
Дата: 02.07.22
. Ускорение, конечно, есть, но в C# аналогичная мера приводит к еще большему ускорению. В итоге разрыв увеличивается и получается 600 мс (C#) против 750 мс (C++). Использование inline и __forceinline никакого эффекта не дает, потому что функция инлайнится и без этого. Если встроить цикл парсинга в основной цикл прохода по входной последовательности, результат остается таким же.

V>Я c C# дела не имел. Я не пойму, нельзя сравнить assembler С# на выходе с выхлопом С++ ?


У C# выхлоп не непосредственно в машинные коды, а в промежуточный платформенно-независимый код intermediate language (IL). Во время запуска выполняется докомпиляция IL в машинные коды той платформы, на которой запускается приложение — так называемая процедура just-in-time compilation (JIT) или джиттинг. Джиттинг обеспечивается дотнетовой средой Common Language Runtime (CLR). Таким образом, достигается двухфазная оптимизация. Не знаю даже, имеет ли смысл сравнивать IL с ассемблером.
--
Отредактировано 04.07.2022 20:44 rg45 . Предыдущая версия .
Re[5]: [performance] чего-то я не понимаю в этой жизни
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 04.07.22 20:47
Оценка:
Здравствуйте, rg45, Вы писали:

R>Не знаю даже, имеет ли смысл сравнивать IL с ассемблером.


Почему бы и нет?
Ещё интересно, а они не могут незаметно по ядрам цикл распараллелить? Тут же никаких эффектов нет.
Re[6]: [performance] чего-то я не понимаю в этой жизни
От: rg45 СССР  
Дата: 04.07.22 20:51
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Ещё интересно, а они не могут незаметно по ядрам цикл распараллелить? Тут же никаких эффектов нет.


Была у меня такая мысль... Но это просто фантастика, если это так. Допустим XOR распараллелить — не проблема, но далеко ведь не все вычисления поддаются распараллеливанию.

Еще у меня была мысль, что они могут кэшировать результаты вычислений. Допустим, если какая-то строка встречается повторно, то вместо вычислений, просто берется ранее вычисленный результат. Тут может быть задействовано интернирование строк. Но, по-моему, все это на уровне фантастики.
--
Отредактировано 04.07.2022 20:54 rg45 . Предыдущая версия .
Re[5]: [performance] чего-то я не понимаю в этой жизни
От: σ  
Дата: 04.07.22 21:10
Оценка: 1 (1)
R>У C# выхлоп не непосредственно в машинные коды, а в промежуточный платформенно-независимый код intermediate language (IL).
https://godbolt.org/z/1oanThds6
Re[7]: [performance] чего-то я не понимаю в этой жизни
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 04.07.22 21:13
Оценка:
Здравствуйте, rg45, Вы писали:

R>Еще у меня была мысль, что они могут кэшировать результаты вычислений. Допустим, если какая-то строка встречается повторно, то вместо вычислений, просто берется ранее вычисленный результат. Тут может быть задействовано интернирование строк. Но, по-моему, все это на уровне фантастики.


Согласен. Ещё у Александреску был быстрый вариант на switch без цикла. Но это не для wchar
Re[6]: [performance] чего-то я не понимаю в этой жизни
От: Videoman Россия https://hts.tv/
Дата: 04.07.22 21:28
Оценка: 1 (1)
Здравствуйте, σ, Вы писали:

R>>У C# выхлоп не непосредственно в машинные коды, а в промежуточный платформенно-независимый код intermediate language (IL).

σ>https://godbolt.org/z/1oanThds6

Фига он соптимизировал:
lea eax, [rax+4*rax]
lea eax, [rbx+2*rax-48]

Re[7]: [performance] чего-то я не понимаю в этой жизни
От: σ  
Дата: 04.07.22 21:33
Оценка:
Умножать на 10 через LEA умеют все. https://godbolt.org/z/jKvjjbbM8
Re[8]: [performance] чего-то я не понимаю в этой жизни
От: Videoman Россия https://hts.tv/
Дата: 04.07.22 21:44
Оценка:
Здравствуйте, σ, Вы писали:

σ>Умножать на 10 через LEA умеют все. https://godbolt.org/z/jKvjjbbM8


А причем тут умножение на 10. Он всю строчку: res = res * 10 + d — '0'; в два lea загнал.

P.S. Кстати, почему-то С# инкрементит на единицу, как-будто у него строка из char-ов состоит, а С++ на 2-ку. Если в С++ заменить std::wstring на std::string и компилировать gcc, то код идентичный C# получается
Отредактировано 04.07.2022 21:59 Videoman . Предыдущая версия . Еще …
Отредактировано 04.07.2022 21:56 Videoman . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.