Java vs. C # - перспектива производительности [закрыто]

34

Если у вас есть многолетний опыт работы с Java и многолетний опыт работы с C # и .NET, я бы оценил ваше мнение о различиях в производительности разработки программного обеспечения между этими двумя средами. Один из наших клиентов рассматривает возможность замены существующего программного решения. По мере замены потребуется ок. Работа в течение 10–15 человеко-лет, выбор Java или .NET на основе различий в производительности между ними, может существенно повлиять на требуемые инвестиции и время выхода на рынок.

Не могли бы вы предоставить нам информацию о различиях в производительности разработки программного обеспечения между Java и C # /. NET? Я бы предпочел получить ответ следующим образом:

Мой опыт основан на X-летнем опыте работы с Java и X-летнем опыте работы с C # / .NET. Java на X% более продуктивна, чем C # .NET или C # /. NET на X% продуктивнее, чем Java, если принять во внимание следующее.

Эдин Даздаревич
источник
24
Я думаю, что одна важная вещь здесь также - то, что вы делаете. .NET может быть лучше для одних проектов, а Java - для других.
Ойвинд Кноблох-Братен
4
Что это за проект? Многое зависит от библиотек, доступных для того, что вы пытаетесь сделать. В отношении языка я настоятельно предпочитаю C #, но я не утверждаю, что .net лучше java для всех видов проектов.
CodesInChaos
7
ИМО - это очень важное стратегическое решение, которое вообще не должно основываться на производительности программистов. Если вам нужен великолепный современный графический интерфейс Windows, вы не можете выбрать Java, даже если статистика утверждает, что он на 7% более продуктивен. Если вам нужен настоящий кроссплатформенный продукт без ограничений, которые поставляет Mono, Java - ваш ребенок, даже если C # имеет лучший синтаксис.
user281377
2
@Edin: «Корпоративное приложение» не очень хорошо описывает тип приложения ... Это только для рабочего стола, конфигурация клиент / сервер, веб-сервисы, веб-сайты, возможные спутниковые приложения на мобильных устройствах и т. Д.?
благоговение
3
Это «Ява», а не «ЯВА»
Махмуд Хоссам

Ответы:

17

Мой опыт основан на 10-летнем опыте работы с Java и 3-летнем опыте работы с C # / .NET. Java на 0% более продуктивна, чем C # .NET. Это основано на написании внутренних сервисных приложений.
C # / .NET может быть на 5% более производительным, чем Java, для написания пользовательских приложений. Но тогда я не делал этого почти 5 лет на Java, и новый редактор пользовательского интерфейса Netbeans мог бы закрыть этот пробел.

Вы хотите увеличить производительность? CI (в идеале непрерывная доставка) и автоматизированные тесты. Продуктивность, достигнутая выбором языка / платформы / IDE на любом основном языке / платформе / IDE, довольно мала.

MLK
источник
Вы хотели сказать 0% для Java? Вы имеете в виду повышение производительности на 0% для серверных приложений на базе сервисов или для Java в целом? Просто проверяю.
Джон Онстотт
Если бы вы попросили меня написать внутреннее приложение (некоторые правила, доступ к БД и что у вас есть), тогда оценка была бы одинаковой как для C #, так и для Java. Если бы вы попросили приложение для конечного пользователя Windows, я бы немного увеличил мою оценку для Java, чем для C # (WPF / XAML и его поддержка MVVM через связывание, я думаю, что это немного более продуктивно, чем более ручное связывание и построение пользовательского интерфейса в Java (как отключено). 5 лет назад)).
млк
+1 за «Производительность, достигнутая выбором языка / платформы / IDE на любом основном языке / платформе / IDE, довольно мала».
Адам Яскевич
3
-1 за последнее предложение. Для каждого (реального мира) класса задач вы можете выбрать два языка общего назначения общего назначения, в которых прирост производительности от одного к другому превышает 100%. Если вы выберете между C # и Java, вы обнаружите небольшую разницу (хотя я бы сказал, что C # окажется значительно более продуктивным в областях, подходящих для функционального программирования). Если выбор между C и OCaml, разница в вас.
back2dos
42

