А в чем именно абсурдность?Medium-rare wrote:Хочу повторить, что постановка задачи изначально абсурдная, но интересовали детали имплементации.
Переквалификация c#-> ??
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
In vino Veritas!
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
После этого упражнения, я больше поверю GCC. Но где в приведёном коде работает shared_ptr? Что выделяется через boost::object_pool, то видно. Надо ведь заставить объект типа shared_ptr<T> отрабатывать присвоение.Интеррапт wrote: На GCC выдает ошибку (КМК вполне правильную) на этой строчке
data = reinterpret_cast<data_pptr>( &std::allocate_shared<Data, myallocator<data_ptr>>( MyAllocator, i ) );
Taking the address of a temporary object of type 'typename enable_if<!is_array<Data>::value, shared_ptr<Data> >::type' (aka 'std::__1::shared_ptr<Data>')
Правда я уже приводил код, который использует boost и меньше 1-й секунды отрабатывает.
Code: Select all
boost::object_pool<Data> pool(sizeof(Data) * COUNT); Data* data[COUNT]; for (int i = 0; i < COUNT; i++) { data[i] = pool.construct(i); } Data* current = data[0]; Data nodeMem; for(long iter = 0; iter < 100000000; iter ++) { const int nextIndex = (current->payload + 1) % COUNT; nodeMem = *data[nextIndex]; pool.destroy(data[nextIndex]); data[nextIndex] = pool.construct((current->payload + nodeMem.payload + 1) % COUNT); current = &nodeMem; }
Мне подумалось, что так или так можно исправить ошибку GCC:
auto ref = *data[nextIndex];
ref = std::allocate_shared<Data, myallocator<data_ptr>>(MyAllocator, ((*current)->payload + (*newNode)->payload + 1) % COUNT);
Хотя это покажет на проблему (?).
Last edited by Medium-rare on 10 May 2013 04:09, edited 1 time in total.
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
shared_ptr не для того. Я уже перечислил все аргументы. Ещё: это указатель для маршаллинга данных между логически изолироваными компонентами/классами. 100 миллионов случайных присвоений на решето из 100 никто с ним не делает. Абсолютно не практично, не показывает ничего ни про что. Что Java другой язык, и приёмы программирования в нём необязательно совпадают, кто бы спорил, я не буду. Что через shared_ptr на работе передаются какие-то тяжёленькие объекты, с массой внутренних пойнтеров, а не int в struct, то данность. Да целый тип в C++ дешевле всего по значению передавать, там даже передача через простой указатель, не refcounted, и то не всегда оправдана, когда заботятся о скорости. На фига попу боян?crypto5 wrote:А в чем именно абсурдность?
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Ну так о чем и речь. Уж если писать с кодом, где есть указатели, то уже проще все переписать. Например, ваша переменная current потенциально может указывать на уже освобожденный участок кода, т.к. присваивание чего-либо этой самой current не ведет к увеличению reference counter. А если попробовать current использовать по правильному, ну т.е.Medium-rare wrote:Но где в приведёном коде работает shared_ptr? Что выделяется через boost::object_pool, то видно. Надо ведь заставить объект типа shared_ptr<T> отрабатывать присвоение.
data_ptr current = data[0];
(без указателя и потом ес-но в цикле без указателя), то тогда это прилично докидывает время к исполнению кода.
Ну и кажется мне, что это присваивание у вас не правильное:
Code: Select all
[1] data_ptr* newNode = data[nextIndex];
[2] // Yes, here we have shared_ptr working *data[nextIndex] is shared_ptr by val
[3] *data[nextIndex] = std::allocate_shared<Data, myallocator<data_ptr>>(MyAllocator, ((*current)->payload + (*newNode)->payload + 1) % COUNT);
[4] current = newNode;
Т.е. не будет работать аналогично изначальному Джава коду
Code: Select all
final Data newNode = data[nextIndex];
data[nextIndex] = new Data((current.payload + newNode.payload + 1) % COUNT);
current = newNode;
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
Ха, да, подправим, но теперь радикальных изменений в милисекундах вряд ли будет, компилятор внутри применённых тимплейтов пошарит, и соптимизирует. В общем, джависты на данном примере видят, что проведя генную инженерию над shared_ptr C++ способен достичь их скорости. :-p
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Что бы не парится о утечках и segmentation fault-ах а сосредоточится на алгоритмах как это делают джава программистыMedium-rare wrote:На фига попу боян?crypto5 wrote:А в чем именно абсурдность?
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
Я соглашусь, на Java и C# чуть-чуть пописал, а с хорошей процедурой и инструментами (!) в C++ не так много "радостей", как segmentation fault. Все опасные приёмы должны локализироваться, желательно в пределах функции, внутренние приёмы безопасности, как unique_ptr, ничего не отдавать наружу без предосторожностей, как shared_ptr. C++ 11 только что сделал жизнь немного проще.crypto5 wrote:Что бы не парится о утечках и segmentation fault-ах а сосредоточится на алгоритмах как это делают джава программисты
Last edited by Medium-rare on 10 May 2013 04:32, edited 1 time in total.
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Не, ничего не знаю, даже не в курсе что там за механизм лика.Интеррапт wrote:Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Вот примерчик:crypto5 wrote:Не, ничего не знаю, даже не в курсе что там за механизм лика.Интеррапт wrote:Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
http://frankkieviet.blogspot.com/2006/1 ... space.html
(не смотрите, что статья старая, толком ничего не поменялось, случается сплошь и рядом).
вот кой-какое обсуждение
http://stackoverflow.com/questions/6470 ... -with-java
и главное, что действительно на реальных проектах случается и иной раз волосы на голове рвать хочется, т.к. ну очень сложно найти, в чем же причина.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ну везде где я работал все перегружали целиком всю jvm при апдейте апликухи, так что не мудрено что я о таком не слышал.Интеррапт wrote:Вот примерчик:crypto5 wrote:Не, ничего не знаю, даже не в курсе что там за механизм лика.Интеррапт wrote:Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
http://frankkieviet.blogspot.com/2006/1 ... space.html
(не смотрите, что статья старая, толком ничего не поменялось, случается сплошь и рядом).
вот кой-какое обсуждение
http://stackoverflow.com/questions/6470 ... -with-java
и главное, что действительно на реальных проектах случается и иной раз волосы на голове рвать хочется, т.к. ну очень сложно найти, в чем же причина.
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Что не отменяет memory leaks.crypto5 wrote: Ну везде где я работал все перегружали целиком всю jvm при апдейте апликухи, так что не мудрено что я о таком не слышал.
И вообще это один из примеров. А иной раз Джава просто очень серьезно отжирает память и сходу даже не всегда понятно почему. Мне вот этот примерчик нравится
Code: Select all
class Stringer {
static final int MB = 1024*512;
static String createLongString(int length){
StringBuilder sb = new StringBuilder(length);
for(int i=0; i < length; i++)
sb.append('a');
sb.append(System.nanoTime());
return sb.toString();
}
public static void main(String[] args) {
List substrings = new ArrayList();
for(int i=0; i< 100; i++) {
String longStr = createLongString(MB);
String subStr = longStr.substring(1,10);
substrings.add(subStr);
}
}
}
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
А как именно не отменяет?Интеррапт wrote:Что не отменяет memory leaks.crypto5 wrote: Ну везде где я работал все перегружали целиком всю jvm при апдейте апликухи, так что не мудрено что я о таком не слышал.
Ну это же не мемори лик уже.
казалось бы, все нормально, на выходе в subtrings списке будет с пару килобайт.
Ну и что мне нравится в джаве, это что все эти проблемы очень просто отдебажить. Например у меня во всех джобах есть пара флагов, которые заставляют jvm скидывать мемори дамп на диск по OutOfMemory exception, потом он непринужденно загружается в jvisualvm в которой очень просто отследить почему происходит лик.
In vino Veritas!
-
- Уже с Приветом
- Posts: 19041
- Joined: 11 Jan 2012 09:25
- Location: CA
Re: Переквалификация c#-> ??
Дайте линков мы изучимИнтеррапт wrote:Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
https://www.youtube.com/watch?v=wOwblaKmyVw
-
- Уже с Приветом
- Posts: 15475
- Joined: 27 Sep 2007 22:53
Re: Переквалификация c#-> ??
Спасибо за приведенный пример - действительно интересно.Medium-rare wrote:Ха, да, подправим, но теперь радикальных изменений в милисекундах вряд ли будет, компилятор внутри применённых тимплейтов пошарит, и соптимизирует. В общем, джависты на данном примере видят, что проведя генную инженерию над shared_ptr C++ способен достичь их скорости. :-p
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Потому что это и остается ликом, который лечится тем, что нужно перестартовывать контейнер.crypto5 wrote: А как именно не отменяет?
Я и не говорил, что это memory leak, я поэтому и написал "А иной раз Джава просто очень серьезно отжирает память и сходу даже не всегда понятно почему"crypto5 wrote: Ну это же не мемори лик уже.
Ага, т.е. все-таки иной раз приходится (как вы написали) "париться о утечках", вместо того, чтобы просто "сосредоточиться на алгоритмах".crypto5 wrote:в которой очень просто отследить почему происходит лик.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Так выше уже привел.Сабина wrote:Дайте линков мы изучимИнтеррапт wrote:Ага, конечно. Никогда о ClassLoader ликах не слыхали? Причину которых и найти сложно, а чтобы починить в большом коде - иной раз можно умом тронутьсяcrypto5 wrote:Что бы не парится о утечках
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Я тоже так думал, насчет оптимизации. Но вот только когда вместо присваиваний указателей, начинаются присваивания shared_ptr - то вся производительность летит насмарку. Проверено. И custom allocator тут совсем не при чем (я вон boost pool использовал, который тоже в одной области памяти размещает обьекты без free/malloc). Задержки начнутся именно при присваиваниях и соответственно копированиях с атомарным увеличентием счетчика (для thread-safety) одного shared_ptr другому.Medium-rare wrote:Ха, да, подправим, но теперь радикальных изменений в милисекундах вряд ли будет, компилятор внутри применённых тимплейтов пошарит, и соптимизирует.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Это не лик сам по себе, а результат другого лика, типа кто-то забыл в сессии или thread local обьект который ссылается на класлоадер, вот этот обьект и есть лик.Интеррапт wrote:Потому что это и остается ликом, который лечится тем, что нужно перестартовывать контейнер.crypto5 wrote: А как именно не отменяет?
Ну с утечками я как раз как то не сталкивался, все больше кто-то пишет код который рожает слишком много обьектов на ровном месте как в моем примере выше и программа не справляется, или например в программу приходит супергиганский requestАга, т.е. все-таки иной раз приходится (как вы написали) "париться о утечках", вместо того, чтобы просто "сосредоточиться на алгоритмах".crypto5 wrote:в которой очень просто отследить почему происходит лик.
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ну наконец то!Интеррапт wrote:Задержки начнутся именно при присваиваниях и соответственно копированиях с атомарным увеличентием счетчика (для thread-safety) одного shared_ptr другому.Medium-rare wrote:Ха, да, подправим, но теперь радикальных изменений в милисекундах вряд ли будет, компилятор внутри применённых тимплейтов пошарит, и соптимизирует.
In vino Veritas!
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
После того, как он уже дал выигрыш в несколько раз, да, возможно.Интеррапт wrote:И custom allocator тут совсем не при чем
Ну тогда эксперимент будет GCC имплементация vs. MS. А то некоторые люди такие лекции на MSDN Channel 9 читали, как они всё замечательно сделали в новом VC++ компиляторе...
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Ну так я спорил только потому, что думал, что С++11 компилятор получше оптимизирует всякие shared_ptr.crypto5 wrote:Ну наконец то!Интеррапт wrote:Задержки начнутся именно при присваиваниях и соответственно копированиях с атомарным увеличентием счетчика (для thread-safety) одного shared_ptr другому.Medium-rare wrote:Ха, да, подправим, но теперь радикальных изменений в милисекундах вряд ли будет, компилятор внутри применённых тимплейтов пошарит, и соптимизирует.
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Переквалификация c#-> ??
отвечаю с опозданием, мини отпуск был аднакаGross wrote:а что конкретно, кроме самой Java, какие фреймворки?Alexandr wrote:PS у меня C# сильно лучше, чем у вас, и C++ есть, но я тож жабу качаю
зы Вопрос ко всем
на совсем ближайшее время - довести Java SE (весь стек) до экспертного уровня, а дальше видно будет
если жизнь заставит лезть в JEE, то и туда полезу
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Переквалификация c#-> ??
клан называется system architect, положено "все знать" (с)dotcom wrote:В каком клане сидите?Alexandr wrote:PS у меня C# сильно лучше, чем у вас, и C++ есть, но я тож жабу качаю
-
- Уже с Приветом
- Posts: 15475
- Joined: 27 Sep 2007 22:53
Re: Переквалификация c#-> ??
клан неспящихAlexandr wrote:клан называется system architect, положено "все знать" (с)dotcom wrote:В каком клане сидите?Alexandr wrote:PS у меня C# сильно лучше, чем у вас, и C++ есть, но я тож жабу качаю