LINUX.ORG.RU

Производительность shared_ptr

 


0

3
auto a = std::make_shared<DemoClass>();

for (int i = 0; i < 100000000; i++)
{
  auto b = a;
}

В release выполняется секунду.

Аналогичный код на C#


var a = new DemoClass();

for (int i = 0; i < 100000000; i++)
{
  var b = a;
}

выполняется 65 мс.

Все из-за lock inc dword ptr [ebx] в крестах. Ибо ниасилили сборщег мусора без лишних монопольных изменений счетчика ссылок.

I love .NET!



Последнее исправление: Udacha (всего исправлений: 2)

В shared_ptr атомарный счетчик ссылок, который избыточен, если объекты используются в пределах одного потока. Можно использовать другой умный указатель с неатомарным счетчиком, например, intrusive_ptr из boost, или свой написать.

annulen ★★★★★
()

А там точно C# не выкинул твой цикл, потратив 65мс тупо на инициализацию всякого барахла в main?

А так да, бездумное использование shared_ptr в современном плюсовом коде это провал. В том же Rust додумались сделать 2 типа счётчиков ссылок в стандартной библиотеке (Rc, Arc).

snizovtsev ★★★★★
()
Ответ на: комментарий от bugfixer

Проблема не в сложности проталкивания в буст (снимаю шляпу), а в том, что не все его используют. У каждой более-менее крупной конторы есть свой собственный буст (abseil, chromium, llvm, folly, аркадия, блумберг, итд итп), и их не скрестишь вместе. А умный указатель это такая штука, которая протекает наружу через хедеры.

snizovtsev ★★★★★
()
Ответ на: комментарий от snizovtsev

Вообще я сторонник intrisuve_shared_ptr. В большинстве случаев автор класса знает, как его будут использовать (по значению, ссылке или умному указателю). И нет смысла навешивать это свойство извне.

snizovtsev ★★★★★
()
Ответ на: комментарий от snizovtsev

Проблема не в сложности проталкивания в буст (снимаю шляпу)

For the record - патч не мой, и не с моей подачи (чужие лавры мне не нужны). Но я прекрасно знаю по чьему запросу было сделано, и зачем.

bugfixer ★★★★★
()

Вопрос только один: нахрена в твоем примере шаред пойнтер. А если хочешь взрывозащищенных тормозов в шарпе, чего слова из песни выкидывать — ну так вкрячивай в цикл честный лок через интерлокед на запись b:) и бред про асиливание gc не при чем --- теплое с мягким.

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Вопрос только один: нахрена в твоем примере шаред пойнтер

Честно скажу - не смотрел.

Вопрос в другом: там «new» наверняка очень сильно тяжелей самого shared_ptr. О чём разговор?

bugfixer ★★★★★
()

А зачем тебе копироовать 1000000 раз shared_ptr? Его копирование фактически означает что-то вроде «захвата ресурса», чтобы твой объект не выпилился.

Но это нужно делать только когда есть угроза этого самого выпиливания. Например, сохранить в поле класса/глобальную переменную, которая переживёт скоуп исходной переменной.

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

KivApple ★★★★★
()

Кроме того, нужно сделать бенчмарки на последних версиях Java. Тогда C++ окончательно и бесповоротно самозакопаются в могилу, забив все гвозди и заварив все щели.

Включая весь софт, написанный на этом недоязычке

Udacha
() автор топика
Ответ на: комментарий от KivApple

Мальчик, в программах объекты постоянно присваиваются друг другу, добавляются в разные списки, ассоциативные массивы и т.д. В нормальных языках управлением жизни объектов занимается сборщик мусора. Ибо ООП без сборщика мусора это как машина без дворников…

Udacha
() автор топика
Ответ на: комментарий от Udacha

Фперед, делайте. Но поскольку качество этих «бенчмарков» будет таким же гавенным как и того что выше, то это все так же будет ни о чем.

