Почему существуют сборки Debug & Release для .Net, а не для Java? - PullRequest
7 голосов
/ 19 января 2011

В .Net вы можете специально скомпилировать свои проекты в настройках «Отладка» или «Выпуск», выпуск с большей оптимизацией. Я знаю, что это считается ненужным в Java, потому что джиттер выполняет эти оптимизации. В чем причина разницы? (имеется в виду, почему предварительная компиляция "джиттера" необходима / полезна)

Почему это необходимо в .Net / CLR, а не в Java / JDK?

Ответы [ 4 ]

4 голосов
/ 19 января 2011

Ранее Java-компиляторы имели флаг -O, чтобы включить (исходный код) оптимизацию компиляции.Начиная с JDK 1.2, флаг -O не имел никакого эффекта, и я думаю, что флаг был удален с JDK 1.4.По мере улучшения среды выполнения Java, вероятно, стало все более и более разумным делегировать оптимизацию в JRE, поскольку компилятор исходного кода абсолютно не знает об аппаратном обеспечении, которое в конечном итоге выполнит код.

Статьи типа этот и документация флага csc / optimize указывают на то, что оптимизация оказывает очень незначительное влияние (если вообще вообще имеет место?) На фактическую генерацию кода CLR.Однако флаг / optimize устанавливает флаг в скомпилированной сборке, который управляет уровнем оптимизации, разрешенным для применения во время выполнения.Я не пробовал, но я читал, что оптимизированный во время выполнения код не обязательно отлаживаемый, хотя отладочная информация включена (флаги / optimize и / debug могут быть включены или отключены независимо для компилятора C #).

really не вижу смысла в управлении уровнем оптимизации во время компиляции. Во время выполнения Java есть несколько подробных опций для управления производительностью и оптимизацией во время выполнения, но они должны быть определены при запуске JRE ине во время компиляции.

4 голосов
/ 19 января 2011

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

Посмотрите документацию и проверьте параметры флага -g:

-g
  Generate all debugging information, including local 
  variables. By default, only line number and source 
  file information is generated.
-g:none
  Do not generate any debugging information.
-g:{keyword list}
  Generate only some kinds of debugging information, 
  specified by a comma separated list of keywords. 
  Valid keywords are:
    source
      Source file debugging information
    lines
      Line number debugging information
    vars
      Local variable debugging information

Возможно, они не настолько обширны, как оптимизация байт-кода, которую могут выполнять компиляторы .NET (с которыми я не знаком, извините), ноЯ думаю, что в теории они существуют по соображениям производительности (меньшие файлы классов и т. Д.).

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

3 голосов
/ 19 января 2011

Я думаю, что они могут быть легко введены в Java. В основном, отладочная сборка означает: включить символы отладки и отключить оптимизацию. Релиз наоборот. Цели отладки и выпуска генерируются Visual Studio и не являются обязательными. Вы можете написать свой скрипт MSBuild без VS. Таким образом, вы можете создать скрипт сборки для Java с целями Debug и Release.

0 голосов
/ 24 августа 2011

http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx имеет хороший список оптимизаций, которые выполняются, когда переключатель оптимизации включен (включен для выпуска, выключен для отладки).

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

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