?

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

thesz
Oct. 3rd, 2016 03:17 pm (UTC)
Re: Бнопня по C++
Электричество экономится не кодированием с экономией циклов, а правильной поддержкой протоколов типа Raft/Paxos и/или checkpoints.

Это я как недавно выращенный спец по HPC говорю.

С обеими пунктами у C++ тяжело.
mpd
Oct. 3rd, 2016 04:07 pm (UTC)
Re: Бнопня по C++
> Электричество экономится не кодированием с экономией циклов

Согласен! Говорят, интел уже давно выпустил процессор, который обходит вечный цикл за 1 секунду! :-D

А если серьёзно...

> Raft/Paxos и/или checkpoints

Это - отлично!

> С обеими пунктами у C++ тяжело.

Это из-за чего?
Они принципиально не реализуемы на Си++?
thesz
Oct. 4th, 2016 01:00 pm (UTC)
Re: Бнопня по C++
На C++ тяжело реализовать Paxos/Raft. В отличии от Фортрана, например, автоматически сделать checkpoint тоже тяжело.
mpd
Oct. 4th, 2016 02:44 pm (UTC)
Re: Бнопня по C++
А на чём - легко?
thesz
Oct. 4th, 2016 03:21 pm (UTC)
Re: Бнопня по C++
https://github.com/NicolasT/kontiki/tree/master/src/Network/Kontiki - 1500 строк (Haskell)
https://github.com/andrewjstone/rafter/tree/master/src - 2200 строк (Erlang)
https://github.com/RaftLib/RaftLib/tree/master/src - 37 файлов!!! (C++)

На чём угодно, что не C++. ;)
mpd
Oct. 4th, 2016 04:59 pm (UTC)
Re: Бнопня по C++
К сожалению, у меня не хватает знаний, чтобы оценить версии на Erlang и Haskell, сопоставить их с версией на Си++.
Хорошо, пусть три версии по всем характеристикам одинаковы:
  1. масштабируемы
  2. производительны
  3. сопровождаемы
  4. расширяемы
  5. интегрируемы

Я сделал wc на все файлы *.cpp - оказалось чуть больше 4000 строк, т.е., меньше, чем в два раза на Erlang, но опять же, не понятно, о чём это говорит, что это - нереализуемо?
thesz
Oct. 4th, 2016 06:42 pm (UTC)
Re: Бнопня по C++
В C++ код ещё и в заголовочных файлах.

Структура под PAXOS/Raft в Эрланге и Хаскеле, обычно, неизменная (persistent). Надо прилагать усилия, чтобы сделать её изменяемой. В C++ - изменяемая, надо прилагать усилия, чтобы сделать её неизменной. Поскольку изменяемая структура претерпевает изменения со стороны клиентского кода и библиотеки Raft/Paxos, отлаживать приложение с Raft/Paxos на C++ будет сложнее, чем на двух других ЯП.
mpd
Oct. 4th, 2016 07:07 pm (UTC)
Re: Бнопня по C++
Либо я перестал понимать Си++/Си, либо что-то не так.

Есть, например, Apache ZooKeeper, написаный на яве и реализующий Paxos, много где стоит в продакшене, зарекомендовал себя.

В плюсах я могу объявить член класса:
  1. MyObject * m; - изменяемый указатель на изменяемый объект
  2. MyObject * const m; - неизменяемый указатель на изменяемый объект
  3. const MyObject * m; - изменяемый указатель на неизменяемый объект
  4. const MyObject * const m; - неизменяемый указатель на неизменяемый объект
Если я не ошибаюсь, ZooKeeper написан был на той яве, где, по сравнению с перечисленными случаями, можно объявить только 1 и 2 (с помощью final). Т.е., в плюсах с немутабильностью (и, кстати, косвенно про это же фича, обсуждаемая в этом посте, т.к. это - про семантику перемещения без измениния, а не копирование, обсуждается фейл, когда всё же произошло копирование, но не превращение в мутабильность) - очень даже развита, по сравнению с явой, на которой, тем не менее, работают реализации Paxos в продакшене.
thesz
Oct. 4th, 2016 10:33 pm (UTC)
Re: Бнопня по C++
1. Что там про заголовочные файлы?

2. ZooKeeper, в случае использования из c++, не работает с изменяемыми данными. Сейчас слишком поздно выяснять, как он работает, у нас тут полвторого. Потом посмотрю.

3. Из вашего рассмотрения проблем c++ вы упустили проблему владения указателем. В java такой проблемы нет, поэтому zookeeper написан на ней, а не на c++.
mpd
Oct. 4th, 2016 10:52 pm (UTC)
Re: Бнопня по C++
Ну, что тут сказать...
Мне - нечем крыть, такие доводы...
Я - полностью и всецело повержен!
Убегаю, поджав хвост.
Обязуюсь выучить Эрланг и устроиться на работу, где надо на нём программировать.
Вот, только на этой вот доработаю. Всё-таки, постоянных контракт, известная мне тема и среды с языками...
Покорнейше благодарю!
thesz
Oct. 5th, 2016 10:48 am (UTC)
Re: Бнопня по C++
Я на C, C++ и иже с ними писал две трети моей рабочей жизни (коей уже 27 лет). И тут недавно приобщился, был пользователем штуки под названием Stanford Legion (и Regent).

