один вопрос по поводу скидок и вообще покупки: покупая одну персональную лицензию нужно указывать os под которую покупаешь?
так уж получилось, что периодически работаю на разных ос (винда, линукс), поэтому интересно обойдусь я одной лицензией или нужно будет по лицензии на каждую ось.
ну имеется у меня хорошая видюха и задача по перемалыванию данных,
написал прогу на java
Rootbeer:
+ использует CUDA, соответвенно для сугубо вычислительных задач можно получиться хорошее ускорение
— ну да, нельзя всю мощь java использовать, но нам же только посчитать для примера хеш или еще чего, так что объектной модели серьезной там и не пахнет
Aluz:
+ для промышленных систем возможно и применима
— купить железку на 864 ядра для запуска ява машины, но допустим мы просто заюзаем софтварную версию, но тогда упираемся в количество ядер нашего проца и приплыли…
— купить саму jvm, которая тоже не совсем копейки стоит
Так что ваше сравнение, мягко говоря, не в тему.
P.S. хватит уже пиарить Aluz, я понимаю что вам она может нравиться, но так откровенно пытаться пиарить ее не нужно, лучше расскажите плюсы на реальных задачах + корректные тесты приведите, некоторые тесты из разряда — попытался запустить, не сильно понравилось скорость или сырой g1, зато вот в azul мы настроили то-то и то-то.
я против: «у нас что-то не работает, ставим точки остановки и начинаем клацать next пока не вывалиться ошибка», после этого повторяем еще сто раз, сама проблема в мозгу смазывается попытками уследить где и что меняется, большинство людей которые работают в дебагере именно так и поступают.
полностью согласен с методом: «падает вот тут, добавим несколько контрольных точек, уже между ними делаем next и смотря в код пытаемся понять что не так», но вот только этот метод в большинстве случаев покрывается добавлением в нужных местах вывода логов + по логу можно быстрее оценить как развивалась ситуация в динамике, а время освободившееся потратить на обдумывание проблемы.
core dump эта классика, если работаешь с системами которые не поверх каких vm, то must have, к тому же частенько анализ дампа требует знаний asm, так как собранный без дебаг инфы бинарь так просто не посмотришь =) а это уже соооовсем другой уровень навыков, а не junior после курсов
контекст1: написание файловой системы с поддержкой дедупликации для linux (такой небольшой just for fun), работа в виде модуля, при большом желании я понимаю что можно зарулить remote debuggin с помощью qemu + gdb
контекст2: проблемы с выводом графики и звука на андроид девайсе, когда пытаешься спортировать на свой девайс свежую версию, изменения в ядре + сишных либах, удаленный дебаг вообще недоступен, так как все эти действия проходят еще до инициализации интерфесов сторонних типо usb
Я не отрицаю, что умение пользоваться дебагером полезное умение, в некоторых случаях он действительно полезен, хороший пример анализ core dump после краха программы, но говорить: «не умеешь использовать дебагер, то не умеешь работать» — неправильно
так, давайте определимся что подразумеваете под словом «отладка»
если умение пользоваться дебагером, то по моему это отнють не обязательный навык,
вначале и я так думал: как же так, в vs__ для с++ есть такой хороший отладчик, как же люди могут кодить для linux без такого необходимого инструмента
потом осилил умение в нужном месте добавить вывод лога, в итоге log + небольшая медитация над кодом с прокручиванием его в уме заменяет дебагер в 100% случаев.
хоть профессионально занимаюсь java и тут на отладчики грех жаловаться, но как-то не испытываю необходимости в них, по скорости поиска проблем в работе опережаю тех кто сидит и жмет в дебагере «next», а для некоторых задач отладка неприменима в принципе (пример: небольшой игровой сервер на котором висит пару сотен человек онлайн, tcp соединения в котором гоняются данные, ошибка проявляется случайным образом, представить как я сделаю брекпоинт не зафейлив сессию я что-то не могу)
p.s. страшно признаться, но так и не научился работать с дебагером для tomcat, jboss. только log, только hardcore
>> Основная проблема — индивидуальный просчет атаки и защиты каждого юнита (упрощать алгоритм не хотелось)
То есть вы хотите сказать, что оставив достаточно сложный алгоритм полностью как есть, без изменения его структуры переписали его с языка высокого уровня на асм? Можно статью на хабре с мастер-классом, я бы с большим удовольствием почитал.
Простая игра с типами данных (boxing-unboxing, ArrayList-LinkedList, HashMap — хеш для примитивных типов из того же colt) может дать хороший прирост, но без изменения самой логики (не обязательно упрощать, достаточно отбрасывать заранее ненужные рассчеты) я просто НЕ ВЕРЮ, что вы сделали это:
>> (несколько часов — один бой). После написания библиотеки на ассемблере, средний бой считается доли секунды, крупные — несколько секунд.
Индивидуально просчитать действия для каждого юнита, а их несколько миллионов за каждую сторону, отсортировать результат выживших (а он после каждого из хода тоже на миллионы) и уложиться в несколько секунд.
Я знаю что у явы бывают узкие места, но тут кто-то откровенно врет.
p.s. а можно описание этого алгоритма? просто для саморазвития
>> А вот если все сторонние источники финансирования исчерпаны, то тогда за счёт бюджета, возможно даже в виде кредита и обязательством отработать N лет на непривлекательных по каким-то причинам должностях (ака распределение).
Хорошо рассуждать до тех пор пока ты не столкунлся с этим распределением, но одно дело поработать на «непривлекательных должностях» по профилю, а другое дело когда на этих должностях ты занимаешься ерундой.
Сам отрабатывал на должности программиста, в лучшем случае тебе попадется Delphi, в более худшем FoxPro или Clipper, в совсем печальных будете сидеть день и ничего не делать, так как должность есть, а работы как таковое нету, только проверить что у бухов 1с работает (знакомые не стремящиеся к работе днями в DotA рубились, делать было нечего больше), про то что на должностях сисадмина ты будешь или сам заправлять катриджи или кататься их по городу на заправку возить я не говорю, это подразумевается само собой, в подчинении у тебя 1-2 сервера под виндой, может даже на пару компах 1с, это все. В общем случае 2 года деградации и если после этих 2х лет ты не уходишь куда в нормальную фирму, то можно смело записывать минус 1 айтишник.
Да, я из Беларуси, у нас такое есть и я с этим столкнулся лично. Если бы не получилось совмещать распределение и настоящую работу, то увольнялся бы и платил за обучение.
p.s. А называется это распределение красивой фразой «гарантированное право выпускника на первое рабочее место» =) отличное право, плавно перетекающее в обязанность. Пока только для бюджетников, но упорно из года в год ходят слухи об предоставлении этого «права» и платникам.
>> Dalvik JVM использует архитектуру, основанную на регистрах против стековой архитектуры в других JVM, что приводит к увеличению скорости выполнения и уменьшению размеров бинарников.
Это каких других?
HotStop от санок — стековый
JRockit от bea — стековый
Apache Harmony — регистровый, разработка загнулась так как апачи ни хотели покупать kit на проверку совместимости, а бесплатный не позволял им лицензироваться и называться jvm для работы в киосках и на мобилках, большинство наработок ушли в DalvikVM
По поводу стековости java для начала советую посмотреть во что jit превращает ваш код, поверьте параметры очень хорошо и часто передаются и в обычной java через регистры. А выражения «так как у нас регистровая vm, то она быстрее работает» во фразах разработчиков за последние несколько лет превратились «так как у нас регистровая vm, то для нее проще было написать более быстрый интерпретатор чем в стандартной java, а после проще написать jit». К тому же: javame на арм процессах умела jit еще когда андроид только начинался и обычных числодробильных тестах всегда уделывала dalvikvm.
По логу работы gc сразу видно отключен escape analysis или нет, поэтому лезть в исходники нет необходимости.
В моем простейшем примере при включенном escape analysis gc должен срабатывать 1 раз перед самым выходом из программы, все остальные чистки проводятся без него, так как анализ позволяет отследить недоступный объект и сразу его грохает.
А вот когда анализ отключен, то количество вызовов должно быть намного больше 1, что и наблюдалось.
Еще раз уточню картину:
1. все знают что в g1 память разбивается на набор регионов, когда в регионе нету места, то он помечается полным и объекты находящиеся в нем отправляются на эвакуацию (что живые перемещаются в другие регионы, мертвые прибиваются).
2. в 1.7 почти так и происходило, по логу за время работы использовалось 2-3 региона, т.е. пишем в один, чистим другой, переключаемся и повторно заполняем, поэтому и расход памяти был не намного выше заданного на старте минимума (256мб). Количество gc отличается от 1 несколькими порядками.
3. в 1.6 происходило заполнение всей памяти отведенной под max, после этого запускался stw, чистилось несколько gb памяти, после этого опять начиналось заполнение всей доступной памяти
4. как уже выше говорилось при escape analysis использование памяти ниже, скорость работы выше, количество срабатываний gc не превышает 2х.
Из опыта тестирования этого G1 в 1.6 и 1.7:
1. пишем класс который будет генерить много объектов (простейший цикс с пачкой new Object())
2. запускаем с отключенным ескейп анализом (-XX-DoEscapeAnalysis) и включенным детальным логом по gc
3. дефолтные сборщики, что на 1.6 что на 1.7 работают вменяемо
4. на 1.7 G1 работает так же как и дефолтный (скорость выполнения всего класса, максимальный размер алоцированной памяти, время программы проведенной в gc)
5. на 1.6 G1 в 10 раз больше времени проводит за чисткой мусора и соответсвенно тест занимает в 10 раз больше времени
В 1.7 после перехода на новый регион корректно очищает предыдущий
В 1.6 пока весь max не выжрет будет аллоцироваться в новый регион, а уже потом stop the world и чистка всего и вся.
С -XX+DoEscapeAnalysis включенным по дефолту конечно все нормально в обоих версиях, но данный пример для меня был хорошим показателем, что в 1.7 G1 допилен на новый уровень
да, баг есть баг,
но не знаю случаев когда название переменную в Statement должно пересекаться с Expression, по-моему это уже явное отхождение от всех правил.
для затравки баг из 5й явы, возможно исправлен в версиях с платной поддержкой, но в публичной присутсвует, в 6й отсутсвует:
7 знаков это еще нормаль, а вот когда смотришь на телевизор за 35 000 000 начинаешь задумываться зачем столько нулей.
Для справки всех здесь присутсвующих: офф курс на 27/12/2012 1$=8370, 1euro=10970, 1рос рубль = 276
вот такие вот веселые курсы
А если брать EasyPay, то у них вся работа через браузер, никаких вебсервисов нету и в помине. На вопрос можно ли написать какой простейший виджет и дергать их api:
К сожалению, пока такой возможности нету для пользовательских кошельков. В будущем она планируется.
Вы можете контролировать изменение баланса через e-mail уведомления.
Спасибо за информацию и внимание к системе.
В общем даже и не знаю почему в рб она у многих популярна
И опять же встает вопрос о цене. Обещания были о том, что цены будут в начале декабря, потом перенесены сроки на середину декабря, потом тишина. Уже заканчивается январь, а цен все еще нету.
ничем не помешает, вот только память вернется в хип только после второго gc:
1. создали объект с finalize
2. закончилась память, дернули gc
3. gc дернул метод finalize у нашего объекта, удалил обычные объекты
4. продолжаем работать, опять закончилась память, дернули gc
5. gc видит наш объект и finalize уже отработан, удаляет объект и возвращает память
таким образом для сборки объекта с finalize должно пройти 2 gc вместо одного.
В случае с примером выше: имея объект с finalize мы дергаем gc один раз и достаточно памяти не получаем, так как объект еще не удалился, получаем oom.
Но изменяя пример на: e = null;
System.gc();
System.gc();
Мы гарантировано собираем даже такие объекты и пример отрабатывает без oom, вот только в продакшен коде за дерганье gc надо руки отрывать, так что работать с finalize нужно очень осторожно.
Немного не так: на вход у вас каждый раз новые строки, соответсвенно ради хранения нескольких символов вы будете держать в памяти весь массив на 10000 элементов.
Если у вас одна большая строка и множество вызовов substring от нее, тогда да, получаем даже выигрыш по памяти, так как value[] не дублируется.
в этом то и проблема:
1. на вход подается строка из 10000 символов
2. вы получаете префикс с 2го по 5й символ
3. создается новая строка с проставленными offset, count, value
так уж получилось, что периодически работаю на разных ос (винда, линукс), поэтому интересно обойдусь я одной лицензией или нужно будет по лицензии на каждую ось.
написал прогу на java
Rootbeer:
+ использует CUDA, соответвенно для сугубо вычислительных задач можно получиться хорошее ускорение
— ну да, нельзя всю мощь java использовать, но нам же только посчитать для примера хеш или еще чего, так что объектной модели серьезной там и не пахнет
Aluz:
+ для промышленных систем возможно и применима
— купить железку на 864 ядра для запуска ява машины, но допустим мы просто заюзаем софтварную версию, но тогда упираемся в количество ядер нашего проца и приплыли…
— купить саму jvm, которая тоже не совсем копейки стоит
Так что ваше сравнение, мягко говоря, не в тему.
P.S. хватит уже пиарить Aluz, я понимаю что вам она может нравиться, но так откровенно пытаться пиарить ее не нужно, лучше расскажите плюсы на реальных задачах + корректные тесты приведите, некоторые тесты из разряда — попытался запустить, не сильно понравилось скорость или сырой g1, зато вот в azul мы настроили то-то и то-то.
я против: «у нас что-то не работает, ставим точки остановки и начинаем клацать next пока не вывалиться ошибка», после этого повторяем еще сто раз, сама проблема в мозгу смазывается попытками уследить где и что меняется, большинство людей которые работают в дебагере именно так и поступают.
полностью согласен с методом: «падает вот тут, добавим несколько контрольных точек, уже между ними делаем next и смотря в код пытаемся понять что не так», но вот только этот метод в большинстве случаев покрывается добавлением в нужных местах вывода логов + по логу можно быстрее оценить как развивалась ситуация в динамике, а время освободившееся потратить на обдумывание проблемы.
core dump эта классика, если работаешь с системами которые не поверх каких vm, то must have, к тому же частенько анализ дампа требует знаний asm, так как собранный без дебаг инфы бинарь так просто не посмотришь =) а это уже соооовсем другой уровень навыков, а не junior после курсов
контекст1: написание файловой системы с поддержкой дедупликации для linux (такой небольшой just for fun), работа в виде модуля, при большом желании я понимаю что можно зарулить remote debuggin с помощью qemu + gdb
контекст2: проблемы с выводом графики и звука на андроид девайсе, когда пытаешься спортировать на свой девайс свежую версию, изменения в ядре + сишных либах, удаленный дебаг вообще недоступен, так как все эти действия проходят еще до инициализации интерфесов сторонних типо usb
Я не отрицаю, что умение пользоваться дебагером полезное умение, в некоторых случаях он действительно полезен, хороший пример анализ core dump после краха программы, но говорить: «не умеешь использовать дебагер, то не умеешь работать» — неправильно
если умение пользоваться дебагером, то по моему это отнють не обязательный навык,
вначале и я так думал: как же так, в vs__ для с++ есть такой хороший отладчик, как же люди могут кодить для linux без такого необходимого инструмента
потом осилил умение в нужном месте добавить вывод лога, в итоге log + небольшая медитация над кодом с прокручиванием его в уме заменяет дебагер в 100% случаев.
хоть профессионально занимаюсь java и тут на отладчики грех жаловаться, но как-то не испытываю необходимости в них, по скорости поиска проблем в работе опережаю тех кто сидит и жмет в дебагере «next», а для некоторых задач отладка неприменима в принципе (пример: небольшой игровой сервер на котором висит пару сотен человек онлайн, tcp соединения в котором гоняются данные, ошибка проявляется случайным образом, представить как я сделаю брекпоинт не зафейлив сессию я что-то не могу)
p.s. страшно признаться, но так и не научился работать с дебагером для tomcat, jboss. только log, только hardcore
>> Задача стояла достаточно простая — большая куча данных и 4 элементарных математических действий.
В этом случае да, mmx и sse вам в руки, но уж как-то смутило про грамотный выбор, сортировку и индивидуальный подход к каждому юниту
То есть вы хотите сказать, что оставив достаточно сложный алгоритм полностью как есть, без изменения его структуры переписали его с языка высокого уровня на асм? Можно статью на хабре с мастер-классом, я бы с большим удовольствием почитал.
Простая игра с типами данных (boxing-unboxing, ArrayList-LinkedList, HashMap — хеш для примитивных типов из того же colt) может дать хороший прирост, но без изменения самой логики (не обязательно упрощать, достаточно отбрасывать заранее ненужные рассчеты) я просто НЕ ВЕРЮ, что вы сделали это:
>> (несколько часов — один бой). После написания библиотеки на ассемблере, средний бой считается доли секунды, крупные — несколько секунд.
Индивидуально просчитать действия для каждого юнита, а их несколько миллионов за каждую сторону, отсортировать результат выживших (а он после каждого из хода тоже на миллионы) и уложиться в несколько секунд.
Я знаю что у явы бывают узкие места, но тут кто-то откровенно врет.
p.s. а можно описание этого алгоритма? просто для саморазвития
Хорошо рассуждать до тех пор пока ты не столкунлся с этим распределением, но одно дело поработать на «непривлекательных должностях» по профилю, а другое дело когда на этих должностях ты занимаешься ерундой.
Сам отрабатывал на должности программиста, в лучшем случае тебе попадется Delphi, в более худшем FoxPro или Clipper, в совсем печальных будете сидеть день и ничего не делать, так как должность есть, а работы как таковое нету, только проверить что у бухов 1с работает (знакомые не стремящиеся к работе днями в DotA рубились, делать было нечего больше), про то что на должностях сисадмина ты будешь или сам заправлять катриджи или кататься их по городу на заправку возить я не говорю, это подразумевается само собой, в подчинении у тебя 1-2 сервера под виндой, может даже на пару компах 1с, это все. В общем случае 2 года деградации и если после этих 2х лет ты не уходишь куда в нормальную фирму, то можно смело записывать минус 1 айтишник.
Да, я из Беларуси, у нас такое есть и я с этим столкнулся лично. Если бы не получилось совмещать распределение и настоящую работу, то увольнялся бы и платил за обучение.
p.s. А называется это распределение красивой фразой «гарантированное право выпускника на первое рабочее место» =) отличное право, плавно перетекающее в обязанность. Пока только для бюджетников, но упорно из года в год ходят слухи об предоставлении этого «права» и платникам.
Это каких других?
HotStop от санок — стековый
JRockit от bea — стековый
Apache Harmony — регистровый, разработка загнулась так как апачи ни хотели покупать kit на проверку совместимости, а бесплатный не позволял им лицензироваться и называться jvm для работы в киосках и на мобилках, большинство наработок ушли в DalvikVM
По поводу стековости java для начала советую посмотреть во что jit превращает ваш код, поверьте параметры очень хорошо и часто передаются и в обычной java через регистры. А выражения «так как у нас регистровая vm, то она быстрее работает» во фразах разработчиков за последние несколько лет превратились «так как у нас регистровая vm, то для нее проще было написать более быстрый интерпретатор чем в стандартной java, а после проще написать jit». К тому же: javame на арм процессах умела jit еще когда андроид только начинался и обычных числодробильных тестах всегда уделывала dalvikvm.
В моем простейшем примере при включенном escape analysis gc должен срабатывать 1 раз перед самым выходом из программы, все остальные чистки проводятся без него, так как анализ позволяет отследить недоступный объект и сразу его грохает.
А вот когда анализ отключен, то количество вызовов должно быть намного больше 1, что и наблюдалось.
Еще раз уточню картину:
1. все знают что в g1 память разбивается на набор регионов, когда в регионе нету места, то он помечается полным и объекты находящиеся в нем отправляются на эвакуацию (что живые перемещаются в другие регионы, мертвые прибиваются).
2. в 1.7 почти так и происходило, по логу за время работы использовалось 2-3 региона, т.е. пишем в один, чистим другой, переключаемся и повторно заполняем, поэтому и расход памяти был не намного выше заданного на старте минимума (256мб). Количество gc отличается от 1 несколькими порядками.
3. в 1.6 происходило заполнение всей памяти отведенной под max, после этого запускался stw, чистилось несколько gb памяти, после этого опять начиналось заполнение всей доступной памяти
4. как уже выше говорилось при escape analysis использование памяти ниже, скорость работы выше, количество срабатываний gc не превышает 2х.
1. пишем класс который будет генерить много объектов (простейший цикс с пачкой new Object())
2. запускаем с отключенным ескейп анализом (-XX-DoEscapeAnalysis) и включенным детальным логом по gc
3. дефолтные сборщики, что на 1.6 что на 1.7 работают вменяемо
4. на 1.7 G1 работает так же как и дефолтный (скорость выполнения всего класса, максимальный размер алоцированной памяти, время программы проведенной в gc)
5. на 1.6 G1 в 10 раз больше времени проводит за чисткой мусора и соответсвенно тест занимает в 10 раз больше времени
В 1.7 после перехода на новый регион корректно очищает предыдущий
В 1.6 пока весь max не выжрет будет аллоцироваться в новый регион, а уже потом stop the world и чистка всего и вся.
С -XX+DoEscapeAnalysis включенным по дефолту конечно все нормально в обоих версиях, но данный пример для меня был хорошим показателем, что в 1.7 G1 допилен на новый уровень
но не знаю случаев когда название переменную в Statement должно пересекаться с Expression, по-моему это уже явное отхождение от всех правил.
для затравки баг из 5й явы, возможно исправлен в версиях с платной поддержкой, но в публичной присутсвует, в 6й отсутсвует:
System.out.println(new Object() {
public String toString() {
return null;
}
}
ловим в глубине системных классов NPE =)
Баг в том, что считается что toString() уже возвращает строку, а следовательно можно взять length и тд, проверок никаких не делается.
Для справки всех здесь присутсвующих: офф курс на 27/12/2012 1$=8370, 1euro=10970, 1рос рубль = 276
вот такие вот веселые курсы
А если брать EasyPay, то у них вся работа через браузер, никаких вебсервисов нету и в помине. На вопрос можно ли написать какой простейший виджет и дергать их api:
К сожалению, пока такой возможности нету для пользовательских кошельков. В будущем она планируется.
Вы можете контролировать изменение баланса через e-mail уведомления.
Спасибо за информацию и внимание к системе.
В общем даже и не знаю почему в рб она у многих популярна
бету второй версии что описана выше выпустили только 18.01.2012
в итоге видно что обычный Keenetic у них в качестве тестового полигона, а для остальных версий позже допиливают
1. создали объект с finalize
2. закончилась память, дернули gc
3. gc дернул метод finalize у нашего объекта, удалил обычные объекты
4. продолжаем работать, опять закончилась память, дернули gc
5. gc видит наш объект и finalize уже отработан, удаляет объект и возвращает память
таким образом для сборки объекта с finalize должно пройти 2 gc вместо одного.
В случае с примером выше: имея объект с finalize мы дергаем gc один раз и достаточно памяти не получаем, так как объект еще не удалился, получаем oom.
Но изменяя пример на:
e = null;
System.gc();
System.gc();
Мы гарантировано собираем даже такие объекты и пример отрабатывает без oom, вот только в продакшен коде за дерганье gc надо руки отрывать, так что работать с finalize нужно очень осторожно.
Если у вас одна большая строка и множество вызовов substring от нее, тогда да, получаем даже выигрыш по памяти, так как value[] не дублируется.
по поводу только синтетики, то этот флаг уже очень давно стоит по умолчанию, и чтобы показать как jvm не может его приходится ручками отключать.
4. в value попадают все 10000 символов
5. сам префикс сохраняем в какой коллекции
5. повторяем итерациюю 1000 раз
Ожидаемый размер занятой памяти примерно = 4(символа префикса) * 1000 (итераций)
на практике = 10000 (размер первоначальной строки) * 1000 (итераций)
В то время как делая new String(str.substring(1,4)) мы получаем новую строку на 4 символа, а старая на 10000 символов свободно может уйти под gc.
1. на вход подается строка из 10000 символов
2. вы получаете префикс с 2го по 5й символ
3. создается новая строка с проставленными offset, count, value