?

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

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)
а на что перепрошиваете, поделитесь, плз

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