Проблема с владением областью памяти не надуманная. В дизайне программ и библиотек на C++ она занимает большое место. Ибо ошибся, и либо порча памяти, либо порча памяти. В лучшем случае - порча памяти. Если совсем повезло - вялотекущая утечка, из-за которой надо перезапускать программу каждые двое суток.

А вот в Java её нет, этой проблемы.
mpd
Oct. 5th, 2016 11:51 am (UTC)
Re: Бнопня по C++
Ох, это потрясение покруче, чем от поста про пиво! 8-)

Значит, меня троллят со всех сторон, да так удачно, что я - всеми лапками! :-(

А никто про надуманность проблемы с владением областью памяти - не говорит.
Мы вообще до этого обсуждали проблему константности (затронута тобою) и отсутствия копирования (затронута в посте) в Си++.
А ещё до этого - про большое количество строк - критерий, на мой взгляд, не очевидный, при опускании всех остальных при этом (читабельности, например, сопровождаемости; кому-то слишком кратко - тоже не совсем может быть хорошо).

Яву я упомянул, что там отсутствовала константность (не знаю, как сейчас) настолько, как это сделано в Си++ (константные методы экземпляров в яве? наверно, с помощью декораторов там что-то можно; было возможно объявлять неизменяемую переменную изменяемого экземпляра непримитивного типа, но было невозможно объявить переменную на неизменяемый экземпляр непримитивного типа; из-за чего аргументы по понятиям Си++ на примитивные типы всегда передавались по значению, а непримитивного - только по ссылке), но людям не мешает это для применения реализаций сложных алгоритмов на яве в продакшене. Константность в Си++ есть и очень развита. Применять или нет - решают сами. Я сталкивался, что люди не знают разницы между "MyObject * const m;" и "const MyObject * const m;". И эта свобода дана не чтобы попадать в неудачные ситуации, а чтобы - выражать точно, что ты хочешь. http://stackoverflow.com/questions/5886439/what-is-the-java-equivalent-of-cs-const-member-function

В яве устранили одну проблему, но это не говорит о том, что из-за этого улетучились остальные. В некоторых случаях - они только появились. http://lionet.livejournal.com/140057.html?thread=4611353#t4611353 - вот реальный случай, когда человек явно полагался на решение проблем со стороны явы.

Ладно, пора заканчивать эти ветки в этом посте.

Я очень надеюсь, что Льву - не выкручивали руки и не шантажировали, чтобы он снова взялся по не своему решению за программированию на Си++.
Re: Бнопня по C++ - thesz - Oct. 5th, 2016 11:57 am (UTC) - Expand
Re: Бнопня по C++ - mpd - Oct. 5th, 2016 12:37 pm (UTC) - Expand
rdia
Oct. 5th, 2016 04:17 pm (UTC)
Re: Бнопня по C++
> В плюсах я могу объявить член класса:

Да. По-умолчанию идёт первый вариант, т.е. изменяемый указатель на изменяемый объект.

В ML вы имеете другой набор:

1. val z = "Привет" - неизменяемый объект.

2. val z = ref "Привет" - неизменяемая ссылка на изменяемый объект.

Т.е. по-умолчанию получается именно неизменяемый объект. Вот и вся разница.
mpd
Oct. 5th, 2016 04:39 pm (UTC)
Re: Бнопня по C++
Извиняюсь, я не понимаю, к чему этот комментарий?

К чему сюда ещё ML?

Там логика - какая была, мне утверждают:
в Эрланге и Хаскеле - неизменная (persistent)
C++ - изменяемая
с Raft/Paxos на C++ сложнее из-за этого.

Я привожу контпример с явой, в которой заметно ещё хуже с persistent, чем в Си++ (и объясняю почему), но на яве есть реализации алгоритма зарекомендовавшие себя в продакшене.

Зачем сюда привлекать ещё ML?

По общей договорённости мы уже закрыли этот сред.

Всем - удачного окончания дня!
rdia
Oct. 5th, 2016 04:54 pm (UTC)
Re: Бнопня по C++
> Извиняюсь, я не понимаю, к чему этот комментарий?

Просто чётко показываю разницу, которую thesz не объясняет.

Разница не в том, что нельзя объявить персистентно или неперсистентно, а в том, какой из этих вариантов стоит по-умолчанию. Т.е. в С++ было бы так, как в языках ML/Haskell/Erlang, если бы приходилось везде ставить mutable, а не const.

Хаскель - это близкий родственник ML, в данном случае там всё одно и то же.
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

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel