LINUX.ORG.RU

Где я мог накосячить с Java?

 ,


0

2

Решил начать изучать Java.

Нашел сайт с интерактивным режимом.

Выбрал задачу: https://hyperskill.org/projects/24

Вроде решил её. Но решил также портировать решение на другие языки программирования, которыми уже владею.

И как же я был удивлён, что первый же порт на Typescript получился в 1.5 раза быстрее...

Describing JavaAcceptanceTests
  [+] single solution 338ms
  [+] no solution 322ms
  [+] many solutions 343ms
  [+] single solution complex numbers 355ms
  [+] no output without -verbose 310ms
Describing TypescriptAcceptanceTests
  [+] single solution 205ms
  [+] no solution 183ms
  [+] many solutions 205ms
  [+] single solution complex numbers 242ms
  [+] no output without -verbose 180ms

Исходники: https://github.com/fsb4000/linear-equations-solver

Где я так мог накосячить, что решение на Java получилось в полтора раза медленнее чем на JavaScript(Typescript)?

java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
node --version
v8.11.1
★★★★★

Увеличь размер входных данных, чтобы несколько минут решалось, там и сравнивай. 300 миллисекунд это не тест.

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

да, спасибо. сгенерировал задачу 100 на 100 и уже на Java 483ms, а на node.js уже 3.4s.

Понятно, время запуска виртуальной машины Java чуть выше чем например node.js, но на любой более менее реальной задачи скорость Java будет существенно выше чем у всякой скриптоты.

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

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

Скриптота, кстати, тоже может быстро работать. Но тут уже надо быть гуру и хорошо представлять, как тот же V8 преобразует JavaScript в машинный код. Там сущие мелочи могут давать большой разброс в производительности. В общем если заморочиться, можно время выполнения приблизить к С, по крайней мере не в разы отставать. Но на Java это сделать, конечно, проще, там достаточно не писать совсем уж упоротый код.

Твою программу могу предложить оптимизировать, избавившись от класса комплексных чисел. Два дабла весят 16 байтов, накладные расходы на объект это ещё 16 байтов, плюс мусор из промежуточных объектов, который надо собирать. Массив из комплексных чисел можно просто представить как массив double-ов двойного размера, где чётный элемент это вещественная часть, а нечётный - мнимая. Код будет некрасивый, но работать будет быстрей. Или подождать, пока в Java запилят Вальхаллу, но хз сколько ждать.

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

Спасибо, глянул про Вальхаллу, да value type были бы к месту.

Оптимизировать скорее всего не буду, но в целом про приём запомню.

Мне просто было интересно понять не накосячил ли я совсем жестко с Java, так как первые замеры вступили в противоречие с моими ожиданиями.

fsb4000 ★★★★★
() автор топика

Выбрал задачу: https://hyperskill.org/projects/24

Решать линейку в жаве — тот еще изврат. Ты зачем ее учишь? На жаве пишут суровый ынтерпрайз с рестом и микросервисами. Так что если ты хочешь заняться жавой серьезно, ты не микросекунды считай, а хеллоу ворлд на spring MVC разверни.

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

микросекунды тоже надо считать. но не в ту сторону. а надобно в ту же, что и, скажем, строки, ЕВПОЧЯ.

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

Нет, не понимаю. Строками мы разве что с товарищами в конце дня меряемся. «А я за сегодня 400 строк говнокода закоммитил!» — «Слабак! Я полторы тысячи» — «А у меня зато без копипасты» — «А на мои зато сонар не ругается». Ну типа такого.

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

Строками мы разве что с товарищами в конце дня меряемся.

это потому что вы с товарищами не индусы на аутсорсе у эффективного мэнэджера, продавшего ваше время таким же эффективным пиджакам, но западным. делающим в свою очередь какой-нибудь Надёжный и Глобальный сервис очередной гос. конторе)))

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

Мы русские на аутсорсе, и наше время продано немцам. Мы работаем на дойче телеком, которая может и не гос. контора, но близко к тому. Еще предположения? :)

Я если честно сомневаюсь что в мире еще есть такие места где платят за код построчно.

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

Еще предположения? :)

а нужно?
сам прочитай

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

а потом Где я мог накосячить с Java? (комментарий)

Я если честно сомневаюсь что в мире еще есть такие места где платят за код построчно.

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

не недооценивай придурков.

mos ★★☆☆☆
()
Последнее исправление: mos (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.