Собственно все тут уже поняли что Вы любите .NET (звучит как пропаганда ЛГБТ почти что) и ничего не понимаете в обсуждаемой теме. Так что переубедить Вы никого не сможете, а вот опозориться сильнее чем уже опозорились - вполне…

AntonI ★★★★
()
Ответ на: комментарий от Udacha

Программы очень разные бывают. И уповать на gc могут только обладатели кривых ручонок, тотальное решение всех проблем дизайна через gc просто приводит тормозам на ровном месте. Вот прямо как в .NET, да-да.

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Причем тут уповать или нет. На C# написать тормознутый код еще надо умудриться. А на C++ пожалуйста. Постоянные копирования объектов. Неэффективный shared_ptr, который тоже копируется. А в .NET указатели на объекты вообще могут в регистриках храниться. И все архибыстро. Неэффективность не размазана по всему коду, а сборщик мусора подсчитывает ссылки лишь изредка, во время сборки мусора.

Udacha
() автор топика

Всё, пацаны, пистец, удача из цпп уходит …

Но почему, но почему
Расстаться всё же нам пришлось,
Ведь было всё у нас всерьёз 15-го марта пля?
kvpfs ★★
()
Ответ на: комментарий от Udacha

На C# написать тормознутый код еще надо умудриться. А на C++ пожалуйста.

Да, на С++ надо уметь писать, там порог вхождения выше чем на С#. Зато правильно написанный на плюсах код рвет шарпы как тузик грелку. Но Вы, очевидно, такой написать не сможете - поэтому радуйтесь шарпам, они для Ваших хэллоуворлдов самое оно. Хотя мне кажется вижуал бейсик Вам бы лучше подошел;-)

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Пока плюсатник будет думать, что ему взять: ссылку, константную ссылку, умный указатель или просто класс, шарпист и явист уже напишут читабельный, быстрый и безопасный код

Udacha
() автор топика
Ответ на: комментарий от Udacha

Напишут. Безопасный и читаемый, но нифига не быстрый. Именно потому что для написания быстрого кода надо думать и знать что под капотом у всех этих указателей.

AntonI ★★★★
()
Ответ на: комментарий от Udacha

С учётом того, что shared_ptr не работает с циклическими ссылками, в программах на плюсах принято иметь некую иерархию объектов кто кем владеет. В целом в нормально спроектированной программе вряд ли будет 1000000 владельцев одним объектом, которым обязательно нужно это владение документально оформить.

KivApple ★★★★★
()
Ответ на: комментарий от snizovtsev

В проектах где я участвую код на яве/шарпах не успеет досчитать до того момента как у проекта закончится бюджет…

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Ты где-нибудь видел этот «правильный» код на C++?

Абсолютно везде, от HTML-движков до видеоигр - говно размазанное по умным указателям. Которое течет, глючит и тормозит.

lovesan ★★
()
Ответ на: комментарий от lovesan

Видел, мы такой пишем. И не только мы.

Абсолютно везде…

4.2, причём лютое. Вы, очевидно, не могли видеть весь код написанный в мире. Но Ваше заявление говорит о Вас лично - Вы не видели в жизни ничего кроме говнокода или Вы воспринимаете любой код как говнокод. Я конечно соболезную (и Вам и Вашим коллегам/работодателям), но причём тут С++?!

AntonI ★★★★
()
Ответ на: комментарий от AntonI

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

Типичный лиспер, что с него взять :)

annulen ★★★★★
()
Ответ на: комментарий от Ivan_qrt
if (waiter != kNotSignaledState) {
    WakeUpWaiter(*reinterpret_cast<impl::TaskContext*>(waiter));
  }

private:
  std::atomic<std::uintptr_t>& state_;
  impl::TaskContext& current_;

Опять указатели. При этом поле это ссылка. Видать, пытались преодолеть уродство крестов, но так и не получилось. Руки опустились :)

Udacha
() автор топика