почему основанные на Java редакторы, как правило, работают медленно, учитывая, что Java считается быстрым после фазы прогрева? - PullRequest
20 голосов
/ 14 мая 2011

Хорошо, я знаю, что большинство людей говорят, что «Java не медленный в наши дни, у него просто медленная фаза запуска», но никто не может смотреть мне в глаза и говорить, что использование netbeans, eclipse или jedit так же отзывчиво, как скажем, Visual Studio или TextMate, даже после нескольких часов прогрева. О, время запуска определенно является проблемой (затмение от кашля) Я признаю, но я говорю об общей отзывчивости здесь. Например, при изменении размера окон в Jedit наблюдается небольшая задержка.

Разумное сравнение яблок с яблоками, я думаю, будет jedit (или любым текстовым редактором на основе java) против TextMate, SciTE.

Вопрос, который на самом деле сводится к следующему: «если бы netbeans / eclipse были полностью переписаны на C с тем же набором функций, вы ожидали бы, что он будет иметь те же характеристики производительности, что и в настоящее время».

Есть идеи?

И несколько замечаний:

Этот простой основанный на колебаниях редактор [1] имеет очень странные лаги при изменении размера окна, но прокрутка кажется довольно отзывчивой. Кроме того, в случае NetBeans, когда вы начинаете изменять размер, пока вы не «прекратите» изменять размер окна, он рисует уродливый черный фон [4]. Возможно, свинг отказывается делать какие-либо обновления во время перетаскивания окна?

Вот простой текстовый редактор SWT [2]. Он довольно чувствителен как к перетаскиванию, так и к прокрутке.

Вот еще один простой (jface) редактор SWT [3]. Он так плохо изменяет размеры, я думаю, что это плохая случайность. Я надеюсь.

Я также заметил, что при обновлении блокнота и визуальной студии, как правило, появляются временные белые "блики" (например, при использовании страницы в очень длинном документе). В приложениях SWT и Swing, похоже, никогда не было таких лишних белых всплесков, поэтому мне интересно, есть ли у них какая-то дополнительная внутренняя буферизация или что-то в этом роде. Это может привести к небольшому замедлению восприятия

[5] - связанный, но не совсем тот же вопрос.

Мои текущие догадки, основанные немного на существующих ответах / комментариях:

  • Netbeans только что раздулся. Может быть, есть что-то в редактировании java, которое заставляет создателей редакторов выходить за рамки? Может, они почему-то не оптимизируют своих редакторов?
  • Java-редакторы используют тонны оперативной памяти, может быть, это не позволяет кешу L2?
  • Редакторы Java редактируют java, так что, может быть, им постоянно приходится, например, обращаться к javac, что каждый раз приводит к штрафу за медленный запуск?
  • SWT - это слой абстракции над нативными виджетами, который может замедлять работу.
  • Swing имеет политику обновления ужасного изменения размера, что делает его "медленным".
  • Netbeans использует клиентскую виртуальную машину, так что, возможно, она просто не настроена на скорость? (см. также [6], в которой содержится ссылка на другой вопрос с ответом, представляющим собой набор параметров, которые можно передать сетевым компонентам, чтобы попытаться ускорить его).
  • У Swing / SWT меньше артефактов при прокрутке, чем у собственных приложений Windows. Возможно, это означает, что у них есть буферизирующие «помощники», помогающие избежать артефактов, вызывающих ощутимую медлительность, поскольку она не обновляется немедленно.
  • Возможно, у Java нет мегалитических тестов, так что, возможно, он не оптимизирован для этого типа нагрузок? Может быть, есть некоторые скрытые недостатки.
  • Аналогичным образом, возможно, java можно «сделать быстрым», но создатели редакторов почему-то не используют его эффективно («базовая библиотека спасет меня по скорости!»).
  • Может быть, он просто "чувствует себя" медленно, поскольку (по крайней мере, netbeans) вынужден постоянно вызывать новые экземпляры java для запуска отладчиков и т. Д., Каждый из которых использует свое медленное время запуска.

Спасибо! -roger-

[1] http://www.picksourcecode.com/articles/explan.php?id=6c9882bbac1c7093bd25041881277658&ems=9a0fa83125d48ab7258eab27754dd23e&lg=10

[2] https://gist.github.com/972234

[3] http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/BasicEditor.htm скомпилируйте / запустите его как java -cp.; Swt \ win32.jar; jface / * BasicEditor

[4] http://twitpic.com/4xi8ov

[5] Действительно ли Java медленная?

[6] есть ли способ заставить netbeans использовать сервер точек доступа vm

Ответы [ 4 ]

8 голосов
/ 14 мая 2011

Чтобы выполнить всю эту проверку и выделение синтаксиса кода «на лету», вам, в основном, нужно написать свой редактор, чтобы понять (что означает lex, синтаксический анализ, проверку типа, проверку синтаксиса и т. Д.) Язык Java и проверить содержимое текстового редактора во время каждого промежуточного состояния между вами, начиная с почти пустого класса и заканчивая вашей программой.

Также для обеспечения целостности перекрестных ссылок вы должны хранить в памяти достаточно информации обо всех других классах, чтобы вы могли по-настоящему убедиться, что когда вы вызываете метод объекта, он действительно существует для этого «другого» объекта.

Это не говоря уже о всех других местах, где предметы индексируются и т. Д.

Короче говоря, он медленный, потому что он делает много, даже если все, что он делает, сразу не оценивается человеком, который интересуется только буквами на экране (а не всеми функциями IDE). ).

3 голосов
/ 14 мая 2011

Это не дает прямого ответа на ваш вопрос, но вот еще немного информации о тестах оконного инструментария

Трудно дать эмпирическое правило где SWT будет превосходить Swing, или наоборот. В некоторых средах (например, Windows) SWT является победителем. В других (Linux, VMware хостинг Windows), Swing и его перерисовка по оптимизации опережают SWT значительно. Различия в производительности значительны: факторы от 2 и более обычный, в в любом направлении. Код, написанный на C / C ++ с использованием библиотеки X, работает несколько быстрее чем код, написанный на Java с использованием SWT, с ускорением от 5% до 10%

Источник http://pub.cosylab.com/CSS/DOC-SWT_Vs._Swing_Performance_Comparison.pdf

0 голосов
/ 17 мая 2011

Возможно, вы путаете 2 разные вещи:

  • "Ява не медленная в наши дни, она просто имеет фазу медленного запуска "

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

Для конфигурации виртуальной машины -server (которая может быть по умолчанию на вашем оборудовании) методы не компилируются до тех пор, пока число вызовов / ветвей метода не станет> XX: CompileThreshold = 10000

  • даже после нескольких часов бега время прогрева. О, время запуска определенно проблема (затмение кашля)

Даже после запуска, скажем, Eclipse, часами вы думаете, что использовали один и тот же метод 10000 раз? (Попробуйте запустить редактор Java, используя флаг -client JVM.)

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

0 голосов
/ 14 мая 2011

Возможно, Java использует больше памяти как правило (по крайней мере, по моему опыту это делает, и alioth ориентиры кажется, согласен ...

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

regex-dna, обратное дополнение, двоичные деревья, k-нуклеотид, мандельброт требуют выделения памяти.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...