Я очень не хочу встревать в горячий финнский спор, но накину таки немножко - нельзя сравнивать производительность двух вещей, выполняющих разные задачи. про то, что я вообще не верю в бОльшую производительность GC vs ARC я пейсать не буду, хрен с нимcrypto5 wrote:jvm разруливаем циклические ссылки, а ARC нет, не разруливат, и что да, garbage collectors производительней reference counting.
Переквалификация c#-> ??
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Я очень стараюсь.dotcom wrote:Начните с себя, пожалуйста.crypto5 wrote: Ну так приводите контр аргументы, назидательский тон обоснованный только фразами типа "идите почитайте" выглядит слегка неконструктивно.
Области интересов не совпадают.Спорить о недостатках C++ и ObjC ни разу не видев живого кода, и имея за плечами хоть 200К+ хоть 1М+ кода на Жабе, конструктивизма беседе никак не прибавит.
[/qoute]
Телепатия, как она есть.Давайте вместе напишем что-нибудь?
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Я очень стараюсь.dotcom wrote:Начните с себя, пожалуйста.crypto5 wrote: Ну так приводите контр аргументы, назидательский тон обоснованный только фразами типа "идите почитайте" выглядит слегка неконструктивно.
Области интересов не совпадают.Спорить о недостатках C++ и ObjC ни разу не видев живого кода, и имея за плечами хоть 200К+ хоть 1М+ кода на Жабе, конструктивизма беседе никак не прибавит.
[/qoute]
Телепатия, как она есть.Давайте вместе напишем что-нибудь?
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Я очень стараюсь.dotcom wrote: Начните с себя, пожалуйста.
Телепатия, как она есть.Спорить о недостатках C++ и ObjC ни разу не видев живого кода, и имея за плечами хоть 200К+ хоть 1М+ кода на Жабе, конструктивизма беседе никак не прибавит.
Области интересов не совпадают.Давайте вместе напишем что-нибудь?
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Задача одинаковая - освободить память автоматически не напрягая программиста.АццкоМото wrote:Я очень не хочу встревать в горячий финнский спор, но накину таки немножко - нельзя сравнивать производительность двух вещей, выполняющих разные задачи.crypto5 wrote:jvm разруливаем циклические ссылки, а ARC нет, не разруливат, и что да, garbage collectors производительней reference counting.
http://flyingfrogblog.blogspot.com/2011 ... -than.htmlпро то, что я вообще не верю в бОльшую производительность GC vs ARC я пейсать не буду, хрен с ним
In vino Veritas!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Если мы смотрим на задачу настолько общО, то еще выше производительность у кнопки RESETcrypto5 wrote:Задача одинаковая - освободить память автоматически не напрягая программиста.
я вообще хрен его знает, что они там намерялиcrypto5 wrote: http://flyingfrogblog.blogspot.com/2011 ... -than.html
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Я так понимаю, что автор не заморачивался никакой оптимизацией, ну вроде как включить BOOST_SP_USE_QUICK_ALLOCATOR для boost и т.п. Да и boost в этом отношении "тупее", потому как он же не на уровне комплятора работает. А вот в Objective-C компиляция/оптимизация для ARC будет умнее - там, где компилятор увидит, что нет смысла инкрементировать/декрементировать reference counter - то этого сделано и не будет.crypto5 wrote: http://flyingfrogblog.blogspot.com/2011 ... -than.html
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Там в коментах этот вопрос обсудили, получилось быстрее, но все равно в 4 раза медленнее OCaml.Интеррапт wrote:Я так понимаю, что автор не заморачивался никакой оптимизацией, ну вроде как включить BOOST_SP_USE_QUICK_ALLOCATOR для boost и т.п.crypto5 wrote: http://flyingfrogblog.blogspot.com/2011 ... -than.html
В очередной раз про escape alalysis, джава и возможно ocaml тоже увидят тоже самое.Да и boost в этом отношении "тупее", потому как он же не на уровне комплятора работает. А вот в Objective-C компиляция/оптимизация для ARC будет умнее - там, где компилятор увидит, что нет смысла инкрементировать/декрементировать reference counter - то этого сделано и не будет.
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Уверен, что еще кучу оптимизаций можно нарыть, включая в самом коде. А по честному если, то им нужно было замерять с C++11 где поддержка shared_ptr на уровне компилятора и где компилятор бы соптимизировал ненужные ref counts.crypto5 wrote: Там в коментах этот вопрос обсудили, получилось быстрее, но все равно в 4 раза медленнее OCaml.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Даже мельком глянув на код, сразу вижу, что авторы почему-то передают shared_ptr по значению даже там, где можно передавать по ссылке. Приличный такой оверхед получается, т.к. постоянно делаются ненужные копии.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Это несправедливый подход, т.к. он не будет работаь в многопоточной среде, но в коментах это тоже попробовали, там есть переписанный код с передачей by reference, все равно отставание получилось значительным.Интеррапт wrote:Даже мельком глянув на код, сразу вижу, что авторы почему-то передают shared_ptr по значению даже там, где можно передавать по ссылке. Приличный такой оверхед получается, т.к. постоянно делаются ненужные копии.
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Смотря как именно написать, там же не каждый указанный метод будет вызываться из разных потоков, а только несколько (или вообще один?). Так что вполне даже можно соптимизировать. И с чего вы взяли, что код, который использовался для тестирования OCaml - был thread-safe?crypto5 wrote:Это несправедливый подход, т.к. он не будет работаь в многопоточной среде, но в коментах это тоже попробовали, там есть переписанный код с передачей by reference, все равно отставание получилось значительным.Интеррапт wrote:Даже мельком глянув на код, сразу вижу, что авторы почему-то передают shared_ptr по значению даже там, где можно передавать по ссылке. Приличный такой оверхед получается, т.к. постоянно делаются ненужные копии.
А несправедливый подход - это использовать 3rd party library (в данном случае boost), даже не настроить ее толком и сравнивать со встроенным garbage collector, выдав броский заголовок "Boost's shared_ptr up to 10× slower than OCaml's garbage collection".
И вообще - такой тест для меня имел бы смысл, если бы использовался встроенный shared_ptr из C++11, чтобы оптимизатор мог оптимизировать все что нужно.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Мне кажется функциональная парадигма окамла не подразумевает написание thread unsafe кода в принципе, нету состояний которые меняются разными тредами, все работает через message passing.Интеррапт wrote:Смотря как именно написать, там же не каждый указанный метод будет вызываться из разных потоков, а только несколько (или вообще один?). Так что вполне даже можно соптимизировать. И с чего вы взяли, что код, который использовался для тестирования OCaml - был thread-safe?crypto5 wrote:Это несправедливый подход, т.к. он не будет работаь в многопоточной среде, но в коментах это тоже попробовали, там есть переписанный код с передачей by reference, все равно отставание получилось значительным.Интеррапт wrote:Даже мельком глянув на код, сразу вижу, что авторы почему-то передают shared_ptr по значению даже там, где можно передавать по ссылке. Приличный такой оверхед получается, т.к. постоянно делаются ненужные копии.
А какие по вашему бенефиты "встроенности" shared_ptr в С++11 в аспекте производительности?А несправедливый подход, это использовать 3rd party library и сравнивать со встроенным garbage collector. Такой тест для меня имел бы смысл, если бы использовался встроенный shared_ptr из C++11.
In vino Veritas!
-
- Уже с Приветом
- Posts: 198
- Joined: 15 Jan 2010 15:42
- Location: SFBA
Re: Переквалификация c#-> ??
В OCaml там все совсем не так здорово как кажется - http://stackoverflow.com/questions/6588 ... -abilitiescrypto5 wrote:Мне кажется функциональная парадигма окамла не подразумевает написание thread unsafe кода в принципе, нету состояний которые меняются разными тредами, все работает через message passing.
Он далеко не чисто функциональный, И standard library там не thread safe, так что "из коробки" там thread safety нет.
Правда его рантайм вроде как однопоточный вообще, так что это должно быть пофигу, наверное.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ну это то о чем я говорю, народ поднимает процессы которые пуляют друг в друга мессаджами, разделенного состояния нету. Так же и в ерланге, и в scala/akkavladich wrote:В OCaml там все совсем не так здорово как кажется - http://stackoverflow.com/questions/6588 ... -abilitiescrypto5 wrote:Мне кажется функциональная парадигма окамла не подразумевает написание thread unsafe кода в принципе, нету состояний которые меняются разными тредами, все работает через message passing.
Он далеко не чисто функциональный, И standard library там не thread safe, так что "из коробки" там thread safety нет.
Правда его рантайм вроде как однопоточный вообще, так что это должно быть пофигу, наверное.
In vino Veritas!
-
- Уже с Приветом
- Posts: 9035
- Joined: 25 Oct 2011 19:02
- Location: SVO->ORD->SFO
Re: Переквалификация c#-> ??
Ничего страшного. Я ради дружбы могу и в Жабу податься и в ее замечательные фреймворки.crypto5 wrote: Области интересов не совпадают.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Тем что компилятор может соптимизировать reference counting, например, вообще его не использовать в каких-то случаях.crypto5 wrote: А какие по вашему бенефиты "встроенности" shared_ptr в С++11 в аспекте производительности?
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Хотя идея в целом здравая, я не думаю, что дело в этом. Сам reference counting настолько дешев, что получить его отставание в 10 раз можно только каким-то очень креативным подходом. А креативный подход заборет и компилятор, к бабке ходить не нужноИнтеррапт wrote:Тем что компилятор может соптимизировать reference counting, например, вообще его не использовать в каких-то случаях.crypto5 wrote: А какие по вашему бенефиты "встроенности" shared_ptr в С++11 в аспекте производительности?
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ок, я вот накидал небольшой тест, который пытается напрягать память, если есть желание можете заимплементить альтернативную версию на ObjectiveC, C++, C++11 с ARC, и можно померятся у кого быстрее.Интеррапт wrote:Тем что компилятор может соптимизировать reference counting, например, вообще его не использовать в каких-то случаях.crypto5 wrote: А какие по вашему бенефиты "встроенности" shared_ptr в С++11 в аспекте производительности?
Если есть какие-то замечания и поправки к тесту, я выслушаю и внесу изменения.
Code: Select all
public class GCTest {
public static void main(String args[]) {
int COUNT = 100;
// init
Data data[] = new Data[COUNT];
for(int i = 0; i < COUNT; i ++) data[i] = new Data(i);
Data current = data[0];
// process
for(long iter = 0; iter < 100000000; iter ++) {
int nextIndex = (current.payload + 1) % COUNT;
Data newNode = data[nextIndex];
data[nextIndex] = new Data((current.payload + newNode.payload + 1) % COUNT);
current = newNode;
}
}
}
class Data {
public int payload;
Data(int payload) {
this.payload = payload;
}
}
Code: Select all
$ javac GCTest.java
$ time java -server GCTest
real 0m2.153s
user 0m2.000s
sys 0m0.190s
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
А GC хоть раз включился во время выполнения этого теста?crypto5 wrote:Ок, я вот накидал небольшой тест, который пытается напрягать память, если есть желание можете заимплементить альтернативную версию на ObjectiveC, C++, C++11 с ARC, и можно померятся у кого быстрее.
-
- Уже с Приветом
- Posts: 198
- Joined: 15 Jan 2010 15:42
- Location: SFBA
Re: Переквалификация c#-> ??
Мне казалось "функциональная парадигма" не имеет отношения к "поднимать процессы и пулять друг в друга месседжами". В однопоточной среде конечно трудно написать thread unsafe код, только это опять же не имеет отношения к функциональной парадигме. Там вроде как thread safety должна выходить действительно из-за отсутствия shared state, а не из-за того что мы физически рантайм ограничиваем одним тредом, как это в оКамле происходит.crypto5 wrote:Ну это то о чем я говорю, народ поднимает процессы которые пуляют друг в друга мессаджами, разделенного состояния нету. Так же и в ерланге, и в scala/akkavladich wrote:В OCaml там все совсем не так здорово как кажется - http://stackoverflow.com/questions/6588 ... -abilitiescrypto5 wrote:Мне кажется функциональная парадигма окамла не подразумевает написание thread unsafe кода в принципе, нету состояний которые меняются разными тредами, все работает через message passing.
Он далеко не чисто функциональный, И standard library там не thread safe, так что "из коробки" там thread safety нет.
Правда его рантайм вроде как однопоточный вообще, так что это должно быть пофигу, наверное.
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Переквалификация c#-> ??
Я считаю, нужно докинуть еще пару ноликов в iter < 100000000 и быть уверенным, что GC таки включился Хотя я слышал, что у каждого гуглера по 100 терабайт оперативки, так что и это не факт
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Переквалификация c#-> ??
Так тест вообще как бы не особо честный. Получается, что java vm навыделяет кучу памяти (которая у java таки довольно быстрая операция), а потом целиком весь процесс закроется похерив всю эту память и не дав GC возможности ее очистить.АццкоМото wrote:Я считаю, нужно докинуть еще пару ноликов в iter < 100000000 и быть уверенным, что GC таки включился Хотя я слышал, что у каждого гуглера по 100 терабайт оперативки, так что и это не факт
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Интеррапт wrote:Так тест вообще как бы не особо честный. Получается, что java vm навыделяет кучу памяти (которая у java таки довольно быстрая операция), а потом целиком весь процесс закроется похерив всю эту память и не дав GC возможности ее очистить.АццкоМото wrote:Я считаю, нужно докинуть еще пару ноликов в iter < 100000000 и быть уверенным, что GC таки включился Хотя я слышал, что у каждого гуглера по 100 терабайт оперативки, так что и это не факт
Code: Select all
time java -server -verbose:gc GCTest
2013-05-06T11:35:18.151-0700: 0.104: [GC 16448K->296K(62848K), 0.0012980 secs]
2013-05-06T11:35:18.171-0700: 0.125: [GC 16744K->272K(79296K), 0.0012930 secs]
2013-05-06T11:35:18.219-0700: 0.172: [GC 33168K->280K(79296K), 0.0012650 secs]
2013-05-06T11:35:18.260-0700: 0.214: [GC 33176K->304K(112192K), 0.0011560 secs]
2013-05-06T11:35:18.354-0700: 0.307: [GC 66096K->288K(112192K), 0.0013680 secs]
2013-05-06T11:35:18.435-0700: 0.388: [GC 66080K->280K(175616K), 0.0014010 secs]
2013-05-06T11:35:18.621-0700: 0.574: [GC 131864K->268K(175616K), 0.0019760 secs]
2013-05-06T11:35:18.782-0700: 0.736: [GC 131852K->284K(307200K), 0.0007870 secs]
2013-05-06T11:35:19.151-0700: 1.104: [GC 263388K->268K(307264K), 0.0021510 secs]
2013-05-06T11:35:19.476-0700: 1.429: [GC 263372K->252K(392768K), 0.0007920 secs]
2013-05-06T11:35:19.933-0700: 1.887: [GC 348860K->268K(375744K), 0.0011300 secs]
real 0m2.179s
user 0m2.060s
sys 0m0.140s
In vino Veritas!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Переквалификация c#-> ??
Ок, пусть это будет не функциональная парадигма, а парадигма актеров. Мне все равно какие термины использовать.vladich wrote:Мне казалось "функциональная парадигма" не имеет отношения к "поднимать процессы и пулять друг в друга месседжами". В однопоточной среде конечно трудно написать thread unsafe код, только это опять же не имеет отношения к функциональной парадигме. Там вроде как thread safety должна выходить действительно из-за отсутствия shared state, а не из-за того что мы физически рантайм ограничиваем одним тредом, как это в оКамле происходит.crypto5 wrote:Ну это то о чем я говорю, народ поднимает процессы которые пуляют друг в друга мессаджами, разделенного состояния нету. Так же и в ерланге, и в scala/akkavladich wrote:В OCaml там все совсем не так здорово как кажется - http://stackoverflow.com/questions/6588 ... -abilitiescrypto5 wrote:Мне кажется функциональная парадигма окамла не подразумевает написание thread unsafe кода в принципе, нету состояний которые меняются разными тредами, все работает через message passing.
Он далеко не чисто функциональный, И standard library там не thread safe, так что "из коробки" там thread safety нет.
Правда его рантайм вроде как однопоточный вообще, так что это должно быть пофигу, наверное.
In vino Veritas!