Я работаю над проектами в колледже и в реальном мире с использованием Java и C # уже 5 лет.

Руки вниз Мне больше нравится использовать C # из-за его краткости и использования синтаксического сахара. Вы редко найдете Factory.GetFactory(OfFactory.GetFactory(Factory));код в C #. Проще читать и следовать, потому что синтаксис меньше и лаконичнее.

Какой из них вы будете более продуктивным? Это зависит от типа проекта.

Вы разрабатываете настольное приложение для Windows? Тогда C # - лучший выбор, потому что это мощная среда IDE Visual Studio, а .NET Framework делает создание графического интерфейса очень простым.

Честно говоря, я рад, что я больше не использую Java (прошло уже больше года), потому что я помню, насколько ужасно многословным должен был быть код. Быстрый пример - обработка исключений. Если ваш код может выдать исключение, вы должны учитывать каждое возможное исключение. Это быстро превращает тривиальный код в 20 строк + чудовище.

C # не так сложен, если вы решите оставить свой код открытым, и вам решать как разработчику.

C # также сделал много дополнений в течение года, которые делают его радостью от использования. Лямбды, делегаты, анонимная функция (а-ля Ruby), много хороших мелочей, которые вы найдете в процессе работы.


источник
3
Я помню, что в Java от Uni, момент, который я рад забыть. Принудительная обработка исключений. да, у него была цель, но документация кода может сказать вам, если методы выдают исключения, и это дает вам выбор, что делать.
ДжонВиллис
5
Хаха, я программист на Java, но мне понравился твой пример кода.
Чак Стефански
6
If your code can throw an exception you must account for every single exception possible.Я не вижу обратной стороны этого, по крайней мере, это повышает осведомленность о проблемах ... хотя, может быть, только я.
Бобби
4
Проверенные исключения означают, что вы пишете код обработки ошибок как часть основной реализации, а не как вспомогательная мысль. Это очень много значит для обслуживания.
Я думаю, что это просто несогласие с тем, что означают исключения - они могут быть ожидаемыми обстоятельствами (файл не существует) или неожиданными ошибками (делим на 0). Java решила, что исключения должны представлять оба, и поэтому имеет как проверенные, так и непроверенные исключения. Это удивительно спорная особенность.
Тихон Джелвис
23

Я много работал с Java (с 1996 года) и .Net (с 2002 года), а в 2010 году принял решение использовать Java в своей компании, исходя из того, что это будет наиболее продуктивная среда в целом .

Обратите внимание, что я определяю продуктивность разработки программного обеспечения в терминах стоимости бизнеса, созданной на единицу стоимости / ресурса, на сквозной основе (т. Е. Вы должны смотреть на продуктивность всего жизненного цикла программного обеспечения, включая развертывание и обслуживание, а не только на начальное кодирование !!).

