Два варианта добавления в List
А что, менее странных способов задержанной инициализации в джаве до сих пор не придумали?
Например?
Третий вариант: сразу создать список и объявить поле final.
Не.
Суть такая формируется json, если поле проинициализировано, то будет так [] отправлено на клиента, что не очень хорошо.
Вопрос в другом, как продуктивней?
Суть такая формируется json, если поле проинициализировано, то будет так [] отправлено на клиента, что не очень хорошо.
Вопрос в другом, как продуктивней?
В скале, если не ошибаюсь, список — абстрактный класс, у которого два наследника: Null и непустой список.
Сделай так.
Сделай так.
более быстрый первый вариант (с исключением но писать лучше так, как во втором варианте (с явной проверкой на null)
рабоче-крестьянский вариант
при добавлении
при отправке
при добавлении
this.not_empty = true;
при отправке
if (this.not_empty) {
// отправить this.exclusions
} else {
// отправить null
}
if (this.exclusions == null)где скобочки блиать?!
this.exclusions = new ArrayList<ExclusionJson>
1. Есть мнение, что плохо использовать исключения для неисключительных ситуаций (Bloch, Effective Java, Item 57).
2. Есть мнение, что плохо использовать null как вместо пустых коллекций (Bloch, Effective Java, Item 43 так и null'ы внутри коллекций (например, в Guava). При относительно сложной бизнес-логике null-checking становится проблемой.
3. У используемого тобой JSON-процессора может быть специальная опция, позволяющая обрабатывать такие случаи. Например, в Jackson можно делать @JsonInclude(Include.NON_EMPTY).
2. Есть мнение, что плохо использовать null как вместо пустых коллекций (Bloch, Effective Java, Item 43 так и null'ы внутри коллекций (например, в Guava). При относительно сложной бизнес-логике null-checking становится проблемой.
3. У используемого тобой JSON-процессора может быть специальная опция, позволяющая обрабатывать такие случаи. Например, в Jackson можно делать @JsonInclude(Include.NON_EMPTY).
1. Есть мнение, что плохо использовать исключения для неисключительных ситуаций (Bloch, Effective Java, Item 57).okay.jpg
Что дорогостоящей?Найди какой-нибудь фреймворк для микробенчмарков и потесть. Я для скалы так всегда делаю.
Думаю, правильнее всего так:
private List<ExclusionJson> exclusions = new ArrayList<ExclusionJson>
...
public void addExclusion(ExclusionJson exclusion){ exclusions.add(exclusion); }
...
Производительность тут довольно спорынй вопрос.
Первый вариант будет сильно медленее второго, в тех случаях когда в поле null. К тому же, может некорректно работать, NPE, знаете ли, не только так, как задумал автор, можно словить.
Второй вариант может быть будет медленее первого, ибо типа лишний компэр, но извините вы этого на современных платформах ну вот совсем не заметите...
Первый вариант будет сильно медленее второго, в тех случаях когда в поле null. К тому же, может некорректно работать, NPE, знаете ли, не только так, как задумал автор, можно словить.
Второй вариант может быть будет медленее первого, ибо типа лишний компэр, но извините вы этого на современных платформах ну вот совсем не заметите...
Рекомендую сначала прочитать айтем, а потом уже свои океи рисовать
Тут кстати вроде недавно где-то пробегала ссылка, что какие бы то ни было эксепшены вообще зло, и там довольно разумные аргументы приводились... Так что...
Тут кстати вроде недавно где-то пробегала ссылка, что какие бы то ни было эксепшены вообще зло, и там довольно разумные аргументы приводились... Так что...
Был у меня на собеседовании как-то человек, который производительность LinkedList'а бенчмаркил, чтобы получить очевидные выводы типа того, что дороже всего вставка в середину списка, а вставка в начало/конец дешевле всего.
Это так, к тому, что иногда быстрее все-таки сурсы побраузить.
Это так, к тому, что иногда быстрее все-таки сурсы побраузить.
Это так, к тому, что иногда быстрее все-таки сурсы побраузить.Для меня jvm - чёрный ящик. И учитывая, что реализации могут быть разными, я не стремлюсь его открыть и разбираться в содержимом. Вопрос о том, что лучше - условное выполнение или исключение относится скорее к реализации jvm и разнообразным оптимизациям. Поэтому всё-таки в данном случае сильно проще померить производительность бенчмарком.
Для меня jvm - чёрный ящик.Это ж не очень хорошо, правда?
Это ж не очень хорошо, правда?я не хотел бы нарушать абстракцию и привязываться к реализации вместо стандарта.
Никто бы не хотел. Но реальность в том, что абстракции протекают, вне зависимости от того, хочется тебе или нет.
Тут кстати вроде недавно где-то пробегала ссылка, что какие бы то ни было эксепшены вообще злоРазумеется, когда есть

Я, правда, читал по телевизору, что джава не тот случай.

Никто бы не хотел. Но реальность в том, что абстракции протекают, вне зависимости от того, хочется тебе или нет.абстракции протекают только если ты хочешь странного. То есть если ты хочешь от явы получить производительность плюсов. Пиши тогда на плюсах сразу. А если пишешь на яве - смирись с её проблемами. И выбирай её только в том случае, если даже учитывая все трудности, ява останется лучшим выбором
ява останется лучшим выбором

А зачем тогда выбирать такую абстракцию, которую ты собираешься самолично сломать?
ява останется лучшим выбором
То есть, я правильно понимаю, что если ты вдруг столкнешься с проблемой пефоманса первого варианта из исходного поста, то ты выберешь переписать все написанное на плюсы?
А сам рантайм объект на null не проверяет, чтобы бросить NPE?
А сам рантайм объект на null не проверяет, чтобы бросить NPE?не должен.
обычно это делается через наложение запрета на доступ к нулевой странице памяти, и обращение к ней вызывает "прерывание" процессора, которое уже и преобразуется в исключение
То есть, я правильно понимаю, что если ты вдруг столкнешься с проблемой пефоманса первого варианта из исходного поста, то ты выберешь переписать все написанное на плюсы?нет. Я выбиру усиление аппаратных средств.
А идеально - изначально точно оценить производительность java решения и сравнить выигрыш от дешевизны поддержки явы и дешивизны оборудования, необходимого, чтобы крутить си++ программмы. Что в совокупности дешевле - то и выбираем. Если в процессе выяснилось, что не все факторы были учтены и прогноз не оправдался - оштрафовать менеджера или самого себя и перепрогнозировать. С учётом варианта перехода на си или расширения аппаратуры. Если проблема со сроками - возьму технический долг и воспользуюсь j2c.
Чувствую себя как в том комиксе про "в интернете кто-то не прав", но не удержусь от последнего ответа тебе в этой теме.
Купить комп помощнее это, конечно, отличная отмаза, по мощности примерно такая же, как переписать все на плюсы.
Изначально точная оценка производительности проектируемого по в зависимости от языка реализации - это, конечно, круто. Очень интересно послушать про возможные методы оценки. У меня вот подозрение, что единственный способ такой оценки - это написать на обоих языках и сравнить.
Проблема еще в том, что даже если такой магический способ и существовал бы, то он бы, очевидно, учитывал способности конкретного программиста писать оптимальный код на том или ином языке.
И ты получил бы в итоге очевидную картину - программист, не понимающий на чем он пишет, вынужден писать на ассемблере и тратить человекогоды, чтобы уложиться в требования производительности. Когда нормальный программист пойдет и напишет на той же джаве за полгода.
Купить комп помощнее это, конечно, отличная отмаза, по мощности примерно такая же, как переписать все на плюсы.
Изначально точная оценка производительности проектируемого по в зависимости от языка реализации - это, конечно, круто. Очень интересно послушать про возможные методы оценки. У меня вот подозрение, что единственный способ такой оценки - это написать на обоих языках и сравнить.
Проблема еще в том, что даже если такой магический способ и существовал бы, то он бы, очевидно, учитывал способности конкретного программиста писать оптимальный код на том или ином языке.
И ты получил бы в итоге очевидную картину - программист, не понимающий на чем он пишет, вынужден писать на ассемблере и тратить человекогоды, чтобы уложиться в требования производительности. Когда нормальный программист пойдет и напишет на той же джаве за полгода.
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.в целом, это не важно, если рассматривается сценарий, когда при работе одно нулевое значение приходится на тысячи ненулевых
обычно это делается через наложение запрета на доступ к нулевой странице памяти, и обращение к ней вызывает "прерывание" процессора, которое уже и преобразуется в исключениеэто где такой подход используют? JVM / CLR?
это где такой подход используют? JVM / CLR?вроде как, везде
У меня вот подозрение, что единственный способ такой оценки - это написать на обоих языках и сравнить.Есть же большая сравнительная кодовая база. Всякие соревнования, где чей язык быстрее. И там вполне стабильное соотношение производительности показывают плюсы и ява
А я вот что вам скажу товарищи! Нефиг ничего оптимизировать до запуска профилировщика.
З.Ы. 1ый вариант и не еби моск.
З.Ы. 1ый вариант и не еби моск.
Да это-то понятно, просто интересно как рантайм выбрасывает npe без проверки собственно объекта.
я с тобой согласан, что это неважно, если у нас сценарий со списками с типичной длиной 1000+ элементов, да, в таком случае жалкие тысячи тактов на исключение это будет капля в море, согласен
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.
в целом, это не важно, если рассматривается сценарий, когда при работе одно нулевое значение приходится на тысячи ненулевых

если у нас сценарий со списками с типичной длиной 1000+ элементовкорректнее "1000+ обращений на один список", чем "1000+ элементов".
честно говоря не знаю, что именно внутри ArrayList, но если это в итоге классический список с указателями, то скорее всего в списке на 1000+ обращений тоже будет все не очень хорошо, т.к. в таких случаях надо думать не о уменьшении кол-ва сравнений, а о лояльности к кэшу
ты уже куда-то в дебри
есть две конструкции:
vs
вторая конструкция будет быстрее, если данный участок кода вызывается много чаще при zzz не равном null-ю.
или другими словами, когда есть сотни-тысячи вызовов bla-bla на один экземпляр Zzz
есть две конструкции:
if (zzz == null)
zzz = new Zzz(...);
zzz.bla-bla;
vs
try
{
zzz.bla-bla;
}
catch (NullException exc)
{
if (zzz == null)
zzz = new Zzz(...);
zzz.bla-bla;
}
вторая конструкция будет быстрее, если данный участок кода вызывается много чаще при zzz не равном null-ю.
или другими словами, когда есть сотни-тысячи вызовов bla-bla на один экземпляр Zzz
вторая конструкция будет быстрее, если данный участок кода вызывается много чаще при zzz не равном null-ю.Блядь, 99.99% программистов реализуют алгоритм Дейкстры через динамический массив, а вы тут уже почти диссертацию написали на тему одного if?
в данном случае, тема скорее про то, как аккуратнее оценивать производительность кода
вообще, я изначально хотел только заметить, что попытки оптимизировать сравнение при додавлении элемента в список в подавляющем большинстве случае - это фуфло полное ни на что не влияющее, во всяком случае попытки оптимизироать через иключения могуть сделать только хуже
насчет именно сравнения скорости этих участков кода в ваакуме, то я не хочу ввзываться, но у меня большие сомения, что с иключениями будет быстрей(в хорошем случае, т.е. когда нет исключения т.к. тут надо учитывать дополнительный код, который компиялтор неявно вставляет чтобы обеспечить необходиму семантику в случае исключения (вызвать деструкторы, например, при том только тех объектов, который на момент исключения были созданы - и тут очень сомнительно если он сможет это сделать быстрее чем в одно сравнение)
насчет именно сравнения скорости этих участков кода в ваакуме, то я не хочу ввзываться, но у меня большие сомения, что с иключениями будет быстрей(в хорошем случае, т.е. когда нет исключения т.к. тут надо учитывать дополнительный код, который компиялтор неявно вставляет чтобы обеспечить необходиму семантику в случае исключения (вызвать деструкторы, например, при том только тех объектов, который на момент исключения были созданы - и тут очень сомнительно если он сможет это сделать быстрее чем в одно сравнение)
а 99.99% населения вобще не смогут реализовать алгоритм Дейкстры 

тут надо учитывать дополнительный код, который компиялтор неявно вставляет чтобы обеспечить необходиму семантику в случае исключенияafaik, добавляется один push в ветке, когда исключение не произошло; и много-много кода (включая неявный когда исключение произошло.
Для меня jvm - чёрный ящик. И учитывая, что реализации могут быть разными, я не стремлюсь его открыть и разбираться в содержимом. Вопрос о том, что лучше - условное выполнение или исключение относится скорее к реализации jvm и разнообразным оптимизациям. Поэтому всё-таки в данном случае сильно проще померить производительность бенчмарком.эта часть JVM описывается
Оставить комментарий
t1h0n0ff
try {
this.exclusions.add(exclusion);
} catch (NullPointerException ignored) {
this.exclusions = new ArrayList<ExclusionJson>
this.addExclusion(exclusion);
}
или
При добавлении элементов 1 раз отловить Эксепшн и остальные разы слушать или каждый раз проверять на null? Что дорогостоящей?