LINUX.ORG.RU

ЖАБА съела мою память!

 , , , ,


0

0

Здравствуйте, объясните мне, почему любое приложение на этом языке протекает? Вот запускаешь ты его, сразу 400 уходит, хотя там 100 за глаза, ну ладно. Через пару часов это уже 4000 (при этом всё работает нормально). Но далее закономерно начитаются проблемы, даже если памяти избыток.

В частности, это касается игрушек, Runescape там, Wakfu и остальное. В определённый момент, всё начинает сильно, всё сильнее и сильнее, подвисать, тормозить и зависать. Причём, никакие игры с ключами, ограничениями памяти, переключениями режимов GC и прочим таким, ни к чему не приводят — становится только хуже. Например, можно начинать с самого начала: сделать чтобы GC приходил почаще и вёл себя агрессивней. Подфриживания будут чаще и с самого начала, но при этом памяти хватит на дольше (вроде бы). Это продолжается уже много-много лет. Неужели это происходит только у меня и никто этого не видит?

И попутно, у оракловской сборочки есть панель управления приложениями с профайлером и прочими ништяками, можно ли иметь что-нибудь похожее для openjdk? Мне она не нужна, просто интересно.



Последнее исправление: linuxnewbie (всего исправлений: 2)

Выросло поколение недопрогеров.

Ни про фрагментацию памяти, да они вообще не знают что это.

Программеры ушли в прошлое, сейчас дебилоиды не знающие про выделение и освобождение памяти. А JVM вообще сама за них должна программировать. ОГА!

HIS
()
Ответ на: комментарий от Aber

vscode + Language Support for Java ? Тормозилово, поставил его днями на свой старый ноут с core2dou и это жесть... эклипс 2019.03 лучше работает

Я не пробовал VSCode с жабой, потому конкретно по твоему сравнению не отвечу. По сравнению с атом-жаба, эклипс работает примерно одинаково. Наверное, потому что атом использует Eclipse JDT, которое, кстати, жрет больше памяти, чем весь остальной атом.

byko3y ★★★★
()
Ответ на: комментарий от HIS

Давайте не будем скатывать обсуждение в java EE vs spring. У меня нет желания спорить на эту тему.

mythCreator
()
Ответ на: комментарий от Legioner

Windows WPF уже сколько лет, что у жавы есть? Ничего?

Ну WPF непортируем, и уже сам повторяет судьбу жабогуев, отходя на второй план. SWT, например, как и Electron, работает на трех основных десктопных платформах: винда, линукс, мак. Нужно ли поддерживать что-то еще? Ну, разве что мобилки, но там свои особенности, как то лютые ограничения у яблоков на платформы.

Задумки у них 20 лет назад были широкие, сейчас по факту жава это серверный бэкэнд.

Хочется снова ответить на фразу

Все проблемы от того, что люди пытаются применять JVM для тех областей, для которых она не предназначена.

в стиле «все проблемы от того, что жава не нужна». Но я все же не согласен с тем, что жаву в принципе нельзя применять для других областей - .NET ведь проникает в другие сферы, не одним же ASP.NET живы?
Скорее проблему можно сформулировать так: «Sun/Oracle не хотят развивать Java ни для чего, кроме специализированого серверного софта».

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Потому, что у поделия функционала в тысячу раз больше, чем у текстового редактора?

Я не знаю, сколько мне еще раз повторять, что Atom и VSCode - это полноценные IDE. У атома отладчик для Java находится в альфа версии, но даже он есть, тем не менее. А обычная работа с кодом через LSP для кучи языков поддерживается.

Так ты в JS кладёшь в массив, а в Java кладёшь в хешмап. Или клади в JS в хешмап или в Java клади в массив.

Тестировали и хэшмапы в JS, и массивы в жабе, и с разным размером целых чисел. Результат для всех вариантов один - жава при прочих равных кушает примерно столько же или чуть больше памяти, но работает раза в два-три быстрее.
Для тех, кто не в курсе: чтобы включить истинный хэшмап в v8, нужно добавить щели в индексах, в указанном выше коде это делается простой заменой

