@ProCxx

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

Что интересно, с variant MSVC и Clang собирают одинаковый по производительности код.

Google
Matway
20.06.2017
19:50:04
Но со switch MSVC ускоряется гораздо сильнее, чем Clang.

кланг который майкрософтский же, да?
Не только. Под другие платформы обычный Шланг. Та же картина.

В ассебмлере вообще не вижу выборки из switch-таблицы. Похоже, variant компилируется в серию бранчей. Это грустно.

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

Matway
20.06.2017
19:59:03
возможно ли написать вариант который работал бы аналогично быстро?
Вероятно, было бы возможно, если бы можно было case генерить вариадиками. Пока что нельзя.

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
Clang/C2. Очень крутая вещь.
Сишечка без заголовков, круто

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

http://c2lang.org/site/introduction/languages.svg
Да они офигели ставить go по уровню абстракции выше плюсов и D (и раста)

Stanislav
20.06.2017
20:15:04
Vladislav
20.06.2017
20:16:16
видимо автор С++ с 1983 года и не видел
Но как, если они форк шланга пилят?

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
https://blogs.msdn.microsoft.com/vcblog/2016/04/06/clangc2-we-need-your-advice/
Хм, впрочем это поделие тоже форк шланга)

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
А чем свитч заменяется? visit(overloaded())?
Это который паттерн посетитель?

Group Butler [beta]
20.06.2017
21:17:58
Constantine
20.06.2017
21:18:16
вижак же код запускается не из под вижака?

есть известная фишка, что при запуске под вижаком код медленнее работает

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

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

Vladislav
20.06.2017
21:50:10
Через виртуальные функции, но не факт, что это быстрее.
Для 20 вариантов - видимо уже быстрее)

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

Вряд ли.

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

Подброшу вместо системного и сравню.

/dev
20.06.2017
21:54:57
Ничего не может заинлайниться, промахиваемся мимо кеша инструкций
Если по контейнеру надо часто бегать и порядок не важен, то отсортировать можно по типу

Google
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

Так что в шаблоны я немножко умею. Попробую чего-нибудь придумать.

reagentoo
20.06.2017
21:59:17
Admin
ERROR: S client not available

Matway
20.06.2017
21:59:35
Конструктор копирования variant сделал через switch. Сейчас думаю, как делать visitor.

Так я умею, а вот шаблонно генерить switch - не очень понятно как
Умеешь плотный тьюпл??? Вообще-то вещь нетривиальная.

Я бы с удовольствием посмотрел чью-нибудь имплементацию. Ну и поделился своей.

Потому что я перед тем как это делать, довольно много искал. Видел, как люди пытались, но решили, что это невозможно в C++11.

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

Vladislav
20.06.2017
22:03:19
Умеешь плотный тьюпл??? Вообще-то вещь нетривиальная.
В теории, на практике не пробовал) там вся сложность - выбрать оптимальный порядок полей, чтобы минимизировать потерю памяти из-за alignment'а, так?

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
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
Так, а 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
https://github.com/reagentoo/libcxx/blob/master/include/tuple.h#L670
Это совсем не то. Она такая же огромная, как и std::tuple.

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
а из-за чего тупл больше структуры то?

Страница 989 из 2477