- 1
String methodName = (new Exception()).getStackTrace()[1].getMethodName();
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+85
String methodName = (new Exception()).getStackTrace()[1].getMethodName();
Вот как надо получать имя метода. Это вам не __func__ ...
lucidfox 14.06.2011 12:00 # +1
roman-kashitsyn 14.06.2011 12:07 # 0
gegMOPO4 14.06.2011 18:42 # +1
ingenuus 14.06.2011 12:50 # 0
gegMOPO4 14.06.2011 18:43 # +1
Lure Of Chaos 14.06.2011 21:33 # 0
и отродясь такого не было
roman-kashitsyn 15.06.2011 10:26 # +1
Lure Of Chaos 15.06.2011 10:28 # 0
guest 15.06.2011 12:14 # +2
3.14159265 15.06.2011 12:54 # +3
А С вообще намного быстрее чем Java.
[/CO]
guest 15.06.2011 13:25 # −1
absolut 15.06.2011 14:23 # +1
p.s. а вообще не равноценные сравнения, посадите жопорукого тоже на джабу тогда.
3.14159265 15.06.2011 16:43 # +3
К тому же Ваш пост обижает пидорасов.
guest 16.06.2011 03:05 # −2
Однажды, давным давно, говнокод сошелся во мнении, что на крестах пишут только пидорасы.
Не поминайте лихом. C††, аминь.
Lure Of Chaos 16.06.2011 14:31 # −3
признавая это утверждение, всем пришлось признать, что они пидоры со стажем.
3.14159265 16.06.2011 14:37 # 0
И где здесь кресты, LinuxGovno ?
Вроде как мы говорили о Си.
алсо самофикс
>то жигуль обгонит ламборджини в 2 счета.
absolut 16.06.2011 14:47 # 0
ламборГини
3.14159265 16.06.2011 15:37 # 0
Си++
все в соответствии с оригиналом
guest 17.06.2011 12:33 # 0
absolut 17.06.2011 14:42 # 0
carsten 21.06.2011 17:44 # 0
по-итальянски оно Lamborghini, и в итальянском специально пишут -h-, чтобы показать, что читается 'г', а не 'дж'.
Таким же образом ghetto - гетто, а не джетто.
Тупые пидарасы.
guestinho 29.12.2016 20:14 # −2
ProctologistForYou 29.12.2016 22:50 # 0
guest 04.07.2011 13:52 # 0
>Ваш пост обижает пидорасов.
Неужели пидорасы считают, что на сях писать западло и обидно?
Lure Of Chaos 15.06.2011 16:20 # −1
зря вы так. Это уже давно не так. Где-то кто-то даже замеры проводил... Конечно, интерпретируемый код никогда не станет быстрее нативного, но скорости уже сравнимы.
З.Ы. Если раньше разница была х100 раз, то сейчас где-то х1.1
похоже Java-процессоров ждать уже приходится
3.14159265 15.06.2011 16:38 # +4
ага.
inb4 prooflinks paste from lm
В холиварах жабакодеры любят приводить в качестве главного аргумента того, что жаба не тормозит, линки на бенчмарки, в которых сравнивается скорость нативного кода и жабо-байткода. Обычно заголовки таких тестов выглядят в духе «Жаба обгоняет по производительности С++» и приводится код, где Java быстрее C/C++ (нужное подчеркнуть). Это происходит по нескольким причинам:
1. Такие бенчмарки примитивны: они работают только со скалярными типами (с такими, как int, double), память под которые выделяется на стеке, используются простые операции и, наконец, весь код находится только в одном классе.
2. Компилятор Java уверен, что программист - дебил, поэтому за программиста производит улучшения кода на этапе компиляции. Так например что-то вроде int c = 1000; for (int i = 0; i < 100000; i++) { c++; ... } будет приведено к чему-то вроде inc c; for (c = 1000; c < 101000; c++) { ... }, в то время как компилятор C уверен что программист знает что делает, и добросовестно скомпилирует самый дебильный код.
3. Обычно такие тесты содержат много циклов, а замеры проводятся не во время первого запуска, а когда JIT-компилятор уже отработал. Значит, меряется скорость хорошо оптимизированного динамически скомпилированного кода. Да и garbage collector не успевает в таких программах отработать.
4. Авторы бенчмарков зачастую поверхностно знают C/C++ и используют его в «жабьем» стиле, например используя кучу там, где она не нужна (и ноют про необходимость free и delete).
gegMOPO4 15.06.2011 19:34 # +3
Насчёт остального — тремя руками за (особенно п.4).
bugmenot 15.06.2011 21:32 # 0
gegMOPO4 15.06.2011 21:58 # 0
Lure Of Chaos 16.06.2011 14:57 # −1
а заодно и по всем пунктам. Уж если сравнивать быстродействие, то код бенчмарков должен быть эквивалентен.
Так что текст необъективен, явно прослеживается тенденция укусить жабакодеров, на голом месте обвиняя их в читерстве и подсиживании (мол, используются скрытые оптимизации, а код на С++ нарочито крив), при этом используется подмена понятий
> например используя кучу там, где она не нужна
ладно, даже, по пунктам:
1. "работают только со скалярными типами". Отлично, прямо вижу, как охота обогнать на повороте, поскольку в С\С++ строки- это последовательность байтов, тогда как в жабке - это объекты
"спользуются простые операции и, наконец, весь код находится только в одном классе" - бенчмарк должен быть простым, нет? сложный бенчмарк быстро бы наполнился говнокодом, в котором трудно уследить "обгон на поворотах"
2. Все современные компиляторы стараются оптимизировать код по мере их интеллекта
3. "Обычно такие тесты содержат много циклов" - а без циклов будете наносекунды сравнивать? Подмена понятий
"а когда JIT-компилятор уже отработал. Значит, меряется скорость хорошо оптимизированного динамически скомпилированного кода". Опять подмена понятий. То есть, жаба должна код постоянно "компилировать" подобно "чистому" интерпретатору? Позвольте, но тут же явно получит преимущество уже скомпилированный код.
"Да и garbage collector не успевает в таких программах отработать" - пардон, но в С++ его вообще нет! Хорошо, можно есть вызывать System.gc(), но надо учитывать при этом, что он уберет не созданный объект, а вхолостую будет пересматривать "где тут еще грязь?", что, конечно, сразу снизит скорость.
guest 16.06.2011 21:59 # 0
std::string не пробовали? Объекты в С++ между прочим, ага.
Lure Of Chaos 16.06.2011 14:57 # 0
Да, мне обидно за топики "Жаба обгоняет по производительности С++", где, конечно, нечестная игра ведется уже с противоположной стороны. Но я и не берусь заявлять подобное.
Я всего лишь хочу искоренить древний миф "Жаба - это такое толстое и ужасно неповоротливое существо, на котором только хелловорлды писать, а программа посложнее надежно повесит даже суперкопьютер".
Вернемся на исходные мои "Конечно, интерпретируемый код никогда не станет быстрее нативного, но скорости уже сравнимы. З.Ы. Если раньше разница была х100 раз, то сейчас где-то х1.1"
3.14159265 16.06.2011 15:47 # +1
в С/C++ очистка производится вручную free/delete и на это также уходит время.
Если в яве рано или поздно не вызывать gc - она просто засрет все.
>сложный бенчмарк быстро бы наполнился говнокодом
правильно нужно писать такие бенчи
for (i=0; i<100500;i++) sum+=sin(i);
которые совершенно не отражают реалий.
>сейчас где-то х1.1
вот свежий и более менее объективный бенч от гугла
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf
Lure Of Chaos 16.06.2011 17:52 # 0
удалить один обьект сразу быстрее, чем пробуждать целый поток с его хз какими сложными алгоритмами (который к тому же может решить, что сейчас делать он ничего не будет, а оставит на потом = ) )
> Если в яве рано или поздно не вызывать gc - она просто засрет все.
два момента:
1. System.gc() не обязателен, это только тормошение сборщика, а то сам он хз когда решит поработать
2. если delete безусловно удалит объект (правильно это или нет), то сборщик может отказаться удалять, и тот будет висеть в памяти даже до завершения JVM, поэтому кажется, что жаба жрет память.
А на самом деле это,наверное,самая распространенная ошибка даже неглупых жабакодеров, т.к. что бы объект был собираемым, нужно не только зануллить ссылку на него, но и отцепить от других объектов (например, разрегистрировать слушателей).
И это не всегда тривиальная задача, отследить и удалить все связи (например, классы ссылаются на загрузившие их класслоадеры, которые тоже надо удалять)
> которые совершенно не отражают реалий.
бенчи на то и бенчи, что бы быть бесполезными в других аспектах. Тогда уж брать сложные реальные приложения в качестве бенчей... Ну сами понимаете, смешно.... = )
Lure Of Chaos 16.06.2011 17:53 # 0
bugmenot 16.06.2011 20:16 # 0
Когда-то давно обсуждался сборщик JVM и пришли к выводу, что он гарантированно сработает при попытке распределить на куче больше байт, чем в данный момент помечено свободными, т.е. в один прекрасный миг накладные расходы распределения будут суммированы с неявным освобождением.
carsten 21.06.2011 18:10 # 0
Ну это верно только для ранних горе-оптимизаторов. Т.е. чувак видит, что в его хелловорлде жабка использует 100 мб -- цокает языком, что за ужас, говорит. Только он забывает, что жабка это намеренно делает и с запасом, т.к. видит, что в системе 99% времени оперативка и так простаивает с незанятыми ~60-70%.
Т.е. человек заботится о оперативной памяти, которую он нифига не юзает.
Если памяти маловато, то и сборок мусора почаще должно быть, и выделять память про запас меньше будет.
Смешные эти, горе-оптимизаторы, право.
guest 16.06.2011 22:07 # 0
Тоесть, если программист С++ уг и все выделяет в куче, то какой смысл в сравнении производительности, языковые возможности С++ не использовались на максимум. Это уже бы получилось измерение человеческого фактора, а не сравнения производительности.
guest 16.06.2011 22:13 # 0
Можно будет смело юзать кучу в тестах на обоих языках, если хочется честности.
carsten 21.06.2011 17:48 # 0
это полное враньё, в Java компилятор (javac) известен тем, что вообще почти ничё не оптимизирует. это сделано специально, чтобы больше было пространства для оптимизации джиттером. алсо он так говорит как будто с++ ничего не оптимизирует. там-то он не считает программиста за "дебила", ага.
carsten 21.06.2011 17:56 # −1
Ага, зато когда с++-программисты делают бенчмарки, чтобы доказать, что жаба тормознее, обыкновенно они сами плохо знают жабу и делают всё в приплюснутом виде (и не знают про то, что можно жабу тюнинговать, та же серверная опция убыстряет код порою раза в два). Шило на мыло.
>Такие бенчмарки примитивны: они работают только со скалярными типами
Тут вообще имхо смешно, если сравнить с предыдущей цитатой. Т.е. если в бенчмарке Жабой используется "скалярный тип" (т.е. грубо говоря работа в стеке + копирования) -- то это неправильный бенчмарк (где жаба выигрывает). Зато вот если в С++ используется стек вместо кучи -- то это правильный бенчмарк (ведь при работе с кучей С++ сильно проигрывает, ибо в Java быстрейший bump-pointer allocator), а на оборотне правильно.
Смешная цитата.
carsten 21.06.2011 18:17 # 0
например используют синхронизованные контейнеры в однопоточном бенчмарке, в то время как нужно использовать несинхронизованные
carsten 21.06.2011 18:06 # −2
Ну это справедливо только для хелловорлдов. Там-то да, пока система запустится, пока всё отджиттится -- дольше времени проходит, чем вывести "Hello, World!" А вот в реальных условиях, т.к. он выполняет только один раз на метод, оверхед настолько мал, что вообще ни на что особо не влияет.
>Значит, меряется скорость хорошо оптимизированного динамически скомпилированного кода.
Ой-ой-ой, жаба выдала хорошо оптимизированный динамически скомпилированный кода за 1 миллисекунду на час работы приложения. Как нехорошо! Неправильно! *цокает языком* Вот то ли дело С++ -- там плохо оптимизированный статически скомпилированный код -- вот там всё правильно и ок.
guest 23.06.2011 12:38 # 0
Такое может быть, только если отключите оптимизацию.
Компиляторы с\с++ настолько давно используются, что за это время оптимизаторы успели отточить лучше, чем в любых других языках.
carsten 21.06.2011 17:39 # 0
В C# умнее -- стектрейс заполняется только при throw.
Ну и само (new Exception()).stackTrace() выглядит как костыль.
В C# было бы new StackTrace().GetFrame(1).GetMethod() -- причём возвращает не просто имя, а ссылку на объект рефлексии, и там уж делай чё хошь.
redrick 23.06.2011 08:54 # 0
redrick 04.07.2011 12:49 # 0