Ioann_
очевидно, что видимо код на гцц и шланге - как бы, не работает верно, мне так кажется
Aidar
Внутрь icc
Ioann_
Ioann_
это лучше чем у всех остальных
Aidar
Да ты gcc проиграл смерись
Ioann_
Я посмотрю эту проблему, но это точно не скоро
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
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
В таком случае не нужно почти никогда отписываться
Constantine
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
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?
Berkus
Andrei
Крылатый
Задавай сразу вопросы)
Andrei
итак, у меня есть система с сопроцессором XeonPhi
Andrei
когда я пытаюсь что скомпилировать -mmic, получаю ошибку вида:
icc: command line remark #10148: option '-mmic' not supported
Andrei
вроде бы всё делал по инструкции (вот по этой: https://software.intel.com/en-us/node/522798)
Andrei
в чём может быть загвоздка?
Berkus
Berkus
Berkus
Nikita
Berkus
похоже на правду д
Berkus
оукей, но все же собери clang с polly и проверь еще раз!
Berkus
а какие ты сборки брал и откуда?
Berkus
офиц сборка?