?

Log in

No account? Create an account

Previous Entry | Next Entry

Ответ на бнопню по C++

Код, который напрямую зовёт std::vector{std::move(foo)} на данных в ощущениях компиляторах (gcc, clang) будет медленнее, чем construct_vector(std::move(foo)), где:

std::vector construct_vector(Foo && foo) {
    std::vector vec;
    vec.emplace_back(std::move(foo));
    return vec;
}


Почему это так случается? Из-за отсутствия оптимизации std::initializer_list. Конструкция вектора через std::vector{} создаёт initializer_list, мувает в него один элемент foo, затем копирует из initializer_list внутрь вектора. К сожалению.

construct_vector же копированием foo не занимается, а делает move construction. Значение вектора попадает в место вызова без копирования, через RVO.

Ну вот так хреново пока работаем с std::initializer_list. В стандарте C14 про это вот что есть: "the underlying array is copy-initialized". Опаньки.

Типичный C++, что ни фича, то засада. JavaScript и то без копирования передавал бы всё :)

P.S. По поводу «почему C++» (mpd) — это было не моё решение. Нам и на Эрланге с сишными вставками неплохо работалось, правда, в сервис работал в десять раз медленнее. Но если у компании есть ресурсы и время на то, чтобы создать поддерживать в тонусе команду C++-програмистов, почему бы и нет? :)

Ключевой момент тут такой: если не заниматься байтодрочерством, C++ из-за подобных недофич (чуть что — копируем! ну или не смогли понять жизненный цикл — тоже на всякий случай скопируем) будет работать не сильно быстрее остальных дефолтных языков, а то и медленнее и/или глючнее. Только если действительно понимать, что происходит, можно выжрать нетривиальный буст по производительности, и, если повезёт, не сильно потерять в безопасности. Но это если такая производительность действительно нужна. На мобилке она, за редкими исключениями, вряд ли нужна. В датацентре (если это не cuda) — уже более интересное распределение. Разница между десятью нодами и сотней нод в плане управления — колоссальна. Между сотней и тысячью — уже речь встаёт о дешевизне датацентра по сравнению с рабочим временем программиста.

Если C++ на вашем продукте позволяет обеспечить эту разницу в 10x, есть средства на программистов и время на их реализацию, почему бы и нет? У нас в MZ — есть. Компания зарабатывает несколько миллионов долларов в день. А в вашем НИИГиТ наверняка нет ни таких средств, ни таких требований к производительности, которые бы требовали кластера из более чем десятка машин, а их оптимизация явно встанет зарплатой программистов дороже, чем выгода от их сокращения.

Comments

spamsink
Oct. 4th, 2016 06:05 am (UTC)
На мобилке производительность очень даже нужна, потому что любая потеря в производительности - это потеря во времени жизни мобилки.
lionet
Oct. 4th, 2016 06:16 am (UTC)
Мобилка в основном тратит время, ожидая инпута, и жря батарейку на поджигание экрана или вещание через wifi. Количество циклов процессора, которое он тратит после того, как ты нажал пальцем на контрол, неважно. За исключением игр, ничего ты батарейке не сделаешь, оптимизируя свифт сиплюсплюсом.

Edited at 2016-10-04 06:16 am (UTC)
spamsink
Oct. 4th, 2016 06:27 am (UTC)
Сейчас в каждой мобилке столько background процессов, активирующихся по каждому потряхиванию, изменинию координат, уровня сигнала, и т.д., и т.п., что эффективность реализации всех этих процессов может оказать заметное влияние.
lionet
Oct. 4th, 2016 06:44 am (UTC)
Неа. Главное, если не игра — подсветка в мобилке, и сеть. Когда мобилка в кармане, практически ничего не жрет, кроме нетворка (жрет радиомодулем).

Edited at 2016-10-04 06:47 am (UTC)
spamsink
Oct. 4th, 2016 07:45 am (UTC)
Бывало, что установка какого-нибудь аппа приводила к существенному уменьшению времени автономной работы даже в отсутствие явного его использования; приходилось сносить.

Один такой точно помню: анализ землетрясений. Впрочем, программу, которая постоянно сидит и делает FFT всех потряхиваний, чтобы в кои-то веки раз сказать "О! Землетрясение!", можно считать и игрой.

Edited at 2016-10-04 07:48 am (UTC)
lionet
Oct. 4th, 2016 08:02 am (UTC)
Она постоянно лазила в сеть за землетрясениями, поди. О чём и речь — о радиочасти.
spamsink
Oct. 4th, 2016 08:07 am (UTC)
Нет, она честно мониторила акселерометр (начинала мониторить после минуты неподвижного состояния, и в сеть лазила бы, только чтобы сообщить о чем-то, похожем на землетрясение); видимо, алгоритм фильтрования ложных тревог был достаточно затратным.
ostapru
Oct. 4th, 2016 02:25 pm (UTC)
> Неа. Главное, если не игра — подсветка в мобилке, и сеть.

Скроллинг странички в хроме на Note 3 может разгонять потребление от батарейки до 2А.
А если его не трогать, но экран горит, то меньше 100мА .
vinslivins
Oct. 4th, 2016 03:31 pm (UTC)
дефолтный самсунг гэлекси с6 за ночь съедает процентов двадцать батареи.

какой-нибудь цианогенмод, очищенный от этого шлака, съедает один процент.
vinslivins
Oct. 4th, 2016 03:34 pm (UTC)
перепрошивка старого телефона, например дала ещё два жизни батареи к одному дню жизни по умолчанию. один день и три дня.

скоро буду перепрошивать свой новый телефон (пора, гарантия истекла) - опять же, просто по соображениям "я уже устал заряжать его каждый день только потому, что каждому разработчику и его маме интересна гугл-аналитика его календарика-фонарика". посмотрим, какой будет результат.
yussouf
Oct. 6th, 2016 06:51 pm (UTC)
а на что перепрошиваете, поделитесь, плз
cd_riper
Oct. 4th, 2016 07:47 pm (UTC)
возьми веб серфинг -- там CPU/GPU жрется только в путь, а не только подсветка экрана и сеть.
lionet
Oct. 4th, 2016 11:17 pm (UTC)
Веб серфинг уже написан. Tm.

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031

Page Summary

Powered by LiveJournal.com
Designed by yoksel