Вот ключевые элементы моих рассуждений:

  • Синтаксис является второстепенным фактором производительности - хотя Java, конечно, многословен, и я предпочитаю синтаксис C #, он просто не имеет большого значения. Если ваши разработчики object.getSomeProperty()напишут object.SomePropertyили используют анонимный внутренний класс против лямбды, просто не будет иметь никакого существенного значения для конкурентного преимущества вашей компании ....
  • Библиотечная экосистема имеет решающее значение - разрабатывая современный программный продукт, вы не хотите разрабатывать много общих компонентов с нуля. Экосистема Java обладает явным преимуществом с точки зрения количества и качества библиотек с открытым исходным кодом (особенно тех, которые разработаны Apache, Google, Eclipse Foundation и RedHat / JBoss).
  • Гибкость переносимости / развертывания - я знаю, что могу развернуть JVM практически на любой платформе, включая большие дешевые кластеры Linux. С .Net вы ограничены средами Windows. С достижениями в области облачного хостинга я счел это довольно важным преимуществом.
  • Scala и Clojure являются жизнеспособными вариантами разработки на JVM, если вам нужны расширенные языковые функции. Это реалистичный вариант для разработки на Java, но оставьте открытой возможность переходить на Scala или Clojure с течением времени. В некоторой степени это языки «следующего поколения», которые, я думаю, опережают как Java, так и C #, так что это убедило меня в том, что у платформы Java хорошее будущее с точки зрения языковых инноваций. (Java 7 и 8 выглядели многообещающе, но я не совсем затаил дыхание ....)
  • Расходы на обслуживание на самом деле казались довольно благоприятными для Java. Java имеет более простой синтаксис, чем C #, что означает большую детализацию, но, с другой стороны, означает, что люди склонны писать более понятный код - просто сложнее написать «умный код». Кроме того, мир Java придает гораздо большую важность обратной совместимости, чем мир .Net, что станет преимуществом с точки зрения затрат на обслуживание в течение нескольких лет.
  • Независимость от поставщика - видя, как компании сжигаются в прошлом из-за привязанности к поставщикам, я почувствовал, что было выгоднее использовать относительно более открытую экосистему Java, чем мир .Net, в котором доминирует Microsoft. Например, я предпочел бы выбирать базы данных, а не использовать SQL Server (и это довольно сильно благодаря поддержке инструментов и типичным навыкам разработчиков .Net). На мой взгляд, сохранить независимость вашего основного инвестора в продукт - это разумный долгосрочный шаг. Я решил (как оказалось правильно), что OpenJDK станет будущим Java, поэтому я бы эффективно использовал платформу с открытым исходным кодом.
  • Талант - это, конечно, субъективно, но меня больше поразили технические возможности разработчиков в мире Java, чем в мире .Net. В среднем у меня сложилось впечатление, что разработчики .Net имеют тенденцию делать то, что Microsoft предоставляет для простых инструментов или шаблонов, тогда как разработчики Java больше заботятся о поиске правильного решения с точки зрения разработки программного обеспечения. Это абсолютно субъективно и, несомненно, зависит от конкретной местности / рынка, и было много людей, которые не подходили под эту модель, поэтому, конечно, YMMV.
  • Инструменты были около уровня. У Microsoft есть много замечательных, простых в использовании инструментов, которые были бы особенно привлекательны для разработки под Windows. Однако я работаю в основном над разработкой на стороне сервера, где я бы сказал, что инструменты Java имеют преимущество. В частности, Maven оказался чрезвычайно мощным инструментом в экосистеме Java, который я до сих пор не считаю достойным аналогом в мире .Net.

Так что, хотя было много сложных соображений, в целом я очень доволен выбором перехода на Java и сделал бы такой же выбор сегодня (по состоянию на начало 2012 года).

Вероятно, единственный случай, когда я бы пошел с .Net, был бы, если бы я разрабатывал настольное приложение только для Windows (где преимущество .Net явно огромно).

mikera
источник
9
+1: отличный ответ! В нем кратко изложены многие вопросы, которые следует учитывать при оценке производительности в целом. Некоторый синтаксический сахар может сделать язык классным и более «современным», но есть и другие важные факторы, которые влияют на производительность.
Джорджио
3
+1 за более полный ответ, чем предыдущие.
NlightNFotis
1
Поскольку вы упомянули Scala и Clojure, вы также можете упомянуть и F # ...
Маурисио Шеффер
2
Большой! Тщательный анализ. Как раз то, что я искал. :)
xebo
9

У меня есть: Java 10 лет, C # 8 лет

Я голосую за Java

  1. Нет блокировки поставщика (вы можете изменить сервер приложений / веб-серверы с Linux на Windows на Unix)
  2. Взаимодействие / взаимозаменяемость сторонних пакетов, таких как JasperReports JFreeChart, JSF или Spring
  3. Большая часть инноваций приходит отсюда (Log4j, Ant, Spring, Hibernate и так далее)
  4. Работает на нескольких серверах приложений (вроде A). Такие как JBoss, Tomcat, WebSphere, GlassFish, WebLogic