h[i] = {
на
h[i*10] = {

byko3y ★★★★
()
Ответ на: комментарий от HIS

Отдаёт если не быть идиотом в программинге. Есть пару правил как попросить систему отдать память

G1 не так давно научили полноценно отдавать память, например: https://bugs.openjdk.java.net/browse/JDK-8038423
CMS и последовательный сборщик по состоянию на 2014 год не умели вообще отдавать память. В новых сборщиках, как то ZGC, тоже не особо парятся с этой фичей, но нужно смотреть по состоянию конкретной версии.
Я так понимаю, что параллельный сборщик и G1 считаются мейнстримом и над ними работают чуть больше:

Default garbage collectors:
    Java 7 - Parallel GC
    Java 8 - Parallel GC
    Java 9 - G1 GC
    Java 10 - G1 GC
ТС не написал используемую версию JVM - хорошим советом было бы перейти на девятку-десятку, там все-таки G1 пошустрее выносит мусор и освобождает помещение.

byko3y ★★★★
()
Ответ на: комментарий от mythCreator

Есть хорошие новости на эту тему https://openjdk.java.net/jeps/346

Вот, это же и есть оно самое, то, чего ждет столько людей, а я думал, что до сих пор не додумались:

JEP 346: Promptly Return Unused Committed Memory from G1.
Enhance the G1 garbage collector to automatically return Java heap memory to the operating system when idle.

byko3y ★★★★
()

Здравствуйте, объясните мне, почему любое приложение на этом языке протекает?

Потому что жабакодеры пренебрегают блоком finally конструкции try-catch-finally.

anonymous
()
Ответ на: комментарий от byko3y

Ведь именно из-за сбора мусора Java провалились как платформа для браузеров

Да ну нет. В js тоже сборка мусора, и что? Java провалилась, потому что могла делать слишком много.

Что дает сбор мусора? Ниже требования к писаке, ниже ответственность - все эти задачи перекладываются на рантайм, который сидит, анализирует структуру программы, и думает «нужно ли здесь добавить высвобождение памяти или нет?»

Как бы да, но по факту ничего подобного. Без гц ты руками освобождаешь, а с гц надо думать, как поведёт себя гц, чтобы не обделаться с утечкой. Ну да, применяют паттерн let it crash, но это - не от хорошей жизни и это не значит, что на жабке можно вот так просто говнокодить. Нигде нельзя говнокодить.

Нет, менеджмент изначально делал ставку на макак, которые будут сокращать затраты на разработку

Тут дело не то, чтобы в гц, он скорее мешает, когда доходит до вот такого. Затраты на разработку сокращаются за счёт библиотек и рефлексии, когда всё что угодно настраивается кучкой аннотаций. Макаинг тут в том, что всё скатывается до программирования на фреймворке.

crutch_master ★★★★★
()
Ответ на: комментарий от byko3y

Maphack был настоящим бедствием

Ну, так зачем было передавать на клиент то, что он видеть не может, а потом пытаться от него это спрятать?

Вместо модели steplock теперь каждый клиент получает огрызки игрового мира и локально предсказывает будущие события, корректируя результат под новую приходящую с сервера информацию

Это костыли для анимации и шляп. Как они вообще додумались делать такую игру на движке от fps?

Реплей не может хранить отдельные тики анимации для каждого юнита - тогда размер реплея был бы чудовищен

Так и не надо. Достаточно анимировать модельки без рендера от ключевого кадра до нужного. Оно как бы и работает, но что-то постоянно идёт не так.

Я играю для удовольствия...У меня был культурный шок

Ты играешь в доту. Как тебя вообще можно чем-то шокировать? У тебя там какой-то другой контингент игроков? Средний дотер это же намного хуже, чем средний двачер.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от byko3y

Вот текста тестовых прог

Эээ. Что тут делает мой велотест? Там в js надо делать i+=3 (например) в цикле, т.к. он оптимизирует такие объекты в массив и они занимают значительно меньше. Хотя это не сильно меняет картину и по памяти там +- столько же, а по производительности в 2 раза проигрывает js (хотя это тоже не важно, даже так всё упирается в io быстрее, чем в процессор)

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

И, кстати, в полях всё намного хуже. Если для явы надо использовать jdbc/jdbi/mybatis/прости, г-споди hibernate, то там жор увеличивается в разы по сравнению с каким-нибудь модулем на ноде, который тупо возвращает объект, ты делаешь вокруг этого что тебе надо и необходимость всяких либ отпадает.

crutch_master ★★★★★
()
Ответ на: комментарий от byko3y

6,7,8 тогда, 11 сейчас. Но это совершенно не важно, все сборщики перебирались и были ужасны.

А ещё говорят, что, возможно, с новым gc из 12 приложения перестанут виснуть постоянно, но я думаю, если они будут продолжать так течь, им ничего не поможет. Вы можете и лично оценить масштабы бедствия, я почему-то сомневаюсь что за прошедшие годы что-то исправилось. Игра ещё жива, хотя, конечно, когда в неё уже никто не играет проблемы могут быть менее заметны. В принципе, на международном сервере ещё кто-то есть.

https://store.steampowered.com/app/215080/WAKFU/

Я, например, наблюдаю зависание звука (особенно продолжительное в первые разы) когда память исчезает бесследно на игрушке которую пытаюсь запускать. Что с пульсаудио, что без. Это очень раздражает, чёрт с ней с памятью даже — можно перезапускать каждые 10-20 минут и тогда памяти хватает.

linuxnewbie
() автор топика
Ответ на: комментарий от linuxnewbie

Возможно Вакфу могла бы попасть в учебники истории в виде примера как убить игру донатом и растерять всех игроков в максимально сжатые сроки, так и не добившись нормальной работы на устройствах. У меня было стойкое ощущение, что они нанимали программистов за рис для её разработки, может быть это не далеко от истины. Хотя Runescape вроде всё осознала и убежала на плюсы, пожелаем ей удачи с возрождением.

linuxnewbie
() автор топика
Ответ на: комментарий от byko3y

Ну WPF непортируем, и уже сам повторяет судьбу жабогуев, отходя на второй план.

Кажется я перепутал WPF и UWP. В общем та библиотечка, которая отрисовывает совремённые Windows-приложения. Логично же её юзать, а не старинные WinAPI для рендеринга.

Скорее проблему можно сформулировать так: «Sun/Oracle не хотят развивать Java ни для чего, кроме специализированого серверного софта».

Не ораклом единым. Коммьюнити тоже не хочет. Где нормальные GUI-библиотеки?

Legioner ★★★★★
()
Ответ на: комментарий от byko3y

Я не знаю, сколько мне еще раз повторять, что Atom и VSCode - это полноценные IDE.

Сколько рефакторингов для Java поддерживает Atom? Tomcat поддерживает? Gradle поддерживает?

Тестировали и хэшмапы в JS, и массивы в жабе, и с разным размером целых чисел. Результат для всех вариантов один - жава при прочих равных кушает примерно столько же или чуть больше памяти, но работает раза в два-три быстрее.

Если чуть больше это не проценты, значит что-то делали не так. Нет никакой причины, по которой жава кушала бы больше при одинаковой реализации.

Для тех, кто не в курсе: чтобы включить истинный хэшмап в v8, нужно добавить щели в индексах

Я бы сделал ключ строкой. V8 наверняка для хеша с ключами-числами использует специализированную коллекцию, а в Java ключи боксятся в java.lang.Integer. Ну или использовать специализированную коллекцию в Java.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Да ну нет. В js тоже сборка мусора, и что? Java провалилась, потому что могла делать слишком много.

Ваш аргумент - инвалид. ActionScript имеет под собой тот же ECMAScript, что и жаваскрипт. У самих браузеров (JS) длительное время не было богатых фич для поддержки развитых интерфейсов, но к нашему времени флеш наконец влился в браузеры и не требует отдельного модуля.
Скорее проблема была в том, что для жабы долго не могли сделать достойного интерфейса, похожего на какой-нибудь WPF. То есть, жаба вышла в 1995, .net в 2002, WPF в 2006. Да, сделали JavaFX в 2008, но у меня есть подозрение в необучаемости жабомакак, потому нужно минимум лет 13 (2008 - 1995), чтобы научиться строить приложения на JavaFX.

Без гц ты руками освобождаешь, а с гц надо думать, как поведёт себя гц, чтобы не обделаться с утечкой.

Сравни подход «как бы мне высвободить объект, чтобы не словить segfault» с подходом «уберу все ссылки, и буду надеяться, что этот мусор после меня кто-то вынесет». Приложение, созданное по второму подходу, по крайней мере будет работать, пусть и плохо. Можно писать плохой и очень плохой код, причем, делать это в крупном проекте, и он будет продолжать работать - это и привлекает индустрию к жаве, на это и была ставка, как я предполагаю.
Я сам лично работаю в таком проекте, где рядом со мной кодят макаки и периодически гробят весь проект. А была бы жаба...

Затраты на разработку сокращаются за счёт библиотек и рефлексии, когда всё что угодно настраивается кучкой аннотаций.

Жава стала №1 языком еще до ввода аннотаций. Вот чего Java, как язык, не экономит - так это времени разработки. Язык перегружен определениями, а статическая типизация и общепринятые приемы построения иерархии классов мешают расширять и переделывать имеющийся софт.
Ведь такой ублюдочное по своей сути явление, как инструментальный рефакторинг, выросло именно из-за того, что в жаве нельзя рефакторить руками.

byko3y ★★★★
()
Ответ на: комментарий от crutch_master

Ну, так зачем было передавать на клиент то, что он видеть не может, а потом пытаться от него это спрятать?

Мне тяжело будет объяснять принципы построение сетевых игр с нуля. Проблема «как не передавать невидимые сущности клиенту» решена до сих пор лишь частично, даже несмотря на то, что каналы нынче широкие, серверы дешевые, а клиентские компы мощные и многоядерные. Например, в CS задержка в 10 мс недопустима, но как ты ее обеспечишь, не передавая невидимые сущности? Как в доте обеспечивать передачу эффектов с большим радиусом?

Как они вообще додумались делать такую игру на движке от fps?

Ты будешь удивлен, но технологии сетевого кодинга для FPS, RTS, и RPG примерно одинаковы. Старый Quake, например, был сделан на lockstep, и каждый клиент на основе ввода от всех остальных игроков вычислял картину мира. Path of Exile сделан на базе исходников какого-то движка Quake, но там уже lockstep дополнен предсказательной анимацией. Starcraft II до сих пор работает по lockstep модели - компы и интернет недостаточно развиты для эффективной передачи всего мира.
В этом плане выбор FPS/RPG движка - это очень хороший выбор, потому что позволяет скрывать части мира от клиента.

Достаточно анимировать модельки без рендера от ключевого кадра до нужного.

Эффекты не являются независимыми. Нужно выяснить время с начала анимации до текущего момента, выяснить, была ли анимация отменена целой кучей разных источников событий. Или наоборот, есть тригерные анимации, которые срабатывают в зависимости от ситуаций. Весь этот клубок эффективно перемотать на произвольный момент времени и восстановить правильный порядок анимации - сложно.
Самое простое решение, которое многие применяют - это не показывать анимацию вообще, если клиент не попал на ее старт. В доте это неприемлимо, потому что есть очень длинные эффекты. Вот и сделали как получилось.

Ты играешь в доту. Как тебя вообще можно чем-то шокировать? У тебя там какой-то другой контингент игроков? Средний дотер это же намного хуже, чем средний двачер.

Наверное, я просто привык к малолетним дебилоидам. Но малолетний дебилоид, который воображает себя миллионером, меня шокировал, как ни странно.

byko3y ★★★★
()
Ответ на: комментарий от crutch_master

Что тут делает мой велотест? Там в js надо делать i+=3 (например) в цикле, т.к. он оптимизирует такие объекты в массив и они занимают значительно меньше

Да, это мы с тобой обсуждали, но тред удален, а человек попросил тесты.

Если для явы надо использовать jdbc/jdbi/mybatis/прости, г-споди hibernate, то там жор увеличивается в разы по сравнению с каким-нибудь модулем на ноде, который тупо возвращает объект, ты делаешь вокруг этого что тебе надо и необходимость всяких либ отпадает.

Как бы родные драйверы JS используют модель micro-ORM, где данные представляются в виде простых объектов, и других вариантов общения с базой нету. В Java ты не можешь создать объект с произвольными свойствами, потому приходится применять явные описания. Эти описания могут быть очень тяжелыми, а могут быть очень легкими.
По тестам ты можешь увидеть, что производительность самых быстрых вариантов жавы уделывает JS без шансов, и JS формально конкурирует только благодаря монге:
https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=d...
https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=q...
https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=f...
https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=u...

byko3y ★★★★
()
Ответ на: комментарий от linuxnewbie

6,7,8 тогда, 11 сейчас. Но это совершенно не важно, все сборщики перебирались и были ужасны.

Да это версии, где по умолчанию был параллельный сборщик, который очень неохотно отдавал память. Мне понравилась история доработки G1, вроде:
- наш сборщик теперь может отдавать память системе ( https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6498735 );
- наш сборщик теперь может отдавать память системе в середине кучи ( https://bugs.openjdk.java.net/browse/JDK-8038423 );
- давайте сделаем, чтобы наш сборщик сам отдавал память системе ( https://openjdk.java.net/jeps/346 ).
Типа «наш сборщик отдавал память системе, но теперь начнет на самом деле её отдавать».

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Кажется я перепутал WPF и UWP. В общем та библиотечка, которая отрисовывает совремённые Windows-приложения. Логично же её юзать, а не старинные WinAPI для рендеринга.

Ты в курсе, что чуть больше трети офтопиков сидят на семерке, которая не поддерживает UWP? В ближайшие пару лет индустрия на UWP не переползет.
http://gs.statcounter.com/os-version-market-share/windows/desktop/worldwide

byko3y ★★★★
()

любое приложение на этом языке протекает

коммерсы прежде всего хотят закончить и выкатить рабочий продукт. на оптимизацию времени часто нехватает

да просто где-то использовали обычные рефералы, а не слабые.. вот и усё..

PexuOne
()
Ответ на: комментарий от Legioner

Сколько рефакторингов для Java поддерживает Atom? Tomcat поддерживает? Gradle поддерживает?

Gradle поддерживает. Tomcat нет. Из рефакторинга только переименовывание. Для других языков плагины попродвинутее все-таки, да. Я уже писал, что Atom здесь - это тупо интерфейс к eclipse JDT, потому нет никаких объективных причин для того, чтобы поддерживать меньше функций и меньше кушать памяти, чем eclipse. VSCode должен быть чуть побыстрее, но я его не пробовал.

Если чуть больше это не проценты, значит что-то делали не так. Нет никакой причины, по которой жава кушала бы больше при одинаковой реализации

Ну да, там меньше 10% разницы. Жаба по какой-то причине откусывает себе сразу очень много виртуальной памяти, в то время, как в V8 разрабы тщательно учитывали необходимость экономии ресурсов.

Я бы сделал ключ строкой. V8 наверняка для хеша с ключами-числами использует специализированную коллекцию, а в Java ключи боксятся в java.lang.Integer. Ну или использовать специализированную коллекцию в Java.

https://v8.dev/blog/fast-properties
V8 всегда использует числа в качестве ключей свойств. Просто для непрерывных числовых индексов используются специальные реализации массивов, а для разреженных индексов используются обычные хэш-таблицы. Если ключ - число, то само число становится хэш-ключем. Для строковых ключей есть отдельная таблица отношения имя-хэш, а в коде обращение к свойству объекта компилируется в обращение к числовому хэшу.

byko3y ★★★★
()
Ответ на: комментарий от PexuOne

коммерсы прежде всего хотят закончить и выкатить рабочий продукт. на оптимизацию времени часто нехватает

Научи искать коммерсов/быть коммерсом, который хочет выкатить хороший продукт? Я обожаю делать работу хорошо, но в основном коммерсам нужно быстро и хоть как-то. А я такой слоупок, что жуть, я пока рожу - уже проект закроется.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

качественный проект - это недостижимый идеал - такой проект - никогда не заканчивается, или заканчивается, будучи признанным complete failure.

потому, качественный продукт возможен только во FLOSS

PexuOne
()
Ответ на: комментарий от byko3y

Ты в курсе, что чуть больше трети офтопиков сидят на семерке, которая не поддерживает UWP?

Их проблемы. Я сижу на десяточке профессиональной и хочу модерновый интерфейс, а не имитацию Windows 95.

В ближайшие пару лет индустрия на UWP не переползет.

Да как бы уже. В венде по ощущениям практически всё совремённое на UWP кроме релитковых остатков, до которых руки у разрабов не дошли.

Legioner ★★★★★
()
Ответ на: комментарий от byko3y

Для строковых ключей есть отдельная таблица отношения имя-хэш, а в коде обращение к свойству объекта компилируется в обращение к числовому хэшу.

Звучит сомнительно. Хочешь сказать, что любой код вида table[key] по сути выполняется как table.get(globalStringCache.getInt(key))? Наверное ты про код вида a.b, когда ключ известен на этапе компиляции. Тогда эта оптимизация имеет смысл. Для произвольных строк key это просто будет забивать глобальный кеш и в 2 раза просаживать производительность на каждом обращении. В статье судя по всему это то, что они называют slow properties, т.е. обычная хеш-таблица.

PS что раздражает в JS: когда думаешь об оптимизации, надо думать про детали реализации V8, а не руководствоваться здравым смыслом. В Java это иногда тоже так, когда JIT определённый байткод или методы преобразует в очень эффективный машинный код, который работает быстрей вопреки логике, но чаще всего достаточно общего представления о том, как работает процессор.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от byko3y

Java провалилась, потому что могла делать слишком много.

Ваш аргумент - инвалид.

Вообще-то инвалид это именно js, не умеет работать = не испортит файловую систему. А ява могла, и всякими правами и подписями лишить ее этих возможностей сложно. Логично, браузеры пользуют то, что заслужили.

ублюдочное по своей сути явление, как инструментальный рефакторинг

Вот не надо. В будущем и редакторы неизбежно только сложнее станут, а не проще. И уметь должны будут больше. И рефакторить автоматом, разумеется. А еще догадаются код распространять не в дурацких текстовых файлах, а в гораздо более совершенном гипертексте. Не будет никакого наследования, а для повторного использования кода - ссылку оставил и готово.

Kokonavtuz
()
Ответ на: комментарий от Legioner

Да как бы уже. В венде по ощущениям практически всё совремённое на UWP кроме релитковых остатков, до которых руки у разрабов не дошли.

Тебе просто впаривают. На самом деле десятка настолько ужасна, что игроделы предпочитают linux, а интерфейсы нынче предпочитают делать не на UWP, а на платформонезависимых фреймворках.
2016 год, 90% разрабов предпочитают WPF и WinForms:
https://www.telerik.com/blogs/survey-report-the-dotnet-developer-of-2016
2018 год, ситуация по вопросам на stackoverflow показывает похожую картину c 10% у UWP, а WinForms постепенно теряет позиции, вытесняясь WPF:
https://docs.google.com/spreadsheets/d/1CuY8ofkFM3N-t4irw4JRzhtI9-GWoV3I2o5VR...

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Их проблемы. Я сижу на десяточке профессиональной и хочу модерновый интерфейс, а не имитацию Windows 95.

Кстати, сейчас тенденция идет обратная - облегчение интерфейсов. Посмотри на меню Watch Dogs 2, например. Или, из десятки выкинули композитный менеджер окон, и поставили взамен дедовский.

byko3y ★★★★
()
Ответ на: комментарий от PexuOne

качественный проект - это недостижимый идеал - такой проект - никогда не заканчивается, или заканчивается, будучи признанным complete failure

В чем проблема сделать коммерческий продукт и поддерживать его? Не так уж мало подобных, на самом деле.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Если ссать против ветра, даже всем классом, от этого лучше не будет. Пока у микрософта позиция продавливать UWP, надо ей следовать. Они владельцы технологии и им видней. Иначе останешься через 3 года у разбитого корыта.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Хочешь сказать, что любой код вида table[key] по сути выполняется как table.get(globalStringCache.getInt(key))?

Ситуация немного сложнее, просто эти сложные пертурбации скрыты от нас компилятором. Большинство обращений к свойствам объектов выполняются по известным на этапе компиляции именам, потому именно этот вариант оптимизировали.
Для очень большого числа свойств среда на самом деле включает обычную хэш-таблицу, которая хранит сама в себе ключи и значения. Для среднего числа значений имя-хэш заносится в DescriptorArrays, а значение хранится в массиве elements.
Для числовых значений используется отдельный способ хранения сплошным массивом (тот самый elements), но при наличии дырок эта оптимизация откатывается к простым хэш-таблицам. Вообще, в V8 довольно много оптимизаций плана «создаем быструю оптимизированную реализацию на статичных типах, но если типы/значения вдруг не подходят - откатываемся на медленную реализацию». То есть, как ты написал:

Для произвольных строк key это просто будет забивать глобальный кеш и в 2 раза просаживать производительность на каждом обращении. В статье судя по всему это то, что они называют slow properties, т.е. обычная хеш-таблица.

только с небольшой поправкой - там не глобальный кэш, а локальные HiddenClass-ы и DescriptorArrays.

что раздражает в JS: когда думаешь об оптимизации, надо думать про детали реализации V8, а не руководствоваться здравым смыслом

Потому идет такой интенсивный переход от JS - он неудобен во многих планах, и проблемы с типами являются главным камнем преткновения.

byko3y ★★★★
()
Ответ на: комментарий от Kokonavtuz

Вообще-то инвалид это именно js, не умеет работать = не испортит файловую систему. А ява могла, и всякими правами и подписями лишить ее этих возможностей сложно. Логично, браузеры пользуют то, что заслужили.

Я приводил пример Flash, есличо. Там язык заметно отличается от JS, но все же достиг большого успеха, уделав жабу.
Неужели ты хочешь сказать, что единственная причина провала жабы - это потому что в ней нужно было возиться с доступом к файлам? Не тормоза, не жор памяти?

В будущем и редакторы неизбежно только сложнее станут, а не проще. И уметь должны будут больше. И рефакторить автоматом, разумеется. А еще догадаются код распространять не в дурацких текстовых файлах, а в гораздо более совершенном гипертексте. Не будет никакого наследования, а для повторного использования кода - ссылку оставил и готово.

Красивые сказки, только к нынешней реальности отношения не имеют. Пока что люди пользуются все теми же мышками с клавиатурами, и как деды 60 лет назад текстом писали, так до сих пор молодёжь пишет текстом, и ничего лучше не придумали. Может быть еще через 60 лет придумают нейронные интерфейсы программирования, только это уже будет не при нас.
И лучший инструмент рефракторинга в этих условиях - это скопировать-вставить текст. Просто код на жабе сильно перегружен избыточными конструкциями, алгоритм изменения которых прост, но правок нужно вносить много. Это типичная характеристика языка, удобного компьютеру, и неудобного человеку. Но вместо более удобных языков люди применяют более тормознутые инструмент для работы с кодом.

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Если ссать против ветра, даже всем классом, от этого лучше не будет. Пока у микрософта позиция продавливать UWP, надо ей следовать. Они владельцы технологии и им видней. Иначе останешься через 3 года у разбитого корыта.

Какого разбитого корыта, ты о чем? Никто не пишет на UWP! У разбитого корыта окажется тот, кто использует непопулярный фреймворк с ограниченным выбором готовых решений и специалистов по этому фреймворку. Я ведь могу сказать, что вот wxWidgets очень перспективный фреймворк, да, никому не нужный, но его же кто-то там продавливает наверняка? Блин, даже WX смотрится перспективнее, на самом деле, потому что UWP работает на единственной версии windows, а WX работает везде.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Вот чего Java, как язык, не экономит - так это времени разработки.

Чисто как язык до java 8 она очень сильно отставала от C# и по моему отвстает до сих пор, но я не знаю C# чтобы сказать точно. Но джава это не только язык, но и экосистема из кучи готовых решений, что позволяет не писать велосипеды.

статическая типизация

Есть groovy с динамической типизаций и синтаксическим сахаром, но я его не пробовал сам.

общепринятые приемы построения иерархии классов мешают расширять и переделывать имеющийся софт

Можно пример? По моему как раз наоборот в джаве закладывают возможность расширения везде где это возможно. Другое дело, что если взять какой-нибудь сложный фреймворк типа спринга, то там можно очень долго искать какой именно класс надо расширить, но эта проблема возникает при попытке расширения любой большой и сложной хреновины.

mythCreator
()
Ответ на: комментарий от byko3y

Скорее проблема была в том, что для жабы долго не могли сделать достойного интерфейса

Зачем браузеру гуи, если он сам гуи? Апплеты впихивали размером 1х1 пиксель для расширения функционала, подёгривания нативных либ, сети, сисколов и прочих потенциально опасных вещей. Его не юзали из-за того, что в новой версии браузера опять придумают кучу каких-нибудь подтверждений и всё отвалится. Сам имел с этим дело. Был аплет для шифрования с бинарником внутри.

но к нашему времени флеш наконец влился в браузеры и не требует отдельного модуля.

Флеш это уже легаси. Причём по той де самой причине, что и ява - проблемы с безопасностью.

Я сам лично работаю в таком проекте, где рядом со мной кодят макаки и периодически гробят весь проект. А была бы жаба...

Ну как. Да. Будет работать через жопу, как бы планку снизили, но проект всё равно завалят и засрут так, что придётся переписывать всё по новой, ибо в этом говне ковыряться не будет никто ни за какие деньги. Типа можно писать говно, но это очень не дальновидное решение.

Жава стала №1 языком еще до ввода аннотаций.

Ну хз. Я вообще не понимаю зачем она может быть нужна без рефлексии/аннотаций.

Вот чего Java, как язык, не экономит - так это времени разработки.

Вот с этим не могу не согласиться. На том же js код пишется быстрее и проще скатывается к декларативщине.

crutch_master ★★★★★
()
Ответ на: комментарий от byko3y

Как в доте обеспечивать передачу эффектов с большим радиусом?

Сервер знает на ком какие эффекты и кто попал в АоЕ. Вот если кто-то нажмёт шифу из кустов, то да, надо как-то передать клиенту, чтобы он анимировал шифу. Но это тоже вроде не сложно. Я думаю тут всё дело как обычно в натягивании софы на глобус - fps движок для игры-мода на движке ртс.

Ты будешь удивлен, но технологии сетевого кодинга для FPS, RTS, и RPG примерно одинаковы.

Ну так там движки везде от fps, делать специализированный движок менять принципы управления не хотят и играют 60 тиков/сек везде как в шутер. Хотя без микрозадроства игрострой ничего не потеряет кмк.

Эффекты не являются независимыми. Нужно выяснить время с начала анимации до текущего момента

Ну так это всё сервер считает и выкидывает событие, если эффект сработает. Жопа в том, что там карта огромная, была бы 1000х1000 всё было бы проще.

crutch_master ★★★★★
()
Ответ на: комментарий от mythCreator

Но джава это не только язык, но и экосистема из кучи готовых решений, что позволяет не писать велосипеды.

JVM используется для большого кол-ва годноты, например, Clojure и Scala. Если наконец они смогут исправить проблемы GC, то исполняемых на JVM проектов будет еще больше.

Есть groovy с динамической типизаций и синтаксическим сахаром, но я его не пробовал сам

Groovy предлагается упрощать фичи оригинальной жавы, но дает довольно мало новых инструментов, оправдывающих упрощения. Scala и Clojure в этом плане намного продвинутее, а если же хочется просто доработанную жаву, то есть Kotlin.

Можно пример? По моему как раз наоборот в джаве закладывают возможность расширения везде где это возможно

https://en.wikipedia.org/wiki/Circle-ellipse_problem - канонический пример
Адепты ООП постоянно кричат о том, что «мы закладываем везде возможность расширения», но если ты ее вдруг не заложил при реализации - ты по уши в дерьме. А заложить её в полном объеме ты не сможешь никогда, потому что не знаешь, как и для чего твой код будет реально использован.
Настоящие высокоуровневые языки возможность расширения никогда не теряли, потому в их контексте просто не принято говорить про расширяемость.
Ты хочешь изменить поведение базового класса. Как ты это сделаешь? Ты хочешь перестроить иерархию классов библиотеки, потому что для твоей задачи старая иерархия неудобна (а любая сложная иерархия в конце-концов окажется неудобной). Как?
Я тебе могу сказать, как эту проблему решают взрослые дяди на нежабе - просто переписывают код библиотек. Вот такое ООП, вот такая расширяемость.
И я могу сказать, как эту проблему решают взрослые дяди на жабе - они добавляют возможность переопределения всех классов и методов, раздувая библиотеку до чудовищных размеров и создавая малопонятные логические связи между сущностями.

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Звучит сомнительно. Хочешь сказать, что любой код вида table[key] по сути выполняется как table.get(globalStringCache.getInt(key))?

Так это на любой вм, по-моему, в первую очередь считают хеш строки и потом его везде используют, чтобы не проверять побайтово все эти if (str == "any lonnnnnnng string")

crutch_master ★★★★★
()
Ответ на: комментарий от Kokonavtuz

Вот не надо. В будущем и редакторы неизбежно только сложнее станут, а не проще. И уметь должны будут больше. И рефакторить автоматом, разумеется.

Если до такого дойдет, то встанет вопрос о более эффективных системах или яп.

А еще догадаются код распространять не в дурацких текстовых файлах, а в гораздо более совершенном гипертексте. Не будет никакого наследования, а для повторного использования кода - ссылку оставил и готово.

Это и сейчас работает. Скатывай всё в декларативщину, пиши для неё редактор, да таскай картинки-модули. Или откопай дельфи.

crutch_master ★★★★★
()
Ответ на: комментарий от byko3y

что единственная причина провала жабы - это потому что в ней нужно было возиться с доступом к файлам? Не тормоза, не жор памяти?

Да. Чтобы флеш работал надо его просто поставить, а с жабой всегда надо было плясать. Причём редкие игры на жаба-апплетах работали лучше ибо там можно было приделать нормальный натив типа lwjgl, а у флеша там только вм и всё ужасно тормозило в более-менее ресурсожорких играх.

crutch_master ★★★★★
()
Ответ на: комментарий от mythCreator

Чисто как язык до java 8 она очень сильно отставала от C# и по моему отвстает до сих пор, но я не знаю C# чтобы сказать точно. Но джава это не только язык, но и экосистема из кучи готовых решений, что позволяет не писать велосипеды.

Чисто как язык Java последний раз существенно менялся в 1.5. С тех пор всё, что там делалось это добавление сахара или микроскопические изменения. Ну лямбды можно притянуть за более-менее существенное изменение. Хотя сами по себе они ничего нового в язык не принесли, т.к. анонимные классы там были с рождения, но их появление сильно изменило и стандартную библиотеку и посторонние библиотеки. C# очень далеко ушёл от Java.

Legioner ★★★★★
()
Ответ на: комментарий от crutch_master

Ну хз. Я вообще не понимаю зачем она может быть нужна без рефлексии/аннотаций.

А зачем тебе аннотации? Совершенно ненужная и даже вредная фича.

Legioner ★★★★★
()
Ответ на: комментарий от crutch_master

Так это на любой вм, по-моему, в первую очередь считают хеш строки и потом его везде используют, чтобы не проверять побайтово все эти if (str == «any lonnnnnnng string»)

Тут речь не об этом. Хеш считают в любой адекватной реализации строки, включая Java.

Legioner ★★★★★
()
Ответ на: комментарий от crutch_master

Зачем браузеру гуи, если он сам гуи? Апплеты впихивали размером 1х1 пиксель для расширения функционала, подёгривания нативных либ, сети, сисколов и прочих потенциально опасных вещей. Его не юзали из-за того, что в новой версии браузера опять придумают кучу каких-нибудь подтверждений и всё отвалится. Сам имел с этим дело. Был аплет для шифрования с бинарником внутри.

Для таких применений жабоприложение запускается отдельно от браузера. Как я понимаю, проблема заключалась в том, что нельзя было сделать достаточно богатый фейс у самой жабы, чтобы не совать аплет в браузер.

Флеш это уже легаси. Причём по той де самой причине, что и ява - проблемы с безопасностью.

Зачем адобе в одно рыло заниматься разработкой этой closed-source дряни, если можно вообще не заниматься ею? Проблемы безопасности у флеша лежали совсем в другом - в слабой поддержке разработчиком и многочисленных уязвимостях.

Я вообще не понимаю зачем она может быть нужна без рефлексии/аннотаций.

Тыкаю в случайный проект на github:
https://github.com/macsj200/JavaPokemon/tree/master/JavaPokemon/src/javapokemon
- нет аннотаций. Тыкаю в другой случайный - тоже нет:
https://github.com/kurbatov/firmata4j/tree/master/src/main/java/org/firmata4j
Что я делаю не так? Если честно, я слабо понимаю, зачем там аннотации. Ну типа это приятный сахар, но я сторонник того, чтобы все сущности в классах были с видимостью «public», а фактические управление видимостью осуществлялось при помощь комментариев вроде «изменишь эту переменную - я приду и вырежу твою семью».

byko3y ★★★★
()

Примонтируйте своп в дев/налл и проблема решиться.

kostyarin_ ★★
()
Ответ на: комментарий от Legioner

JavaEE сдохло, сорри.

«в Америке нет стиляг, но мы-то есть»
Пока инерция не закончится - будут на EE писать. А эту штуку потом еще и поддерживать надо - работы не убавится.

byko3y ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.