Igor
А оно тебе как раз
Настолько как раз что снимать не хочется
Arseny
operator+ видимо
Arseny
v3 можно не вычислять целиком.
Matway
а что вы здесь хотите оптимизировать?
Я кинул ссылку на Expression Templates. Это настолько важная вещь, что многие математические тулкиты ставят её во главу угла.
Constantine
я просто хочу понять, какой код в итоге вы хотите увидеть и насколько быстрее он будет работать
Berkus
а что вы здесь хотите оптимизировать?
c expression templates там в итоге будет сразу складывание без промежуточных векторов
Constantine
с точки зрения С++ это не эквивалентный код
Berkus
типа a3 = dynamicFloat() + dynamicFloat() + dynamicFloat();
Berkus
эквивалентный, посмотри на expression templates еще раз
Constantine
нет, не эквивалентный! а если строка 9 вызывает crash (stack overflow)?
Constantine
хотя это шутка, но на самом-то деле суть примерно в этом
Matway
нет, не эквивалентный! а если строка 9 вызывает crash (stack overflow)?
Это уже не с точки зрения плюсов, а с точки зрения рантайма =) Так-то clang вообще free(malloc(...)) оптимизирует нафиг :)
Constantine
и потом, ничего не мешает сделать auto v3 = v0 + v1; v3 += v2;
Constantine
хотя последнее очень неприятно
Berkus
оно примерно так и делает на уровне SIMD - складывает всё кусками
Constantine
емнип совпадение source и destination операции вызывает небольшой ручник процессора
Berkus
для xmm пофигу кажется
Constantine
потом, как я понимаю, на std::vector накладные расходы все на перемещении
Arseny
Циклы в строчке 34 должны свернуться в один.
Я думал о том, что можно вычислять только несколько элементов в v3. Так не умеете?
Constantine
т.е. их просто нет
Constantine
мне неизвестно, что dynamicFloat() не обладает side-effect-ами
Matway
Я думал о том, что можно вычислять только несколько элементов в v3. Так не умеете?
Это простая оптимизация, и это может легко сделать и плюсовый компилятор. Разговор же шёл за оптимизацию, которую он сделать не может.
Matway
мне неизвестно, что dynamicFloat() не обладает side-effect-ами
Да, но тебе известно, что далее результат не используется.
Arseny
мне неизвестно, что dynamicFloat() не обладает side-effect-ами
dynamicFloat() нужно вызвать. А вот сумму можно считать только для нескольких элементов вектора. Заполнять полностью v3 не нужно
Constantine
опять же, я не очень понимаю, почему это работа компилятора
Constantine
практика показывает, что плохой оптимизатор лучше, чем оптимизатор, сгенерировавший неправильный код)
Matway
опять же, я не очень понимаю, почему это работа компилятора
Потому что не надо заставлять пользователя мудрить что-то со строчкой 34, если он на выходе использует только пару значений из вектора. Пользователь должен работать продуктивно. Вбросил код и быстро получил результат.
Constantine
эта оптимизация поломается от любого чиха
Berkus
чего ж она работает во всяких Eigen тогда?
Berkus
дураки писали наверное
Matway
Может и может, но не делает.
Ну, это уж так написали компилятор. Речь о том, что если сейчас какому-нибудь Intel приспичит оптимизировать подсчёт только нужных значений - они это сделают за пару недель. Сделать же автоматическую дедукцию ET будет намного сложнее.
🐙 Antony
Циклы в строчке 34 должны свернуться в один.
Эту оптимизацию ещё просто не сделали в GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80317 (в clang её ещё тоже не сделали, тикет искать лень, он такой же как в GCC)
Matway
"This would require loop fusion, sth we don't do at the moment. For this particular case dependence analysis should even make it possible."
Constantine
короче если подумать, то у компилятора плюсов вся информация есть
Constantine
вопрос в том, что такой код компилятор оптимизирует хуже
Constantine
чем человек
Matway
Ну, формально есть. По факту - такую оптимизацию делать на данном уровне просто очень дорого.
Constantine
совершенно нет
Constantine
компилятору нужны формальные доказательства, что нет side effect
Constantine
человек может выяснить, что там с dynamicFloat, компилятор в любом случае вынужден сделать вызовы
Constantine
в остальном компилятор может построить такое доказательство достаточно легко
Constantine
ему нужно будет перепроверить, что const на самом деле работает как const
Constantine
что копирования памяти просто так делаются
Constantine
в реальности там вместо С-style массива будет стоять С++, еще и вектор в худшем, так что компилятору придется еще проверять что вектора доказанно на один элемент не указывают
Constantine
и все это учитывая тот факт, что человек может просто в хотпафе такое увидеть и переделать за 5 минут
Constantine
короче, меня пока не убедили
Крылатый
Когда есть возможность обойти const.
Крылатый
И компилю ПРИХОДИТСЯ проверять и верить, что его никто не сломает.
Constantine
void f(int & x, int const& y) { x += y; x += y; } void g() { int x = 1; f(x, x); }
Constantine
не говоря о случаях, когда просто нельзя не написать const_cast
Constantine
не говоря о случаях, когда надо писать mutable
Constantine
Когда есть возможность обойти const.
Собственно, я слышал, что оптимизатор просто вообще не может учитывать const
Constantine
как вообще обойти вот этот пример: struct CachedComputingEngine: ComputingEngine { int get() const override { /*суперсложный расчет, который надо кэшировать */ } mutable bool cached = false; mutable int cache; };
Olesya
привет, народ. есть русский текст и английский. надо искать там регулярки. регулярка на вход поступает как string val. текст тоже в string. пробовала icu - не работает с русским текстом - возможно, что-то идёт не так, когда я из string делаю UnicodeString. в общем, кто-нибудь может посоветовать, какими регулярками пользоваться?
Constantine
ну, не считая читов под названием "const не очевиден при нарушении семантики типа" как вообще обойти вот этот пример: struct CachedComputingEngine: ComputingEngine { int get() const override { /*суперсложный расчет, который надо кэшировать */ } std::unique_ptr<std::unique_ptr<int>> container; };
Constantine
я полагаю, что для std::string еще бы кодировку знать и проверить, что она читается как надо
Olesya
ну для тестирования работы я просто насоздавала строк в коде. через string test("что-нибудь);. перевожу в UnicodeString через c_str(). по идее, там не может быть ничего, кроме UTF-8. разработка на Ubuntu.
Constantine
вы точно уверены, что перекодировка не поломана?
Constantine
UnicodeString это UTF-8, UTF-16 или UCS-2?
Constantine
выведите побайтово строчку
Constantine
до и после
Constantine
и я крайне не уверен, что std::string будет в какой-то кодировке юникода
Dr. Friedrich
Я бы попробовал UnicodeString::fromUTF8().
Dr. Friedrich
Конструктор из const char * явно делает ерунду: http://icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#ae436989ec7fc5a488e48f775cbfae711 > Uses the default converter (and thus depends on the ICU conversion code) unless U_CHARSET_IS_UTF8 is set to 1.
Olesya
спасибо, попробую fromUTF8()
Constantine
видимо, в этом вся ваша проблема
Constantine
но я не уверен, что string на самом деле в UTF-8
Dr. Friedrich
но я не уверен, что string на самом деле в UTF-8
std::string это массив char'ов, у него нет кодировки. Если был файл, сохранённый в UTF-8, и он был прочитан в std::string, то там будут байты из файла. Без перекодировок.
Constantine
слишком долго думать, не написали ли мне U+FEFF первым символом и нет ли кода 0 в файле