похлопывание
источник
23
Какие «инновации» могут быть в языке без лямбд?
SK-logic
6
До ASP MVC были другие фреймворки MVC (например, MonoRail) ...
EricSchaefer
2
О, кстати: лямбды / замыкания - это языковая функция, вы говорите о фреймворках.
EricSchaefer
5
@ SK-logic, вам не нужны лямбды для написания O / R-слоя.
2
@ Джорджио, лямбды идеально подходят для любого языка с GC. Конечно, им нет места в C ++ и C.
SK-logic
6

Ява: 5 лет (не непрерывно)
C #: 7 лет

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

Изменить:
Давайте определим «типичное корпоративное приложение» как:

  • многоуровневый
  • клиент / сервер
  • БД поддерживается

И Java, и C # могут это сделать. Дело не столько в языке, сколько в фреймворке / времени выполнения. Опять же, используйте то, что знают ваши разработчики. Они могут выучить новый язык и новую структуру, но на это нужно время. Это было бы верно для настольного приложения. Оба языка могут использоваться с многочисленными GUI-инструментами / библиотеками, но все они имеют разные подходы и принципы.

EricSchaefer
источник
3
«Это во многом зависит от индивидуального разработчика» ... именно поэтому он хотел получить мнение от людей, которые имеют опыт в обоих мирах ... «и проекта». ... который должен требовать ответа, который указывает, какие проекты получат выгоду от различных технологий.
благоговение
4
Это зависит не от этого разработчика (он же я), а от разработчиков, которые должны построить проект. Также было бы легче, если бы он заявил, какой проект он собирается построить ...
EricSchaefer
@eric это типичное корпоративное приложение
Edin Dazdarevic
@Edin, Java имеет версию JavaEE со встроенными корпоративными функциями. С помощью этого фреймворка вы можете быстро разрабатывать приложения. Как бы то ни было, Magic делает много вещей, вы должны соответствовать его правилам. И если что-то сломается, не ожидайте, что сообщения об исключениях будут полезны, так как трассировка стека огромна. Доступ к БД с неправильным именем или БД отключен, трассировка стека настолько велика, что вы не можете увидеть, что вызвало первоначальную проблему.
ДжонВиллис
5
Конечно, есть «типичное корпоративное приложение», возьмите эти данные из точки a, дайте пользователю возможность их испортить, а затем поместите в точку b. ;)
mezmo
6

