Переквалификация c#-> ??
-
- Уже с Приветом
- Posts: 9194
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: Переквалификация c#-> ??
У некоторых по shared_ptr такие указания, что использовать в интерфейсных методах, и не использовать внутри класса или даже между классами одного модуля либо одного namespace (на код-ревью scope определят, как лучше). И, всюду, где нет неявной передачи освобождения памяти вызывающей стороне - использовать unique_ptr, который покроет 90% случае потребности в умных указателях. Так что не очень ясно, из-за чего копья ломаются.
И действительно, как образец неправильного использования, некоторый C++ код может стабильно быть медленнее сравнимого кода для JVM при слишком интенсивных операциях с memory heap, особенно, в многопоточной среде. Тут у C++ есть целый арсенал средств, правда, нечасто используемых, от нестандартных аллокаторов до in-place new.
И действительно, как образец неправильного использования, некоторый C++ код может стабильно быть медленнее сравнимого кода для JVM при слишком интенсивных операциях с memory heap, особенно, в многопоточной среде. Тут у C++ есть целый арсенал средств, правда, нечасто используемых, от нестандартных аллокаторов до in-place new.
... 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:И все-таки. Чегойта у crypto5 разница во времени практически ровно в 4 раза, а у тебя - в 7? При том, что GC занимает доли процента а все, кроме управления памятью, в джаве и сях должно быть примерно равнозначно?Интеррапт wrote: Ваш Джава код у меня выполнялся 3 сек, ваш С++ код - 21 секунду, мой С++ код - 6 секунд. Отставание в два раза есть, это правда.
Может, у него, например, 4 честных ядра, а у тебя - 4 ядра с hyperthreading, что почти как 8, но меньше, 7.
Ну честно, не верю я в такие странности. Да, new/delete могут быть дороже, но не в тысячи же раз
Да, я понятия не имею, как далеко может зайти оптимизация в джаве. Возможно, она даже теоретически не может сама раскидать задачу по ядрам, да и сама задача не так чтобы легко раскидывалась. Но уж очень цифры круглые и разница у вас большая в результатах
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Только ваш тест никакого отношения не имеет к сравнению ARC и GC перфоманса, а просто показывает, что аллокация памяти в Java происходит быстрее, чем если обычными new/delete выделять мелкие кусочки памяти в C++ (кто бы сомневался).crypto5 wrote: Я с этим не спорю, я возбудился исключительно на ваше заявление что ARC производительней чем GC.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Та нет, мой тест вместе с вашим отлично показывает что оверхед уходит на ARC, вы убрали два присваивания shared_ptr и программа ускорилась в 2 раза.Интеррапт wrote:Только ваш тест никакого отношения не имеет к сравнению ARC и GC перфоманса, а просто показывает, что аллокация памяти в Java происходит быстрее, чем если обычными new/delete выделять мелкие кусочки памяти в C++ (кто бы сомневался).crypto5 wrote: Я с этим не спорю, я возбудился исключительно на ваше заявление что ARC производительней чем GC.
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Ниче не понял. У Крипто его Джава код с 100000000 итераций исполнялся 2 секунды (он же сам об этом пару страниц назад писал). У меня этот же код исполняется 3 секунды (ну машина послабее, скорее всего). А разница между его С++ кодом и моим такая большая (21 секунда и 6 секунд), потому что он использует напрямую создание std::shared_ptr обьектов, а нужно это делать через std::make_shared, там добавочная оптимизация для этого есть. Ну и по мелочам могут версии компилятора отличаться, настройки и т.п.АццкоМото wrote:И все-таки. Чегойта у crypto5 разница во времени практически ровно в 4 раза, а у тебя - в 7? При том, что GC занимает доли процента а все, кроме управления памятью, в джаве и сях должно быть примерно равнозначно?Интеррапт wrote: Ваш Джава код у меня выполнялся 3 сек, ваш С++ код - 21 секунду, мой С++ код - 6 секунд. Отставание в два раза есть, это правда.
Может, у него, например, 4 честных ядра, а у тебя - 4 ядра с hyperthreading, что почти как 8, но меньше, 7.
Ну честно, не верю я в такие странности. Да, new/delete могут быть дороже, но не в тысячи же раз
Да, я понятия не имею, как далеко может зайти оптимизация в джаве. Возможно, она даже теоретически не может сама раскидать задачу по ядрам, да и сама задача не так чтобы легко раскидывалась. Но уж очень цифры круглые и разница у вас большая в результатах
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
это все понятно. но не с такой же разницой?crypto5 wrote:Платформы, компиллеры, джава разные, под макос вообще непонятно кто джаву пилит и с каким приоритетом.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Не-а, могу вернуть присваивание. Там разница в 1 секунду. Вся разница в shared_ptr vs make_shared.crypto5 wrote:Та нет, мой тест вместе с вашим отлично показывает что оверхед уходит на ARC, вы убрали два присваивания shared_ptr и программа ускорилась в 2 раза.Интеррапт wrote:Только ваш тест никакого отношения не имеет к сравнению ARC и GC перфоманса, а просто показывает, что аллокация памяти в Java происходит быстрее, чем если обычными new/delete выделять мелкие кусочки памяти в C++ (кто бы сомневался).crypto5 wrote: Я с этим не спорю, я возбудился исключительно на ваше заявление что ARC производительней чем GC.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Если сделать:
то вместо 6 секунд стало 7.
Code: Select all
data_ptr& current = data[0];
for(long iter = 0; iter < 100000000; iter ++) {
int nextIndex = (current->payload + 1) % COUNT;
data_ptr& newNode = data[nextIndex];
data[nextIndex] = std::make_shared<Data>((current->payload + newNode->payload + 1) % COUNT);
current = newNode;
}
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Вы же не вернули присваивания, у вас ссылки присваиваются, т.е. ARC не задействуется.Интеррапт wrote:Если сделать:
то вместо 6 секунд стало 7.Code: Select all
data_ptr& current = data[0]; for(long iter = 0; iter < 100000000; iter ++) { int nextIndex = (current->payload + 1) % COUNT; data_ptr& newNode = data[nextIndex]; data[nextIndex] = std::make_shared<Data>((current->payload + newNode->payload + 1) % COUNT); current = newNode; }
In vino Veritas!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
У Крипто код на джаве исполнялся 20 секунд, а на С++ - 80 секунд. Разница в 4 раза. У тебя тот же самый код (но в 10 раз меньше повторений) исполнялся 3 и 21 секунд соответственно. Разница в 7 раз. А время работы GC у него - порядка 0,1%. И как это все можно срастить в непротиворечивой картине мира?Интеррапт wrote:Ниче не понял. У Крипто его Джава код с 100000000 итераций исполнялся 2 секунды (он же сам об этом пару страниц назад писал). У меня этот же код исполняется 3 секунды (ну машина послабее, скорее всего). А разница между его С++ кодом и моим такая большая (21 секунда и 6 секунд), потому что он использует напрямую создание std::shared_ptr обьектов, а нужно это делать через std::make_shared, там добавочная оптимизация для этого есть. Ну и по мелочам могут версии компилятора отличаться, настройки и т.п.АццкоМото wrote:И все-таки. Чегойта у crypto5 разница во времени практически ровно в 4 раза, а у тебя - в 7? При том, что GC занимает доли процента а все, кроме управления памятью, в джаве и сях должно быть примерно равнозначно?Интеррапт wrote: Ваш Джава код у меня выполнялся 3 сек, ваш С++ код - 21 секунду, мой С++ код - 6 секунд. Отставание в два раза есть, это правда.
Может, у него, например, 4 честных ядра, а у тебя - 4 ядра с hyperthreading, что почти как 8, но меньше, 7.
Ну честно, не верю я в такие странности. Да, new/delete могут быть дороже, но не в тысячи же раз
Да, я понятия не имею, как далеко может зайти оптимизация в джаве. Возможно, она даже теоретически не может сама раскидать задачу по ядрам, да и сама задача не так чтобы легко раскидывалась. Но уж очень цифры круглые и разница у вас большая в результатах
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Где чего я не вернул?crypto5 wrote: Вы же не вернули присваивания, у вас ссылки присваиваются, т.е. ARC не задействуется.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
А... вы про то, что reference убрать. Типа такого
стало 7.2 секунды.
Code: Select all
data_ptr current = data[0];
for(long iter = 0; iter < 100000000; iter ++) {
const int nextIndex = (current->payload + 1) % COUNT;
const data_ptr newNode = data[nextIndex];
data[nextIndex] = std::make_shared<Data>((current->payload + newNode->payload + 1) % COUNT);
current = newNode;
}
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
У меня ничего 21 секунду не исполнялось, я С++ код Крипто даже и не пробовал запускать, т.к. было сразу видно, что он не оптимизированный. Я запускал только свой С++ код. У меня получилось 3 секунды Джава и 7 секунд (если указатели убрать) - С++.АццкоМото wrote:У Крипто код на джаве исполнялся 20 секунд, а на С++ - 80 секунд. Разница в 4 раза. У тебя тот же самый код (но в 10 раз меньше повторений) исполнялся 3 и 21 секунд соответственно.
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Тогда я не понимаю, как трактовать этот текст:Интеррапт wrote:У меня ничего 21 секунду не исполнялось, я С++ код Крипто даже и не пробовал запускать, т.к. было сразу видно, что он не оптимизированный. Я запускал только свой С++ код. У меня получилось 3 секунды Джава и 7 секунд (если указатели убрать) - С++.АццкоМото wrote:У Крипто код на джаве исполнялся 20 секунд, а на С++ - 80 секунд. Разница в 4 раза. У тебя тот же самый код (но в 10 раз меньше повторений) исполнялся 3 и 21 секунд соответственно.
Интеррапт wrote:Ваш Джава код у меня выполнялся 3 сек, ваш С++ код - 21 секунду
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Точно, слегка напутал, тяжелый день был Я запускал С++ код Крипто с 100000000 итераций и выполнилось оно за 21 секунду (проверил еще раз). Мой код с тем же кол-вом итераций выполнился за 7 секунд.АццкоМото wrote:Тогда я не понимаю, как трактовать этот текст:Интеррапт wrote:У меня ничего 21 секунду не исполнялось, я С++ код Крипто даже и не пробовал запускать, т.к. было сразу видно, что он не оптимизированный. Я запускал только свой С++ код. У меня получилось 3 секунды Джава и 7 секунд (если указатели убрать) - С++.АццкоМото wrote:У Крипто код на джаве исполнялся 20 секунд, а на С++ - 80 секунд. Разница в 4 раза. У тебя тот же самый код (но в 10 раз меньше повторений) исполнялся 3 и 21 секунд соответственно.Интеррапт wrote:Ваш Джава код у меня выполнялся 3 сек, ваш С++ код - 21 секунду
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Я пришел тем временем домой, запустил на домашнем лаптопе свой джава код, получил 16сек, скопипастил ваш код, получил 44 сек, убрал из вашего кода указатели и ссылки, получил 54сек, запустил свой Ц++ код из поста выше, получил 1м22с.
И того вариант С++ который я считаю правильным(Интерапта минус ссылки и указатели) у меня все равно отстает в 3.375 раза от джава кода.
Хотелось бы поинтересоваться какой компиллер и джава у Интерапта.
У меня ОпенДжДК 1.7.0_21 и ГЦЦ 4.6.3 на убунте 12.04, ключи компиляции и джавы я приводил.
И того вариант С++ который я считаю правильным(Интерапта минус ссылки и указатели) у меня все равно отстает в 3.375 раза от джава кода.
Хотелось бы поинтересоваться какой компиллер и джава у Интерапта.
У меня ОпенДжДК 1.7.0_21 и ГЦЦ 4.6.3 на убунте 12.04, ключи компиляции и джавы я приводил.
In vino Veritas!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Но нетронутый джава-код crypto5 исполнялся 3 секунды, или нет? Т.е. разница в другой среде была 7 раз, а не 4? Если так, то подозрительно. Если нет - ну, повод задуматься. Хотя тут полюбому сильное колдунство, о котором задуматься надоИнтеррапт wrote: Точно, слегка напутал, тяжелый день был Я запускал С++ код Крипто с 100000000 итераций и выполнилось оно за 21 секунду (проверил еще раз). Мой код с тем же кол-вом итераций выполнился за 7 секунд.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Да, кстати, посоны. Тема исключительно интересная. Облизательно потыкаюсь сам и, если будет что-то неожиданное - поделюсь. И вот тут нужно вспомнить вялый флейм про профайлер...
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
С Джавой как раз у нас особой разницы нет. У меня ваш Джава код с млрд итераций выполняется 19 секунд, что в принципе близко к вашим результатам.crypto5 wrote:Я пришел тем временем домой, запустил на домашнем лаптопе свой джава код, получил 16сек, скопипастил ваш код, получил 44 сек, убрал из вашего кода указатели и ссылки, получил 54сек, запустил свой Ц++ код из поста выше, получил 1м22с.
И того вариант С++ который я считаю правильным(Интерапта минус ссылки и указатели) у меня все равно отстает в 3.375 раза от джава кода.
С++ код (без ссылок и указателей) выполняется 42 секунды, я чуть позже гляну параметры и версию компилятора, т.к. запускал я прямо из XCode. Но на самом деле мы нормальный тест проведем, когда я использую object pool. И я резервирую за собой право использовать ссылки, не понимаю, почему я не могу это делать, если JIT используюет кучу всяких оптимизаций, а использование references в C++ - это самая обычная операция по оптимизации.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Изначальный код Крипто (со 100 млн операций) у меня выполнялся 3 секунды. А у него 2. Мой С++ код с 100 млн операций выполнялся 7.2 секунды (если отбросить всякие references и поинтеры).АццкоМото wrote:Но нетронутый джава-код crypto5 исполнялся 3 секунды, или нет? Т.е. разница в другой среде была 7 раз, а не 4? Если так, то подозрительно. Если нет - ну, повод задуматься. Хотя тут полюбому сильное колдунство, о котором задуматься надоИнтеррапт wrote: Точно, слегка напутал, тяжелый день был Я запускал С++ код Крипто с 100000000 итераций и выполнилось оно за 21 секунду (проверил еще раз). Мой код с тем же кол-вом итераций выполнился за 7 секунд.
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
И его же код нетронутый на С++ исполнялся 21 секунду, верно понял?Интеррапт wrote: Изначальный код Крипто (со 100 млн операций) у меня выполнялся 3 секунды. А у него 2.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Да. Но его код плохо оптмизирован, мой код быстрее. Думаю, что мой код на его машине будет приблизительно в районе 7 секунд тоже исполняться (ну может с разницей в компиляторе или ключах, плюс/минус несколько секунд).АццкоМото wrote:И его же код нетронутый на С++ исполнялся 21 секунду, верно понял?Интеррапт wrote: Изначальный код Крипто (со 100 млн операций) у меня выполнялся 3 секунды. А у него 2.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Object pool это хак с недостатками не имеющий отношение к ARC который мы тестируем. В этом алгоритме вообще можно ничего не выделять а обходится вычислениями payload, но мы же так ничего не протестируем.Интеррапт wrote:Но на самом деле мы нормальный тест проведем, когда я использую object pool.
Вот если бы можно было ключем прикрутить алокатор который преалоцирует указанное количество памяти и на new не дергает *alloc, это другое дело. Есть такое?
Потому что:И я резервирую за собой право использовать ссылки, не понимаю, почему я не могу это делать, если JIT используюет кучу всяких оптимизаций, а использование references в C++ - это самая обычная операция по оптимизации.
а) неочевидно включается ли АРК при таких раскладах
б) вы начинаете писать небезопасный код
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ну это все равно что сказать что все равно все микробенчмарки искувственные, напишите мне 2 одинаковых БД на джаве и ц++, а потом может поговорим.Интеррапт wrote: С какой это радости? References будут вполне безопасные в контекстах вашего теста. Иначе пишите другой тест, чтобы имитировать небезопасный код.
In vino Veritas!