Ioann_
очевидно, что видимо код на гцц и шланге - как бы, не работает верно, мне так кажется
Aidar
Внутрь icc
Ioann_
это лучше чем у всех остальных
Aidar
Да ты gcc проиграл смерись
Ioann_
Я посмотрю эту проблему, но это точно не скоро
Ioann_
Да ты gcc проиграл смерись
посмотрим, просто я ка видел у gcc интрисны через builtin идут
Aidar
Выровни свои данные и обгони gcc
Ioann_
а у меня то код вижловый
Ioann_
пфф, как раз плюнуть
Aidar
Ну твой код на gcc примерно как на вижаке работает же
Aidar
Векторный
Ioann_
Та я хз как он там работает, я еще сам прогоню и посмотрю, тут вообще хуйня, надо получше посидеть, написать
Ioann_
но лоулевелщики ни капельки не соснули :D
Ioann_
Вот сам смотри, я на вижаке собираю под Win - а налогов нету
Ioann_
и в 4 раза win
Ioann_
а оставил бы как есть, и точно бы соснул
Ioann_
просто, 4 раза как с куста
Ioann_
Я новый тест сейчас напишу, ну или начну писать и именно эту версию кину и в чат и Сане - там точно все по максимуму будет, ну и попробую на гцц посмотреть как оно
Ioann_
Блин, вообще за целый день по проекту нихрена не сделал, капец - пару сотен строк только накидал, и те говно. Весь день в телеграмме тушу
Anatoly
Завершился митап https://www.meetup.com/St-Petersburg-CPP-User-Group/events/243451783/ , на котором Arno Schödl презентовал концепты Border и Element ( https://www.think-cell.com/en/career/talks/iterators/ ), реализацию которых можно посмотреть в библиотеке https://github.com/think-cell/range
Anton
Йоу, чуваки, го затестим телеграм
Anton
Интересно, что будет если все life location кинут
Anton
Или тупо?
Vladislav
можно, но не сюда плиз
Anton
Окей, я надеялся на большой чат 😊
Vladislav
можешь в питоночате спросить, там в 2 раза больше людей и перманентная флудилка)
Anton
Спасибо, попробую)
Nikita
DebugDiag, но его эвристики не все пути аллокаций перехватывает (в отличие от Visual Studio Diagnostics Tools, но это не тот сценарий)
Спасибо, я ей пользовался в основном чтобы дампы по конкретным исключениям делать, поищу как аллокации ловить. В этой конкретно ситуации вернулся к umdh, так как студийный профайлер мне почему то с ошибками сессии профайлера стал сохранять на десятке так и не разобрался почему
Nikita
Codexl отказался аттачиться к процессу со смешанным кодом net и native кстати как и Dr. Memory
Nikita
Но все равно спасибо)
Nikita
Мою так просто не запустишь, там всякие сервисы и прочее, только аттач в общем)
Nikita
Да, мой косяк)
Anonymous
а запустить 30 раз и взять среднее?)
Constantine
@antoshkka написал вам еще один пример, чуть более из практической области, интересно сравнить с сигнал-слотовыми способами //localization.h reactive_value<string> operator ""_ls(size_t, const char *); //возвращает строку в текущей локализации по идентификатору; оповещение, например, перезагрузкой локализации //assets_metric.h reactive_value<int_metric_type> operator ""_metric_int_dpi_aware(size_t, const char *); //возвращает dpi-зависимую метрику по идентификатору; оповещение, например, перезагрузкой таблицы метрик reactive_value<int> metric_with_dpi(reactive_value<int_metric_type> metric, reactive_value<int> dpi); //возвращает метрику для данного значения dpi //state_instant_logger.h template <typename T> reactive_value<string> make_logger_format(reactive_value<string> name, reactive_value<T> value) { return "logger:before"_ls + std::move(name) + "logger:inner"_ls + reactive::make(boost::lexical_cast<string, T>, std::move(value)) + "logger:after"_ls; //сумма для reactive_value определена универсально через std::plus } struct state_instant_logger { //наш старый знакомый с выводом explicit state_instant_logger(reactive_value<string> value) : value_(std::move(value)) { value_->reset_callback([this](){ on_changed(); }); on_changed(); }; protected: reactive_value<string> value_; void on_changed() { std::cout << value_->get(); << std::endl; } }; //some_dialog struct some_dialog { some_dialog() : system_dpi_(96), dpi_(create(system_dpi_)) { } reactive_value<int> create_dpi_value() { return create(dpi_); } void dpi_to_constant(int constant) { //debug: отладочные переключения if (constant == 0) dpi_.reset(create(system_dpi_)); else dpi_.reset(reactive::from_constant(constant)); } void do_create() { logger_metric_ptr_ = std::make_unique<state_instant_logger>( //будет выдавать на поток вывода при каждом изменении форматированную в текущей локализации строку со значением метрики из таблицы при текущем значении dpi диалога make_logger_format("testmetric"_ls, metric_with_dpi("testmetric", create_dpi_value())); ); } void do_destroy() { logger_metric_ptr_ = nullptr; } protected: reactive_source<int> system_dpi_; reactive_proto_factory<int> dpi_; std::unique_ptr<state_instant_logger> logger_metric_ptr_; };
Vladislav
вжух
Anatoly
@antoshkka написал вам еще один пример, чуть более из практической области, интересно сравнить с сигнал-слотовыми способами //localization.h reactive_value<string> operator ""_ls(size_t, const char *); //возвращает строку в текущей локализации по идентификатору; оповещение, например, перезагрузкой локализации //assets_metric.h reactive_value<int_metric_type> operator ""_metric_int_dpi_aware(size_t, const char *); //возвращает dpi-зависимую метрику по идентификатору; оповещение, например, перезагрузкой таблицы метрик reactive_value<int> metric_with_dpi(reactive_value<int_metric_type> metric, reactive_value<int> dpi); //возвращает метрику для данного значения dpi //state_instant_logger.h template <typename T> reactive_value<string> make_logger_format(reactive_value<string> name, reactive_value<T> value) { return "logger:before"_ls + std::move(name) + "logger:inner"_ls + reactive::make(boost::lexical_cast<string, T>, std::move(value)) + "logger:after"_ls; //сумма для reactive_value определена универсально через std::plus } struct state_instant_logger { //наш старый знакомый с выводом explicit state_instant_logger(reactive_value<string> value) : value_(std::move(value)) { value_->reset_callback([this](){ on_changed(); }); on_changed(); }; protected: reactive_value<string> value_; void on_changed() { std::cout << value_->get(); << std::endl; } }; //some_dialog struct some_dialog { some_dialog() : system_dpi_(96), dpi_(create(system_dpi_)) { } reactive_value<int> create_dpi_value() { return create(dpi_); } void dpi_to_constant(int constant) { //debug: отладочные переключения if (constant == 0) dpi_.reset(create(system_dpi_)); else dpi_.reset(reactive::from_constant(constant)); } void do_create() { logger_metric_ptr_ = std::make_unique<state_instant_logger>( //будет выдавать на поток вывода при каждом изменении форматированную в текущей локализации строку со значением метрики из таблицы при текущем значении dpi диалога make_logger_format("testmetric"_ls, metric_with_dpi("testmetric", create_dpi_value())); ); } void do_destroy() { logger_metric_ptr_ = nullptr; } protected: reactive_source<int> system_dpi_; reactive_proto_factory<int> dpi_; std::unique_ptr<state_instant_logger> logger_metric_ptr_; };
Набросал эскиз как это могло бы выглядеть на базе rxcpp https://pastebin.com/1cmyyiiQ
Constantine
Набросал эскиз как это могло бы выглядеть на базе rxcpp https://pastebin.com/1cmyyiiQ
Я лично был очень рад идее делать не CopyConstructible reactive_value, хранящий внутри себя единственный std::function<void()> оповещения
Constantine
В таком случае не нужно почти никогда отписываться
Anatoly
В таком случае не нужно почти никогда отписываться
к сожалению, я не отразил этот момент, но rxcpp при подписке возвращает объект subscription, который и следует использовать для отписки в случае уничтожения наблюдателя
Constantine
подразумевается, что производится буквальная замена функций без side effect, принимающих значение, на конструктор reactive::make, работающий через хранение tuple и реализацией get по принципу std::apply
Constantine
с последующими конструкциями вроде template <typename T1, typename T2> auto operator + (reactive_value<T1> v1, reactive_value<T2> v2) { return reactive::make(std::plus<>(), std::move(v1), std::move(v2)); }
Constantine
при этом случай, когда необходимо в некотором смысле копировать объект, решается через proto_factory и shared_proto_factory, который принимает reactive_value и возвращает значения, проброшенные на него
Constantine
кроме того, используется следующая формулировка (в точности) по поводу оповещения: гарантируется, что оповещение будет вызвано между двумя вызовами get(), которые вернут семантически разные значения
Constantine
Последнее приводит к спецэффектам (что характерно, и к возможности использовать местное UB). Основной спецэффект например, в том, что поскольку && не читает правое значение, если левое false, то оно в какой-то момент может перестать дергать оповещения
Constantine
Собственно, это произойдет после того, как в ответ на первое такое оповещение правое значение не будет прочитано
Anatoly
я пока не соображу, почему такая строгость в отношении reactive_value, ведь reactive_value всего лишь держит разделяемый указатель, что не вызывает проблем: auto neg_a_plus_b = reactive_value::make([](auto a) {return -a; }, a_plus_b); neg_a_plus_b.get_observable().subscribe([](int i) { std::cout << i << std::endl; }); auto copy_neg_a_plus_b = neg_a_plus_b; copy_neg_a_plus_b.get_observable().subscribe([](int i) { std::cout << i << std::endl; }); a.set_value(200); b.set_value(100);
Constantine
потому что subscribe может делать bind на this
Anatoly
в моем эскизе это безопасно: struct reactive_value_unary_func : reactive_value_base { reactive_value_unary_func(std::function<value_type(value_type)> func, reactive_value arg1) : func_(std::move(func)), arg1_(std::move(arg1)) { auto notify = [this](value_type) { get_subscriber().on_next(get_value()); }; поскольку reactive_value_base не Copyable
Anatoly
я прошу прощения, вставать через пять часов, так что сейчас вынужден прерваться
Constantine
представьте, что условный StaticWindow получает условный reactive_value<color_type> цвет
Anatoly
получая subcription для отписки, который хранит до конца жизни
Constantine
получается, что вы постоянно храните пару reactive_value и subscription
Constantine
и постоянно дропаете её в один и тот же момент
Anatoly
я подумаю, спасибо!
Constantine
представьте, что у него грязный рендерер и чтение оповещения примерно такое struct StaticWindow { void invalidate(); //ставит перерисовку в очередь обработки сообщений, окно создается в invalid-состоянии, вызывать можно между on_create и on_destroy void init_color(reactive_value<color_type> color_value) { color_value_ = std::move(color_value); } void on_create() { color_value_->subscribe([this](){on_color_changed();}); //храним? } void on_destroy() { //unsubscribe? color_value_ = nullptr; //отпускаем, вдруг там счетчики ссылок и какая-то строгость } void on_color_changed() { invalidate(); } void draw() { auto color = color_value_->get(); //использовать цвет color } protected: reactive_value<color_type> color_value_; };
Constantine
при этом shared_proto_factory использует reset_inner/swap_inner для реализации динамики reactive programming reactive_value<T> make_switch(reactive_value<size_t> index, std::vector<reactive<T>> cases) { //cases не пуст; опции: используется cases[0] или исключение в случае, если значение index не в [0; cases.size()) //слушаем index, храним без прослушивания cases //используем shared_proto_factory //при модификации index обмениваем соответствующее значение из cases на значение, лежащее в shared_proto_factory }
Ioann_
Сложно понять откуда такая разница, а код сам по себе каков ? Если так себе, то может и есть место оптимизациям :?
Ioann_
В общем не очень понятно от куда такая разница при одних тестах, и другая при других. Рей трейсер то поди тоже на kd tree писан.
Ioann_
Может как раз дело в том что я изначально код пытался максимально соптимизировать :?
Constantine
при этом shared_proto_factory использует reset_inner/swap_inner для реализации динамики reactive programming reactive_value<T> make_switch(reactive_value<size_t> index, std::vector<reactive<T>> cases) { //cases не пуст; опции: используется cases[0] или исключение в случае, если значение index не в [0; cases.size()) //слушаем index, храним без прослушивания cases //используем shared_proto_factory //при модификации index обмениваем соответствующее значение из cases на значение, лежащее в shared_proto_factory }
Ах да, еще одна фигня, из-за которой *proto_factory обязательные. Дело в том, что реализация должна ронять дебаг (кажется, защищаться от этого очень дорого), если unsubscribe происходит при вызове оповещения. В таких конструкциях (возникают, например, в списках: их размер может меняться, при этом каждый элемент идет на отрисовку) выставляется развилка через proto_factory_1, с первого значения снимается параметр, который используется для "грязного" формирования условного vector<list_nth_renderer>, использующего proto_factory_2, сделанное со снятого вторым значения из proto_factory_1
Andrei
Всем привет! Кто-нибудь имел дело с интеловским компилятором icc?
Andrei
а вопрос будет или просто так попиздеть?
вопрос будет вполне конкретный
Крылатый
Задавай сразу вопросы)
Andrei
итак, у меня есть система с сопроцессором XeonPhi
Andrei
когда я пытаюсь что скомпилировать -mmic, получаю ошибку вида: icc: command line remark #10148: option '-mmic' not supported
Andrei
вроде бы всё делал по инструкции (вот по этой: https://software.intel.com/en-us/node/522798)
Andrei
в чём может быть загвоздка?
Nikita
итак, у меня есть система с сопроцессором XeonPhi
@isenbaev ты хотел знать, кто вживую с XeonPhi дело имеет
Berkus
похоже на правду д
Berkus
оукей, но все же собери clang с polly и проверь еще раз!
Berkus
а какие ты сборки брал и откуда?
Berkus
офиц сборка?