?

Log in

No account? Create an account

Previous Entry | Next Entry

Бнопня по C++

Засада. Как вы думаете, какая C++ (11) функция может быть быстрее при достаточно развесистом классе Foo?

size_t DirectSize(Foo && foo) {
    auto v = std::vector{std::move(foo)};
    return v.size();
}


size_t IndirectSize(Foo && foo) {
    auto v = construct_vector(std::move(foo));
    return v.size();
}


при условии, что construct_vector() — это функция, определённая в другом модуле?

Poll #2054853 Быстрота, милота

Какая функция может быть быстрее?

DirectSize
9(40.9%)
IndirectSize
13(59.1%)


Вопрос специально сформулирован несколько расплывчато. Хочу мнений!

Comments

( 77 comments — Leave a comment )
levgem
Oct. 1st, 2016 12:02 pm (UTC)
Блин, Лев, страшно то как. Два амперсанда, auto. Это же просто перл!
lionet
Oct. 1st, 2016 12:14 pm (UTC)
Люди старались!
(no subject) - levgem - Oct. 1st, 2016 12:31 pm (UTC) - Expand
(no subject) - lionet - Oct. 1st, 2016 01:09 pm (UTC) - Expand
rustler2000
Oct. 1st, 2016 12:07 pm (UTC)
увидеть Париж и умереть - вернуть размер и удалить :S
Вторую можно сделать быстрее
lionet
Oct. 1st, 2016 12:14 pm (UTC)
Йеп. Причём, раза в два так быстрее.
(no subject) - zhtw - Oct. 1st, 2016 02:08 pm (UTC) - Expand
(no subject) - rustler2000 - Oct. 1st, 2016 03:12 pm (UTC) - Expand
kurilka
Oct. 1st, 2016 12:30 pm (UTC)
а что такое "бнопня"?
maxim
Oct. 1st, 2016 12:53 pm (UTC)
оПХБЕР, бНОПНЯ это типа отсыл к легаси, KOI-8, C++, UNIX :-)
lionet
Oct. 1st, 2016 01:09 pm (UTC)
mpd
Oct. 1st, 2016 02:55 pm (UTC)
Re: Бнопня по C++
Извини за off-topic, но - почему Си++?!
nponeccop
Oct. 1st, 2016 07:24 pm (UTC)
Re: Бнопня по C++
Это же язык из топ пятёрки, а не какой-нибудь Felix. Значит, так надо.
Re: Бнопня по C++ - mpd - Oct. 1st, 2016 08:06 pm (UTC) - Expand
Re: Бнопня по C++ - nponeccop - Oct. 1st, 2016 09:21 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 1st, 2016 09:53 pm (UTC) - Expand
Re: Бнопня по C++ - nponeccop - Oct. 1st, 2016 10:14 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 2nd, 2016 09:34 am (UTC) - Expand
RE: Re: Бнопня по C++ - justy_tylor - Oct. 1st, 2016 11:43 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 2nd, 2016 09:58 am (UTC) - Expand
Re: Бнопня по C++ - nponeccop - Oct. 2nd, 2016 04:03 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 2nd, 2016 05:58 pm (UTC) - Expand
Re: Бнопня по C++ - nponeccop - Oct. 2nd, 2016 07:06 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 2nd, 2016 07:35 pm (UTC) - Expand
(no subject) - binf - Oct. 3rd, 2016 06:10 am (UTC) - Expand
Re: Бнопня по C++ - alll - Oct. 3rd, 2016 06:47 am (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 03:23 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 04:14 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 05:57 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 06:19 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 06:47 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 3rd, 2016 03:17 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 04:07 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 01:00 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 02:44 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 03:21 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 04:59 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 06:42 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 07:07 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 10:33 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 10:52 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 5th, 2016 10:48 am (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 5th, 2016 11:51 am (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 5th, 2016 11:57 am (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 5th, 2016 12:37 pm (UTC) - Expand
Re: Бнопня по C++ - rdia - Oct. 5th, 2016 04:17 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 5th, 2016 04:39 pm (UTC) - Expand
Re: Бнопня по C++ - rdia - Oct. 5th, 2016 04:54 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 5th, 2016 06:38 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 26th, 2016 05:42 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 26th, 2016 07:38 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 26th, 2016 11:19 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 27th, 2016 07:40 am (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 27th, 2016 02:36 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 27th, 2016 02:54 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 03:12 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 04:23 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 06:38 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 07:58 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 11:25 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 11:50 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 08:46 am (UTC) - Expand
(no subject) - anonim_legion - Oct. 4th, 2016 03:14 pm (UTC) - Expand
Re: Re: Бнопня по C++ - thesz - Oct. 3rd, 2016 03:09 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 3rd, 2016 04:02 pm (UTC) - Expand
Re: Бнопня по C++ - zyxman - Oct. 3rd, 2016 06:46 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 12:58 pm (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 4th, 2016 02:42 pm (UTC) - Expand
Re: Бнопня по C++ - thesz - Oct. 4th, 2016 03:15 pm (UTC) - Expand
spamsink
Oct. 1st, 2016 03:03 pm (UTC)
Тривиальный ответ - раз модули разные, то могут быть скомпилированы с разными уровнями оптимизации. STL без оптимизации медленный, как континентальный дрифт.
usovalx
Oct. 1st, 2016 05:00 pm (UTC)
Первый как минимум один раз скопирует, когда будет создавать вектор из списка. Вот правда прямо сейчас не угадаю будет ли вторая копия когда создается initializer_list.

Второй вариант может протащить foo без копирования.
nponeccop
Oct. 1st, 2016 07:19 pm (UTC)
Я С++ не знаю, поэтому отвечу общими словами о применении стандарта и переносимости.

Нет варианта "обе"! Подвох в вопросе заключается в том, что в общем случае нельзя сказать, какой код будет быстрее - т.е. только бенчмарк. Это же касается размещения в другом модуле - результат может поменяться по мере развития межмодульной оптимизации и link time code generation (ltcg/lto).

В этом коде происходит изменение производительности при внесении seemingly equivalent changes. Соответственно, мы напарываемся на неполноту оптимизатора.

И вопрос можно переформулировать так: это всего лишь неполнота, или кроме неполноты ещё и стандарт нам что-то говорит по этому поводу? Т.е. есть ли в страндарте указание, что "Мув семантик не понимается инитиалайзерлистом".

Но надо учитывать, что гарантии стандарта - это некий минимальный уровень, ниже которого опускаться запрещено. Подниматься же выше - вполне можно.

Т.е. в стандарте может быть только гарантия отсутствия копирования. Но не гарантия, что копирование обязательно произойдет. Во всяком случае, стараются так писать стандарт, чтобы запретов на оптимизацию было поменьше.

Т.е. если у нас 2 кода, в одном из которых нам мув гарантирован, а во втором нет, то в некоем хорошем оптимизаторе разницы может и не оказаться вовсе.

Вообще такие вопросы надо задавать в разрезе ОС, архитектур и (версий) процессоров и компиляторов. Поскольку

а) гарантии стандартом даются слабые - всё отдано на откуп авторам оптимизатора
б) у нас как правило ограниченный набор таргетов, если только мы не Буст пишем

Т.е. ответ получится более практически применимым, если отвечающий будет учитывать опыт эксплуатации конкретных компиляторов. Т.е. вместо "стандарт в этом месте ничего не гарантирует" будет "такие места gcc 6 оптимизировать не умеет"

Edited at 2016-10-01 07:27 pm (UTC)
blackyblack
Oct. 1st, 2016 08:21 pm (UTC)
Ну так на любой вопрос по оптимизации ответ будет: "А вы профайлером смотрели?"
(no subject) - nponeccop - Oct. 1st, 2016 08:27 pm (UTC) - Expand
thesz
Oct. 3rd, 2016 11:27 am (UTC)
Отсутствуют "this poll sucks" и "какой C++ в 2016?"
Владислав Исенбаев
Oct. 4th, 2016 12:13 am (UTC)
construct_vector не обязан возвращать вектор, можно вернуть любую структуру с определенным size(), например специальную структуру, хранящую только размер.
( 77 comments — Leave a comment )