У меня более 10 лет опыта работы с Java (начиная с версии 1.1!) И 7 лет опыта работы с .NET (в основном C #).

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

Настольное приложение

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

Веб-приложение

Это очень трудное решение, потому что у каждого есть свои сильные и слабые стороны. Вот несколько из них:

C #

Сила: в настоящее время имеет больше возможностей для создания новых функций в язык и платформу / структуру. Все идет от одного поставщика, и, безусловно, это преимущество. Вы также можете использовать некоторые очень мощные компоненты, такие как DevExpress, например (Java не подходит даже для того, чтобы иметь что-то наподобие того, что команда DX собрала за эти годы, и это представляет собой огромный прирост производительности).

Слабость: для корпоративных приложений .NET не так развита, как Java. У вас не так много поставщиков, создающих корпоративное программное обеспечение в .NET, как у вас для Java.

Джава

Сила: более зрелая (уже объясненная) и имеющая большое сообщество с несколькими отличными проектами с открытым исходным кодом, которые могут помочь. Несколько так называемых проектов с открытым исходным кодом .NET на самом деле являются просто копией проектов из Java.

Слабость: Oracle владеет Java (я знаю, а не JCP), и это определенно риск, который следует учитывать. Их намерения не очень ясны, и мне лично не нравится, где сейчас движется язык (я знаю, что многие разработчики Java имеют схожие проблемы).

Приложение на стороне сервера

Это в основном те же аргументы, что и для веб-приложений, но, поскольку вам не нужно слишком беспокоиться о пользовательском интерфейсе, Java в этом случае становится сильнее. Но опять же, если платформа в основном Windows .NET может быть лучшим выбором.

Общие соображения

В целом, на мой взгляд, .NET имеет преимущество главным образом из-за тесной интеграции Visual Studio 2010 (предоставляет лучшую IDE), MS SQL, Entity Framework, IIS и так далее. Все это представляет собой огромный рост производительности, и у меня есть огромный опыт, подтверждающий это. Кроме того, я работаю в основном с разработчиками Java, которые обратились к .NET, и они придерживаются того же мнения.

Я думаю, что это также хороший момент, что Microsoft сильнее, чем когда-либо, что означает, что .NET будет там некоторое время. Поэтому, глядя в будущее на 10-15 лет, я чувствую себя более защищенным с .NET, чем с Java.

Alex
источник
4

Я недавно окончила университет, но у меня был коммерческий опыт работы с обоими языками, что дает в общей сложности около 3 лет Java и 4 года C # .Net (примечание .net означает, что вы можете использовать C #, VB.net, C ++ CLI, и J # и F #).

Сейчас я констатирую, что мое общее предпочтение - C # по сравнению с Java, хотя оба имеют схожий синтаксис, мне нравится мощь .Net Framework по сравнению с кросс-совместимостью Java. Вы должны сильно подумать, что нужно строить? Это просто настольное приложение? Вам нужно подключение к другим клиентам, таким как другие настольные компьютеры, мобильные телефоны, веб-сайты?

** Обсуждение IDE потеряно, так как вопрос в Stackoverflow был закрыт. В конце концов, в Java было много бесплатных IDE, но они, на мой взгляд, не сравниваются с мощью и аддонами визуальной студии. Но обратите внимание, Visual Studio стоит дороже за лицензию.

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

JonWillis
источник
11
1000 фунтов за лицензию для VS? Если вы получаете подписки MSDN, вы получаете гораздо больше программного обеспечения и инструментов, доступных по цене. Я действительно сомневаюсь, что кто-то платит розничную цену на полку VS2010.
Джеймс Лав
6
@ Майкл, я никогда не пытался писать VS-расширения. Однако я использую или пробовал множество плагинов для Visual studio. К ним относятся Resharper, CodeRush, Gallio, VisualSVN, AnkhSVN, testDriven.Net и многие другие.
ДжонВиллис
2
@JonWillis согласился, что существует множество расширений. Помимо этого списка, я также ежедневно использую Power Tools Power Tools, CKS: Dev для SharePoint и WSPBuilder. В галерее (по адресу visualstudiogallery.msdn.microsoft.com ) есть несколько тысяч, так что не составит труда написать больше расширений для VS (для этого на самом деле предусмотрен полный фреймворк, и есть широкая поддержка сообщества) ,
Джеймс Лав
1
Для проекта, запланированного на 10-15 человеко-лет работы, первоначальная стоимость лицензий VS - арахис.
благоговение
1
Visual Studio 2010 Professional без MSDN стоит 550 долларов.
Борис Янков
3

Схожесть синтаксиса и инструментов приводит к тому, что прирост производительности от C # или java не настолько велик, чтобы существенно изменить ваш рабочий проект на 10 - 15 человеко-лет. Я бы более внимательно посмотрел на такие вопросы, как:

  1. Каковы требования проекта и какие языковые возможности удовлетворяют этим требованиям (например, кроссплатформенность и богатый клиент Windows).
  2. Что я могу использовать в качестве проектного подхода / методологии, которая позволит моей команде работать продуктивно.
  3. Что я могу сделать с рабочей средой, чтобы убедиться, что я нанимаю, сохраняю и полностью использую лучшую команду, возможную для важного проекта.

Я хотел бы предположить, что, на мой взгляд, предпосылка вопроса о том, что «различия в производительности между (C # и Java) могут значительно повлиять на требуемые инвестиции и время выхода на рынок», не соответствует действительности. Я не сомневаюсь, что будет какая-то разница, но она не будет существенной.

AlexC
источник
3

Я переключался между Java и .NET, начиная с Java 1.2 до 1.6 и .NET 1 до 4.0, за более чем 10-летний профессиональный опыт работы (до этого был программистом на C / C ++).

Когда-то, как и в .NET 2.0, я бы сказал, что Java и C # будут примерно одинаковыми, особенно для серверной работы. Языковые конструкции были еще очень похожи. .NET, вероятно, получил бы преимущество в программировании пользовательского интерфейса рабочего стола из-за дизайнера WinForms в Visual Studio, а Java получил бы преимущество в Web / Server, в первую очередь потому, что вы не были привязаны к IIS.

Теперь, перейдя к .NET 3.5 и 4, я даю преимущество в производительности .NET, просто. Это, в первую очередь, на мой взгляд, потому что .NET является гораздо более быстро развивающимся языком, поскольку MS может относительно быстро принимать языковые решения, в отличие от проталкивания изменений в политике JCP. Большие улучшения - это varключевое слово, полный набор Linq, методы расширения, оператор объединения нулей ??,dynamic и , вероятно, гораздо более большой материал , который действительно повышает производительность труда.

Тем не менее, «самый продуктивный» язык для проекта - почти всегда тот, который наиболее удобен и опытен для большинства разработчиков. Кривая обучения всегда самая большая убийца производительности.

rally25rs
источник
3

Одна вещь, которую я заметил, - это то, что многие магазины C # / .NET придерживаются позиции «не изобретено здесь» и запрещают все сторонние библиотеки / библиотеки с открытым исходным кодом, в то время как многие магазины Java более охотно используют библиотеки с открытым исходным кодом. Также, похоже, для Java доступно больше библиотек. Даже если вы посмотрите на некоторые классные сторонние библиотеки в .NET, например, NHibernate, NPOI, Spring.NET и т. Д., Они являются портами библиотек Java и, следовательно, находятся за ними. Похоже, что многие из этих нововведений были первыми в Java, а затем был создан порт .NET. С точки зрения библиотеки, безусловно, Java выигрывает с точки зрения новых инновационных открытий.

Тем не менее, Microsoft делает некоторые официальные библиотеки, например ASP MVC, LINQ и т. Д. Но часто, как и в случае с ASP MVC, сторонние библиотеки, такие как Struts, Spring MVC и т. Д., Уже отсутствовали для Java, и Microsoft опаздывала на веб-парадигму контроллера представления модели.

Конечно, многие из этих библиотек экономят массу времени и повышают производительность. Базовый язык для базового языка C # и Java не так уж отличается, и для меня это слишком близко, чтобы называть. Бросьте в армию сторонних библиотек, и масштаб наверняка сместится в сторону Java. Все еще с открытым магазином много этого наклона уравновешивается. Просто у многих .NET-магазинов здесь нет изобретательности, а у многих Java-магазинов есть все, что нужно для выполнения работы ... Это верно даже для компании, в которой я работаю, команда .NET не получает много (из-за управления), в то время как у команды Java есть много утвержденных сторонних библиотек / утилит. Кроме того, в .NET гораздо больше полезного не является бесплатным (например, до NPOI, если вы хотели работать с офисными документами Microsoft, большинство решений [не считая автоматизации офиса] не были бесплатными.

Cervo
источник
«Не изобретено здесь». На основании чего? Я работаю в смеси между C # и Java, и мне кажется, что люди со стороны Java больше злоупотребляют, например, создают IConverter и реализуют логику для преобразования строки в удвоенную, и наоборот.
Джордж Сильва
По нескольким причинам я предпочитаю C # перед Java, но я предпочитаю «перенастроенные» библиотеки Java To C # по сравнению с нативным C #, как правило, лучше разработанные, протестированные и применяемые в реальном мире.
umlcat
0

Я часто задавал себе этот вопрос: что лучше? C # или Java?

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

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

Салах
источник