
Vladislav
20.06.2017
19:48:36

Matway
20.06.2017
19:49:22
А в гцц?
Нет под рукой, к сожалению. Мы используем только MSVC и Clang. Будет время - попробую.
Что интересно, с variant MSVC и Clang собирают одинаковый по производительности код.

Google

Stanislav
20.06.2017
19:49:40

Matway
20.06.2017
19:50:04
Но со switch MSVC ускоряется гораздо сильнее, чем Clang.
В ассебмлере вообще не вижу выборки из switch-таблицы. Похоже, variant компилируется в серию бранчей. Это грустно.

Stanislav
20.06.2017
19:55:37
возможно ли написать вариант который работал бы аналогично быстро?

Vladislav
20.06.2017
19:57:45

Matway
20.06.2017
19:59:03

Vladislav
20.06.2017
20:01:20
23
А чем свитч заменяется? visit(overloaded())?

Matway
20.06.2017
20:01:32
Да.
overload я писал руками, но там вроде нечему портить картину. На всякий случай перепроверил на собранной ручками структуре - те же дела.

Berkus
20.06.2017
20:03:48

Matway
20.06.2017
20:04:02

Google

Matway
20.06.2017
20:04:59
Официально - Clang with Microsoft CodeGen
Майкрософт прикинулся Шлангом...

Vladislav
20.06.2017
20:09:20

Anatoly
20.06.2017
20:09:26
только 32 битный?

Matway
20.06.2017
20:10:42
только 32 битный?
Нет, x64 вполне собирает и работает. Там идея простая - берётся слегка модифицированный Шланг, генерирует LLVM IR. А потом с этим работает Microsoft CodeGen - LLVM Backend от Майкрософта.

Vladislav
20.06.2017
20:10:57
http://c2lang.org/site/introduction/languages.svg

Stanislav
20.06.2017
20:15:04

Vladislav
20.06.2017
20:16:16

Stanislav
20.06.2017
20:16:28

Matway
20.06.2017
20:16:53
https://blogs.msdn.microsoft.com/vcblog/2016/04/06/clangc2-we-need-your-advice/

Stanislav
20.06.2017
20:17:06
с2 это ваще какой то другой язык
у майкрософта C1 - фронтенд, C2 - бэкенд )
соответственно клангом они заменили фронтенд часть, а все остальное осталось от vc

Berkus
20.06.2017
20:19:29
и это разумно
сэкономили на нормальном парсинге плюсов, получили все по стандарту
а бэкенд свой оптимизирующий, все как положено
попробовали бы они сделать так с гцц

Vladislav
20.06.2017
20:20:23

Stanislav
20.06.2017
20:25:17

Google

Matway
20.06.2017
20:27:47
Вот такая красота :(

Stanislav
20.06.2017
20:32:06
мда
даже вдруг стало интересно затестить с ним QVariant :)

Arseny
20.06.2017
20:34:20
В libc++ на каждый аргумент шаблона по уровню наследования в variant.

Alexander
20.06.2017
20:38:01
Catch 1.9.5 Released.
https://github.com/philsquared/Catch/releases/tag/v1.9.5

Berkus
20.06.2017
20:56:49
мкеей

Alex Фэils?︙
20.06.2017
21:17:51

Group Butler [beta]
20.06.2017
21:17:58

Constantine
20.06.2017
21:18:16
вижак же код запускается не из под вижака?
есть известная фишка, что при запуске под вижаком код медленнее работает

Berkus
20.06.2017
21:24:51

Constantine
20.06.2017
21:33:38
и да, а как сделать visitor над variant без линейного перебора, что он хранит?

Andrei
20.06.2017
21:43:06
Через виртуальные функции, но не факт, что это быстрее.

Vladislav
20.06.2017
21:50:10

Andrei
20.06.2017
21:51:03
Ничего не может заинлайниться, промахиваемся мимо кеша инструкций
Вряд ли.

Matway
20.06.2017
21:53:01
Я пишу variant, который насильно будет делать switch.
Подброшу вместо системного и сравню.

/dev
20.06.2017
21:54:57

Google

Vladislav
20.06.2017
21:55:41

reagentoo
20.06.2017
21:57:42

Vladislav
20.06.2017
21:58:05
Я умею только насильную lookup table делать

Matway
20.06.2017
21:58:21
А как, кстати?
Ну, куча шаблонной магии.
Я, например, раньше написал замену std::tuple, которая плотно лежит (как структура).
std::cout << sizeof(std::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 64
std::cout << sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 16
Так что в шаблоны я немножко умею. Попробую чего-нибудь придумать.

Vladislav
20.06.2017
21:59:12
Ну, куча шаблонной магии.
Я, например, раньше написал замену std::tuple, которая плотно лежит (как структура).
std::cout << sizeof(std::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 64
std::cout << sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 16
Так я умею, а вот шаблонно генерить switch - не очень понятно как

reagentoo
20.06.2017
21:59:17

Admin
ERROR: S client not available

Matway
20.06.2017
21:59:35
Конструктор копирования variant сделал через switch. Сейчас думаю, как делать visitor.
Я бы с удовольствием посмотрел чью-нибудь имплементацию. Ну и поделился своей.
Потому что я перед тем как это делать, довольно много искал. Видел, как люди пытались, но решили, что это невозможно в C++11.

reagentoo
20.06.2017
22:02:41

Andrei
20.06.2017
22:03:06
Плотной тупли.

Vladislav
20.06.2017
22:03:19

reagentoo
20.06.2017
22:03:30

Matway
20.06.2017
22:03:48
что это такое?
std::cout « sizeof(std::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 64
std::cout « sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 16

Vladislav
20.06.2017
22:04:10

Andrei
20.06.2017
22:04:12

Google

Matway
20.06.2017
22:05:05
std::cout « sizeof(std::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 64
std::cout « sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 16
Обычная тупля кладёт элементы крайне неоптимально. В вышеупомянутом случае 65% места пропадает зря.

reagentoo
20.06.2017
22:05:07
https://github.com/reagentoo/libcxx/blob/master/include/tuple.h#L670

Vladislav
20.06.2017
22:05:46
std::cout « sizeof(std::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 64
std::cout « sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 16
На всякий случай, size_of(Matway::tuple<char, double>) - тоже 16?
Так, а double - misaligned, получается?

Matway
20.06.2017
22:07:59
Нет, 16. double нужно выровнять.

Vladislav
20.06.2017
22:08:13

Andrei
20.06.2017
22:08:23
Окей.

Matway
20.06.2017
22:08:30
В общем, Matway::tuple имеет всегда ровно такой же размер, как и структура, в которой положили все поля плоско. std::tuple бывает в 16 раз больше.

reagentoo
20.06.2017
22:09:47
а чой-то так плохо
у стандартного

Matway
20.06.2017
22:11:02

reagentoo
20.06.2017
22:11:14
да. не в тему кинул.

Matway
20.06.2017
22:11:21
Она просто умеет превращаться в union.

Vladislav
20.06.2017
22:11:33
В общем, не вижу проблемы так сделать

Matway
20.06.2017
22:11:47
Проблема в том, что C++ не позволяет через вариадик положить поля в одну структуру.
Тупла делается через наследование. И отсюда растут ноги у чудовищного оверхеда.

reagentoo
20.06.2017
22:12:46
а из-за чего тупл больше структуры то?