Здравствуйте, Gregory_krovosos, Вы писали:
G_>>>Про недостатки .NET сразу приходит в голову — отстутствие реальной кроссплатформенности и поддержки большого числа компаний.
J>>А оно надо? Что-то win до сих пор это никак не мешало...
G_>Windows завоевало клиента, но не сервер.
S>>> А вот скорости нужно сравнить G_>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом.
Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться
с применением класса вместо этой структуры.
S>>>> А вот скорости нужно сравнить G_>>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом.
G_>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>с применением класса вместо этой структуры.
На вскидку — плотные вычисления над большими матрицами комплексных чисел. .
G_>>fixed — ?
AVK>Блокировать класс от перемещения в памяти сборщиком мусора. Нужно для того чтобы обойтись без маршалинга при общении с неуправляемым кодом.
G_>>using — имеется в виду очевидно использование IDisposable? (а не подключение пакетов?) Этого в Яве нет, но в концепции сборщика мусора нужно ли это?
AVK>Нужно. Ждать пока сборщик вызовет финалайзеры для некоторых ресурсов (например файловые хендлы или соединение с БД) неприемлемо.
G_>>unsafe — это возможность вызова платформенного кода? Если да — это вроде бы в Яве с рождения.
AVK>Нет, возможность явного использования указателей и адресной арифметики. Обычно используется совместно с fixed.
G_>>Interop -?
AVK>А вот это как раз и есть взаимодействие с нативным кодом.
Насчет автоматического вызова финалайзера — это неплохая возможность, но она уже не так значима как, скажем, в C++.
Все остальное, как я понимаю, есть мудреные технологии, которые позволяют юзать COM-объекты и найтивный код.
Вообще-то, как я понимаю Java и .NET создавались как раз чтобы избежать этого... В любом случае, в Java есть JNI. Он дает возможность
писать платформенный код.
G_>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>с применением класса вместо этой структуры.
Здесь дело не в том, что нельзя решить а в эффективности использования в массивах
1. Более быстый доступ (без лишней ссылки)
2. Ипользование DDR памяти с фоновой подкачкой, при использовании массива попадает только ссылка, и при больших объемах при не попадании в кэш процессора доступ в 10 раз медленнее
3. Экономия памяти. В Net под объект дополнительно выделяется 8 байт (ссылка на VMT, SincBlockIndex)
4. Не нужно ЖЦ следить за объектом, отсутвие write Barier. http://www.rsdn.ru/Forum/Message.aspx?mid=558877&only=1
G_>>>>Начать можно со такого вопроса — чего есть в C# + .NET такого чего нет в Java? Принимается все — начиная от конструкций языка и заканчивая технологиями и скоростями работы. kuj>>>enumerations, fixed, using, unsafe, Interop... G_>>Enum в 1.5 появились. kuj>А поддержку со стороны библотек тоже сделали?
Не знаю, есть поддержка нового for(item:collection). Вот пример оттуда:
public enum Suit { spade, diamond, club, heart };
public enum Value { ace, two, three, four, five,
six, seven, eight, nine, ten,
jack, queen, king };
List<Card> deck = new ArrayList<Card>();
for (Suit suit : Suit.VALUES)
for (Value value : Value.VALUES)
deck.add(new Card(suit, value);
Collections.shuffle(deck);
G_>>fixed — ? kuj>Лазейка на низкий уровень. Позволяет использовать адресную арифметику и запретить проверку на выход за границы массива.
G_>>using — имеется в виду очевидно использование IDisposable? (а не подключение пакетов?) Этого в Яве нет, но в концепции сборщика мусора нужно ли это? kuj>Чисто ради удобства. В finally можно забыть закрыть системный ресурс, с using это происходит реже.
G_>>unsafe — это возможность вызова платформенного кода? Если да — это вроде бы в Яве с рождения. kuj>Нет. unsafe используется обычно в паре с fixed. kuj>The unsafe keyword denotes an unsafe context, which is required for any operation involving pointers.
G_>>Interop -? kuj>Для вызова функции из внешних dll, создания COM, ActiveX объектов. В том числе предоставляет средства для маршалинга.
Ну, вообщем можно сказать что в C# более продвинутая поддержка наитивного кода?
G_>>>>Что на ваш взгляд является главным недостатком Java? kuj>>>EJB Ах, да... еще создание GUI под Windows.. G_>>Имеются в виду тормоза Swing? Есть Eclipse. kuj>Да это я в шутку. Сейчас GUI на Java вполне неплох. Даже swing`овый.
G_>>>>Про недостатки .NET сразу приходит в голову — отстутствие реальной кроссплатформенности и поддержки большого числа компаний. G_>>>>Вообщем, прошу к барьеру kuj>>>А если серьезно, то Java определенно более сильна в случае Enterprise-level систем. kuj>>>Во всех других случаях можно долго выяснять кто же лучше, но это пустая трата времени, т.к. в общем случае они примерно равны. В итоге все сведется к выяснению у кого же лучший набор библиотек... G_>>Ну так и у кого он лучший? kuj>Это из серии: "в какой стране самые красивые девушки". Вопрос, на который физически не возможно дать объективный и однозначный ответ.
Здравствуйте, Дарней, Вы писали:
Д>из того, что я слышал — генерики в Яве эмулируются с помощью reflection'a,
Нет, не с помощью рефлекшена конечно. Дженерики там настоящие, просто из-за того что они приняли решение не менять рантайм они не создают специализированных реализаций для value-типов, а вместо этого заворачивают их в типы ссылочные. Отсюда даже дженерик-алгоритмы в джаве будут полиморфными.
Здравствуйте, Gregory_krovosos, Вы писали:
G_>Не знаю, есть поддержка нового for(item:collection). Вот пример оттуда:
G_>public enum Suit { spade, diamond, club, heart };
G_>public enum Value { ace, two, three, four, five, G_> six, seven, eight, nine, ten, G_> jack, queen, king };
G_>List<Card> deck = new ArrayList<Card>(); G_>for (Suit suit : Suit.VALUES) G_>for (Value value : Value.VALUES) G_> deck.add(new Card(suit, value);
G_>Collections.shuffle(deck);
Не, это аналог шарпового foreach. Enum это другое, это перечисляемые типы
G_>Ну, вообщем можно сказать что в C# более продвинутая поддержка наитивного кода?
Здравствуйте, Gregory_krovosos, Вы писали:
G_>Про недостатки .NET сразу приходит в голову — отстутствие реальной кроссплатформенности и поддержки большого числа компаний.
У Java из этих двух недостатков есть только один — отсутсвие реальной кроссплатформенности.
Причем вызван он по-моему в основном неспешностью Sun в комплексе с его же схемой лицензирования и сертифицирования.
G_>>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>>с применением класса вместо этой структуры. S> Здесь дело не в том, что нельзя решить а в эффективности использования в массивах S> 1. Более быстый доступ (без лишней ссылки) S> 2. Ипользование DDR памяти с фоновой подкачкой, при использовании массива попадает только ссылка, и при больших объемах при не попадании в кэш процессора доступ в 10 раз медленнее
Это все довольно спорно. Компилятор может оптимизировать подобные вещи.
S> 3. Экономия памяти. В Net под объект дополнительно выделяется 8 байт (ссылка на VMT, SincBlockIndex)
S>>>>> А вот скорости нужно сравнить G_>>>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>>>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом.
G_>>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>>с применением класса вместо этой структуры.
BiТ>На вскидку — плотные вычисления над большими матрицами комплексных чисел. .
G_>>Про недостатки .NET сразу приходит в голову — отстутствие реальной кроссплатформенности и поддержки большого числа компаний.
VVB>У Java из этих двух недостатков есть только один — отсутсвие реальной кроссплатформенности. VVB>Причем вызван он по-моему в основном неспешностью Sun в комплексе с его же схемой лицензирования и сертифицирования.
В смысле, что мало платформ поддерживается или что неаккуратно поддерживается?
G_>>>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>>>с применением класса вместо этой структуры. S>> Здесь дело не в том, что нельзя решить а в эффективности использования в массивах S>> 1. Более быстый доступ (без лишней ссылки) S>> 2. Ипользование DDR памяти с фоновой подкачкой, при использовании массива попадает только ссылка, и при больших объемах при не попадании в кэш процессора доступ в 10 раз медленнее
G_>Это все довольно спорно. Компилятор может оптимизировать подобные вещи.
Не сможет он соптимимизировать последовательное расположение. И на таких алгоритмах http://www.rsdn.ru/forum/Message.aspx?mid=635534&only=1
отставание чудовищное. S>> 3. Экономия памяти. В Net под объект дополнительно выделяется 8 байт (ссылка на VMT, SincBlockIndex)
G_>Ну, это несерьезно. Выгоды больше.
S>> 4. Не нужно ЖЦ следить за объектом, отсутвие write Barier. http://www.rsdn.ru/Forum/Message.aspx?mid=558877&only=1
S>>>>>> А вот скорости нужно сравнить G_>>>>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>>>>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом.
G_>>>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>>>с применением класса вместо этой структуры.
BiТ>>На вскидку — плотные вычисления над большими матрицами комплексных чисел. .
G_>А почему нельзя это сделать с помощью классов?
Выделение большого количества памяти в куче гораздо более долгий процесс — нежели выделение того же объёма памяти в стеке.
P.S. А ещё лучше — сравните скорость создания больших (2048x2048) матриц с комплексными числами, в первом случае являющихся классами, а во втором — структурами.
Здравствуйте, Дарней, Вы писали:
Д>Reflection.Emit, то есть возможность генерации кода в run-time
В Java на самом деле это тоже есть (В Sun-овской реализации). Т.е можно сгенерировать класс в рантайме и тут же загрузить в JVM. Проблема в том, что эта функциональность скрыта. Видимо, Sun посчитала эту функциональность лишней (и оставила лишь ClassLoader.defineClass, без констант байт-кода и сборщика класса).
Более того, при десериализации это используется. Там какой-то хитрый класс зачем-то генерится.
S>>>> А вот скорости нужно сравнить G_>>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом. G_>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>с применением класса вместо этой структуры.
Вопрос в эффективности, а не в невозможности решения.
Здравствуйте, Gregory_krovosos, Вы писали:
S>> 3. Экономия памяти. В Net под объект дополнительно выделяется 8 байт (ссылка на VMT, SincBlockIndex) G_>Ну, это несерьезно. Выгоды больше.
Какой еще выгоды?
S>>>>>>> А вот скорости нужно сравнить G_>>>>>>Нууу. Наличие стуктуры, то есть класса, урезанного по функционалу, это вообще не аргумент! kuj>>>>>Структура и класс в .NET совсем разные понятия. Структура — value-type — передается по значению. Класс — reference-type — передается по ссылке. Но самое примечательно, value-type зачастую передаются заметно быстрее reference-type. Именно поэтому структуру в .NET ну никак нельзя считать урезанным классом.
G_>>>>Приведите, пожалуйста, пример задачи, которая решается с применением структуры и не может решиться G_>>>>с применением класса вместо этой структуры.
BiТ>>>На вскидку — плотные вычисления над большими матрицами комплексных чисел. .
G_>>А почему нельзя это сделать с помощью классов?
BiТ>Выделение большого количества памяти в куче гораздо более долгий процесс — нежели выделение того же объёма памяти в стеке.
Т.е. медленнее означает "нельзя"?
BiТ>P.S. А ещё лучше — сравните скорость создания больших (2048x2048) матриц с комплексными числами, в первом случае являющихся классами, а во втором — структурами.
Причем тут — матрица или не-матрица? Ясно, что создание большого объекта в куче займет больше времение чем операция sub esp, <большой_размер_объекта>