|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
32) С определяет int как "наиболее эффективное целое число, не короче, чем 16 бит". То есть если на машине длина слова 18 бит, то и целое будет 18 бит. Жаба же определяет int как ровно 32 бита, а long как ровно 64. И если на машине нет 32-битных чисел (например, есть только 64-битные), придется моделировать. Мне это не нравится. Отсутствие беззнаковых чисел мне тоже не нравится. По данному пункту. Скорее всего я просто констатирую что ничего не изменилось в Java. int - 32х битный и это правильно. Это упрощает жизнь. Добавлю что новые ЯП такие как Golang вводят встроенные типы: uint16, uint32 e.t.c. с жестко заданной разрядностью. Rust также вводит типы: u16, u32 e.t.c с фиксированной сеткой. Машинно-зависимые типы такие как usize/isize у него изначально зарезервированы под platform pointer's type. Это правильно. Не будет соблазна толкать их в общий поток целочисленых вычислений. Далее я нарушу своё правило и позволю обсудить то что уже давно обсуждалось. Не сосем понятен камент И если на машине нет 32-битных чисел (например, есть только 64-битные), придется моделировать Что моделировать? Что за инженерная задача? Построение компиллятора? JVM ? Особое железо? Сопряжение через network с гетерогенной Java-системой? Те кто поняли о каких-таких трудностях толкует автор - прошу прояснить. По поводу отсутствия беззнаковых чисел. Я здесь соглашусь. Мне-бы не помешала семантика UINT64 для точного толкования return значения из функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 00:42 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
booby, ого ты букв написал. Ну не знаю что тебе ответить. Подумаю и отпишу позже. А по поводу Африканца - ну и буй с ним. Пускай отдыхает старичок. Без него разберёмся. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 00:43 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
33) Жаба предоставляет некоторые особо высокоуровневые возможности, такие, как клонирование (глубокое копирование) объектов и сериализация. Обе опасны в неумелых руках. Чайник, не задумываясь, склонирует (или сериализует) громадный граф, лишь бы добиться какой-то сиюминутной цели. Сериализация уже привела к тому, что программмы хранят свои настройки не в приятных для глаза ini-файлах, и не в Registry, а в многочисленных файлах, полученных путем сериализации объектов. Положение сериализации на сегодняшний день. Совершенная мифология. Возможно автор экстраполировал прочитанное в книжках на некую реальность или представлял как-бы он делал. Но серилизацию делают через Orm-ы и специализированные библиотеки такие как Cryo. Вообще сама по себе проблематика искусственна и высосана из пальца. Всё давно завернуто в entity-beans и аннотировано и завёрнуто в фрейморки и формализовано для избежания ошибок. Жуткая ситуация с сериализацией графа - невозможна (я гарантирую это) т.к. для графов юзают JUNG, JGraphT и прочее где этот вопрос урегулирован. Конечно нубас может запилить глубокое копирование графа но если учесть что сама по себе уже работа с графами нетривиальна то обсуждать сериализацию безсмысленно. Это капля дерьма в огромную кучу того-же дерьма. Уже хуже не станет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 01:31 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
mayton, 31), 32) и 33) изложены предельно слабо. Но в целом они есть часть "претензий" из "мира C/C++" к "миру java", при этом внутри первого из миров по каждому из пунктов существуют идущие десятилетиями внутренние междусобойчики. 31) - сугубо от академического мира претензия. т.к. "+" в математике операция коммутативная, то не стоит ломать школьные привычки и рисовать + для некоммутативного случая: "foo" + "bar" != "bar" + "foo" 32) Изложена сугубо сишная проблема. Сказать-то он хотел примерно следующее - "про С известно, что ее целочисленная арифметика быстрая, т.к. она машинная, а про яву мы ничего не знаем - какая она окажется. Может, вдруг, и библиотечной оказаться". При ином чтении - это чистой воды переброс с больной головы на здоровую - Там где реализация норовит положить int в "наличное машинное слово", начиная с 32-разрядных систем int перестает отличаться от long, что в общем случае ведет к проблемам interoperability и binary compatibility, заставляя плодить нестандартные типы, в общем случае - ах да - конечно с "библиотречной поддержкой" , от операционной системы, например. 33) кролики - это не только ценный мех, но и 3-4 килограмма диетического, легкоусвояемого мяса. (@Кролики) "глубокое копирование" самая - самая базовая проблема в "типизированном императивном программировании" Что должен делать оператор присваивания a=b? И что должен делать оператор сравнения? Когда тебе рассказывают, что присваивание должно втыкать в a ссылку на тот же объект, ссылка на который сидит в b или сравнение должно сравнивать ссылки, сидящие в a и b и считать значения в переменной равными, только если ссылки равны, то тебе рассказывают, что "глубокое копирование" настолько дорого, что никакой возможности ни присваивать, ни передавать по значению, ни сравнивать по значению в нашем языке нет. У нас есть только mutable, причем несравнимо mutable. Но КАК? Как вообще программировать, если возможности сравнивать по значению ничего кроме ссылок нет. Так может не оказаться возможности выяснить, что 2 + 2 = 4, просто потому, что ссылка на 2 + 2 не совпадает со ссылкой на 4. А и как программировать mutable в многопоточном окружении без очередей и дедлоков? А когда тебе говорят - чтобы твоя программа работала быстро и потоки были независимы по данным - используй immutable - приходит Африканец и спрашивает: ну, и как ты будешь теперь "глубоко копировать" свой граф, или хотя бы часть его? Твой ответ Африканцу - а мои immutable будут махонькими, я их в честь этого даже обучу сравниваться по значению через equals. Сериализация - т.е. двоичная передача кода вместе с данными, стандартизированная в языке - вещь неведомая для мира С. это еж с ужом, которого и назвать-то с ходу не получается. В яве сериализация - это "наш ответ министерству обороны" - Аде, в которой DIANA изначально задумывалась для приблизительно аналогичных целей - машинно-независимого представления алгоритмов, структур данных и самих данных. То есть - создателям явы захотелось быть тоже в танке. Это казалось исключительно крутой идеей. Предъявлять со стороны С здесь претензию большого смысла не имеет. Но можно мелко покуражиться. Не обращай внимания. Хорошо это может получиться у тех, кто умеет целиком обновить через космическую связь программное обеспечение летящего самолета не прекращая работы автопилота. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 04:43 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
вадяUsmanвадя, var (справочник по C#) но для написания в ide лучше четко определить - ide будет проще конторолировать.Ок. Директива using (Справочник по C#) (см. директива псевдонима using) На фоне этого бриллиантовый оператор начинает тускнеть (: ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 06:40 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
booby31) - сугубо от академического мира претензия. т.к. "+" в математике операция коммутативная, то не стоит ломать школьные привычки и рисовать + для некоммутативного случая: "foo" + "bar" != "bar" + "foo" Я полностью согласен с некоммутативностью. Но ведь это вообще не по адесу. Это не околожабство а около-сиплюсовость. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 08:57 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
32) Изложена сугубо сишная проблема. Сказать-то он хотел примерно следующее - "про С известно, что ее целочисленная арифметика быстрая, т.к. она машинная, а про яву мы ничего не знаем - какая она окажется. Может, вдруг, и библиотечной оказаться". При ином чтении - это чистой воды переброс с больной головы на здоровую - Там где реализация норовит положить int в "наличное машинное слово", начиная с 32-разрядных систем int перестает отличаться от long, что в общем случае ведет к проблемам interoperability и binary compatibility, заставляя плодить нестандартные типы, в общем случае - ах да - конечно с "библиотречной поддержкой" , от операционной системы, например. Я себе пытаюсь воспроизвести рассуждения Гослинга. И возможно он думал так. "Проблема производительности целочисленных вычислений на регистрах не стоит так остро как проблема бинарной совместимости или интероперабельности. Нам важнее обеспечить второе т.к. это ключевой момент для платформера а скорость всегда можно подтянуть, просто дорабатывая саму JVM. Пускай скорость станет проблемой JVM а не разработчика". ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 09:04 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
maytonВ данном тезисе автор лихо играет софизмами и парадоксами (почеркнуто) тоесть не по сути. Аллокация new действительно всегда работает OK и память всегда есть. Ситуация когда ее нет - не перехватываемая ошибка и с точки зрения приложения - это авария и на ее решение вобщем-то нет рецепта нигде. Нет - автор просто склонен к системному программированию не прикладному, где подобные ситуации вполне нормальное поведение. Для этого java действительно неподходящий язык. И многие его ограничения действительно чисто идеологические - авторы посчитали, что так правильно. Это еще, что на одной конференции всплывал вопрос как решается на java задача с размещением нескольких полей объекта в одном cache-line. Только отдельная программа на каждый вид, с определенными знаниями как конкретный компилятор ее скомпилирует и конкретная jvm запустит. Почему-то макросы и условная компиляция воспринимались авторами java исключительно как Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 11:07 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
maytonСовершенная мифология. Причем старая - сам же пишешь стандартной сериализацией никто не пользуется. Используют сторонние библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 11:11 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
boobyСериализация - т.е. двоичная передача кода вместе с данными, Сериализация, это не передача кода и даже не данных. Африканец рассуждал про вау фичу: Код: java 1.
Часто Вы этим пользуетесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 11:22 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
mayton33) Жаба предоставляет некоторые особо высокоуровневые возможности, такие, как клонирование (глубокое копирование) объектов и сериализация. Обе опасны в неумелых руках. Чайник, не задумываясь, склонирует (или сериализует) громадный граф, лишь бы добиться какой-то сиюминутной цели. Сериализация уже привела к тому, что программмы хранят свои настройки не в приятных для глаза ini-файлах, и не в Registry, а в многочисленных файлах, полученных путем сериализации объектов. Положение сериализации на сегодняшний день. Совершенная мифология. Возможно автор экстраполировал прочитанное в книжках на некую реальность или представлял как-бы он делал. Но серилизацию делают через Orm-ы и специализированные библиотеки такие как Cryo. Вообще сама по себе проблематика искусственна и высосана из пальца. Всё давно завернуто в entity-beans и аннотировано и завёрнуто в фрейморки и формализовано для избежания ошибок. Жуткая ситуация с сериализацией графа - невозможна (я гарантирую это) т.к. для графов юзают JUNG, JGraphT и прочее где этот вопрос урегулирован. Конечно нубас может запилить глубокое копирование графа но если учесть что сама по себе уже работа с графами нетривиальна то обсуждать сериализацию безсмысленно. Это капля дерьма в огромную кучу того-же дерьма. Уже хуже не станет. Автор пишет о сериализации вполне корректно: 1) ...Обе опасны в неумелых руках ... 2) ..."что программмы хранят свои настройки не в приятных для глаза ini-файлах...а в многочисленных файлах, полученных путем сериализации объектов" Где автор такое видел, не знаю. Но с его негодованием полностью согласен. Понятно, что в большей мере вина программистов. 3) Сейчас плотно с RMI работаю, Serializable медленная до жути. Планирую перевести на Externalizable, но руки не доходят. Ну так об этом и негодование автора, что есть удобные и не правильные механизмы (Serializable) и более правильные, но менее удобные (Externalizable). Какой механизм для использования выберет программист.... такая программа и получится. Я выяснил, что Serializable для моей программы не очень подходит... но времени все равно не выкроил. Что окажется в продакшен, ктож его знает ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 11:29 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Сергей Арсеньев...За это действительно приходится расплачиваться отсутствием HashTable<int,..> FastUtils Сергей АрсеньевДа GC потом съест кучу лишних оберток не поморщившись, но выделять то память под них будет нужно, хотя и действительно не обязательно. "не поморщившись" и GC ? Мне кажется Вы преувеличиваете. Если HelloWorld то да, а если WebServer и серьезное приложение, то в каком месте раскидали "кучу оберток" - пойди найди Копатся в дампе кучи, что бы понять, где leak, это еще то удовольствие. Когда в Top'е видишь 600 000 объектов byte[] и 585 000 объектов String.... IMHO Может я конечно просто не умею. Но радости смотреть на 2-3 Gb дамп кучи от нагруженного продакшена - нет никакого. Сергей АрсеньевТезис про deprecated - это показатель, что язык живой (вон см. LocalDate и пр. - теперь модно так). Но и показатель, что не устоявшийся. Просто куча ошибок, которые можно было СРАЗУ не делать. Calendar, DateTime LocalDate и etc ПОЧЕМУ в одних классах МЕСЯЦ нумеруется с 0, а в других с 1 ???? Я понимаю, когда в разных языках. Но Б...Ь в одном языке можно сделать единообразно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 11:38 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСергей Арсеньев...За это действительно приходится расплачиваться отсутствием HashTable<int,..> FastUtils Я не про реализацию, я про то как сделать код одинаковым и для long и для int. В java примитивы вынесены в отдельную группу. И с ними много чего делать нельзя - потому что работа с примитивами это моветон. Такое впечатление, что авторы языка от них бы с радостью отказались. Но... Leonid KudryavtsevЯ понимаю, когда в разных языках. Но Б...Ь в одном языке можно сделать единообразно? То один порулит, то другой. Нормальный жизненный процесс. Гы. По большому счету языку все равно, какой там тип даты. Это ж не примитив, а все остальное - хоть с марта считай, а февраль делай отрицательным. Как раз и отсутствие беззнакового числа тебе в помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 12:19 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Сергей АрсеньевЯ не про реализацию, я про то как сделать код одинаковым и для long и для int. В java примитивы вынесены в отдельную группу. И с ними много чего делать нельзя - потому что работа с примитивами это моветон. Такое впечатление, что авторы языка от них бы с радостью отказались. Но... Меня это сейчас жутко раздражает. Программа - фактически калькулятор по бруд-форсе алгоритму. Нужно просматривать миллионы вариантов на графе. Почти все данные замечательно укладываются в int/long. Поэтому его и использую ))) Просто, быстро.... но неудобно. Фиг поймешь, что в конкретном месте этот int/long обозначает. В одном месте - код из БД, в другом - код но другого объекта, номер node в графе, номер node в "графе после обработки", время и так далее. В языке C хотя бы была инструкция typedef. Она вроде на корректность во время компиляции не проверяла, но хотя бы можно в описании ф-ции типы параметров нормально указывать. А так у ф-ции 10-ь параметров и все int. Что под этим подразумевается - только в комментария. Ни какой даже самой минимальной проверки и/или удобства на этапе написания кода. ((( IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 12:38 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Сергей АрсеньевЭто еще, что на одной конференции всплывал вопрос как решается на java задача с размещением нескольких полей объекта в одном cache-line. Только отдельная программа на каждый вид, с определенными знаниями как конкретный компилятор ее скомпилирует и конкретная jvm запустит. Не оно? http://openjdk.java.net/jeps/142 А вообще из бреда по ссылке реально крутая фича, это вот это: 22) Каждый раз, когда мы описываем структуру (она же запись, она же класс), происходит выделение памяти в куче. Каждый раз, когда мы ее потом используем, происходит обращение по указателю. Зачем? Я понимаю, все это может быть полезно для "классов" - из-за возможного наследования их как раз полезно в куче размещать. Но что, если мы просто определили структуру Point с двумя полями, x и y - ну зачем тут куча? А представьте себе, что мы определили "линию" как две точки: Особенно для системного программирования, которой нет в Java это наличие Си'шных struct'ов, как следствие потом появляются доклады типо такого ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 12:53 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
22) Каждый раз, когда мы описываем структуру (она же запись, она же класс), происходит выделение памяти в куче. Каждый раз, когда мы ее потом используем, происходит обращение по указателю. Зачем? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis Но тут есть одно "но". Когда я экспериментировал с шестеркой, то пришел к выводу, что в ней массивы всегда выделяются в куче. Возможно, сейчас это починено. А вот насчет доклада Елизарова - действительно все сложно. Классы можно писать либо удобно - либо быстро, но не и то и другое одновременно. Так чтобы наиболее удобное написание оказалось самым быстрым - еще нигде не придумали. Но все равно, по сумме это лучше с++, где удобства вообще не существует. помоему, одно из немногих где он правд это во второй части: 8) Еще одно техническое околожабство - так называемые методы доступа. Написав любую структуру. любой жабовский программист всегда первым делом начинает писать методы доступа. вот это я не могу понять. Сейчас оракловцы всерьез подумывают о var-val, устраивают холивары, но это var экономит что? экономится четверть одной строчки. Ага, наглядней. Лучше бы сделали нормально сеттеры с геттерами. И multiline-строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 14:39 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
chabapok22) Каждый раз, когда мы описываем структуру (она же запись, она же класс), происходит выделение памяти в куче. Каждый раз, когда мы ее потом используем, происходит обращение по указателю. Зачем? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis Но тут есть одно "но". Когда я экспериментировал с шестеркой, то пришел к выводу, что в ней массивы всегда выделяются в куче. Возможно, сейчас это починено. .... По Вашей ссылки: "..It does NOT replace a heap allocation with a stack allocation for non-globally escaping objects..." ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 14:45 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, а в чем профит от аллокации на стеке, вместо аллокации в хипе? На сколько я понимаю важно, чтобы нужные данные были непрерывным куском в памяти, тогда процессор при обработке такого массива сможет "угадывать", какие данные понадобятся и предзагружать их в кэш. Или я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 15:19 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
chabapokА вот насчет доклада Елизарова - действительно все сложно. Классы можно писать либо удобно - либо быстро, но не и то и другое одновременно. Так чтобы наиболее удобное написание оказалось самым быстрым - еще нигде не придумали. Но все равно, по сумме это лучше с++, где удобства вообще не существует. Я не понимаю, что мешает добавить некий признак (ключевое слово, аннотацию и т.д.), который будет подсказывать JVM, что в массиве сразу за ссылкой идет непосредственно сам объект? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 15:26 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
just_vladimirа в чем профит от аллокации на стеке, вместо аллокации в хипе скорость уменьшение нагрузки на подсистему памяти (new, GC) => уменьшение (экономия) требований приложения к объему памяти для нормальной(комфортной) работы just_vladimir...что в массиве сразу за ссылкой идет непосредственно сам объект? Это как? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 15:32 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevjust_vladimir...что в массиве сразу за ссылкой идет непосредственно сам объект? Это как? Да немного бред написал, в общем если я верно понимаю ради чего выполняются упражнения, о которых рассказывается в докладе, то возникают они из-за того, что массив объектов в Java это массив ссылок на объекты и из-за этого есть проблема, что нет гарантии того, что непосредственно сами объекты, на которые указывают эти ссылки будут располагаться где то в виде непрерывного куска памяти и как следствие процессору очень не удобно ходить постоянно в разные места памяти. Соответственно нужно как то уметь подсказывать JVM, чтобы сами объекты были точно так же за аллоцированы непрерывным куском памяти (хотя вообще странно, что JVM по умолчанию именно так и не поступает, а может и поступает и я не понял этой части доклада :-) ). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:20 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
just_vladimirДа немного бред написал, в общем если я верно понимаю ради чего выполняются упражнения, о которых рассказывается в докладе, то возникают они из-за того, что массив объектов в Java это массив ссылок на объекты и из-за этого есть проблема, что нет гарантии того, что непосредственно сами объекты, на которые указывают эти ссылки будут располагаться где то в виде непрерывного куска памяти и как следствие процессору очень не удобно ходить постоянно в разные места памяти. Соответственно нужно как то уметь подсказывать JVM, чтобы сами объекты были точно так же за аллоцированы непрерывным куском памяти (хотя вообще странно, что JVM по умолчанию именно так и не поступает, а может и поступает и я не понял этой части доклада :-) ). Доклад не смотрел. У меня наушников нет. AFAIK Java так память и выделяет. Есть 2-е Eden области, одна из которых заполняется __последовательно__ с начала в конец, когда она заполнится, запускается Copy GC и начинает заполняться вторая Eden область. Так попеременно и работают. Мало того, для ускорения работы, каждому Thread заранее выделяется свой кусок. Т.ч. by default, при двух последовательных вызовах new, очень велика вероятность, что объекты окажутся рядом в куче. Разумеется, это верно для Eden области, в Old, скорее всего, фрагментация сильнее. Хотя, нужно читать. Но смысла "развертывать" class/stucture по полям, что в C, что в Java может быть много. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:44 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНо смысла "развертывать" class/stucture по полям, что в C, что в Java может быть много.Насколько я понимаю, именно этим занимается "анализ убегания". И если JIT сочтёт скаляризацию возможной итоговый код может быть сильно оптимальнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 18:05 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
just_vladimirа в чем профит от аллокации на стеке, вместо аллокации в хипе? меньше засирается хип, gc проще чистить память. GC работает неидеально. Leonid KudryavtsevДоклад не смотрел. У меня наушников нет. Доклад Елизарова смотрел давно, но кратко по нему и другим различным докладам: У каждого инстанса есть заголовок со служебной информацией, насколько помню в хотспоте то ли 12 байт, то ли 11. Каждый инстанс выравнивается по 8 байтам. В массиве же все лежит подряд. Это значит, что если в кэш подгружается больше данных, то реже происходят кэшмиссы. А кэшмисс - это очень плохо, потому, что если данных не оказалось в L1, и не оказалось в L2 - в L3(он общий для всех) никто лезть за ними не спешит. Эти данные могут быть в L2 других ядер. Но если уже пошла подгрузка данных в L3, то там могут быть остановлены другие ядра, потому что мэппинг L3 на память хранится в аппаратной хэшмапе, а она однопоточна. По этой причине, каждый кэш-промах - это сотни "утерянных" тактов. Плюс работа различных аппаратных предсказателей, параллелизаторов, префетчеров, ускорителей. И если мы нашу программу так оптимайзим, то получается нечто, что не блещет красотой, но зато быстро работает. Но критики java забывают, что на С такое тоже не блестало бы красотой. Обычно сишники таким вообще не заморачиваются. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 23:40 |
|
Java 8 - уже не совсем Java?
|
|||
---|---|---|---|
#18+
с выравниванием данных все становится еще интереснее если учитывать false-sharing, который приходится учитывать. В идеале конечно элемент массива должен попадать на один кэш лайн, именно поэтому в старом коде нередко можно увидеть классы, в которых одно "боевое" поле и оно добито long-ами до 64 или 128 байт(самое смешное что оптимизаторы jvm если видят что поле не юзается вроде как могут его выпилить:)). Но так как эти самые кэш лайны у разных процессоров могут быть разной длины, то приходится писать под определенное железо. Кто-то даже предлагал ввести аннтоацию для jvm именно для таких случаев, не знаю чем закончилось. Если честно я утерял нить спора уже, имхо прелесть javы в том что 99% процентов времени ты будешь писать как тебе удобно не думаю о низкоуровневых деталях, на то есть JVM, а в редких случаях есть возможность и подшаманить, и как правильно сказали оптимизации будут некрасивыми что на С что на java ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 23:50 |
|
|
start [/forum/topic.php?fid=59&msg=39203315&tid=2120495]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 156ms |
0 / 0 |