Два варианта добавления в List
А что, менее странных способов задержанной инициализации в джаве до сих пор не придумали?
Например?
Третий вариант: сразу создать список и объявить поле final.
Суть такая формируется json, если поле проинициализировано, то будет так [] отправлено на клиента, что не очень хорошо.
Вопрос в другом, как продуктивней?
Сделай так.
более быстрый первый вариант (с исключением но писать лучше так, как во втором варианте (с явной проверкой на null)
при добавлении
this.not_empty = true;
при отправке
if (this.not_empty) {
// отправить this.exclusions
} else {
// отправить null
}
if (this.exclusions == null)где скобочки блиать?!
this.exclusions = new ArrayList<ExclusionJson>
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, знаете ли, не только так, как задумал автор, можно словить.
Второй вариант может быть будет медленее первого, ибо типа лишний компэр, но извините вы этого на современных платформах ну вот совсем не заметите...
Тут кстати вроде недавно где-то пробегала ссылка, что какие бы то ни было эксепшены вообще зло, и там довольно разумные аргументы приводились... Так что...
Это так, к тому, что иногда быстрее все-таки сурсы побраузить.
Это так, к тому, что иногда быстрее все-таки сурсы побраузить.Для меня jvm - чёрный ящик. И учитывая, что реализации могут быть разными, я не стремлюсь его открыть и разбираться в содержимом. Вопрос о том, что лучше - условное выполнение или исключение относится скорее к реализации jvm и разнообразным оптимизациям. Поэтому всё-таки в данном случае сильно проще померить производительность бенчмарком.
Для меня jvm - чёрный ящик.Это ж не очень хорошо, правда?
Это ж не очень хорошо, правда?я не хотел бы нарушать абстракцию и привязываться к реализации вместо стандарта.
Никто бы не хотел. Но реальность в том, что абстракции протекают, вне зависимости от того, хочется тебе или нет.
Тут кстати вроде недавно где-то пробегала ссылка, что какие бы то ни было эксепшены вообще злоРазумеется, когда есть
Я, правда, читал по телевизору, что джава не тот случай.
Никто бы не хотел. Но реальность в том, что абстракции протекают, вне зависимости от того, хочется тебе или нет.абстракции протекают только если ты хочешь странного. То есть если ты хочешь от явы получить производительность плюсов. Пиши тогда на плюсах сразу. А если пишешь на яве - смирись с её проблемами. И выбирай её только в том случае, если даже учитывая все трудности, ява останется лучшим выбором
ява останется лучшим выбором
А зачем тогда выбирать такую абстракцию, которую ты собираешься самолично сломать?
ява останется лучшим выбором
То есть, я правильно понимаю, что если ты вдруг столкнешься с проблемой пефоманса первого варианта из исходного поста, то ты выберешь переписать все написанное на плюсы?
А сам рантайм объект на null не проверяет, чтобы бросить NPE?
А сам рантайм объект на null не проверяет, чтобы бросить NPE?не должен.
обычно это делается через наложение запрета на доступ к нулевой странице памяти, и обращение к ней вызывает "прерывание" процессора, которое уже и преобразуется в исключение
То есть, я правильно понимаю, что если ты вдруг столкнешься с проблемой пефоманса первого варианта из исходного поста, то ты выберешь переписать все написанное на плюсы?нет. Я выбиру усиление аппаратных средств.
А идеально - изначально точно оценить производительность java решения и сравнить выигрыш от дешевизны поддержки явы и дешивизны оборудования, необходимого, чтобы крутить си++ программмы. Что в совокупности дешевле - то и выбираем. Если в процессе выяснилось, что не все факторы были учтены и прогноз не оправдался - оштрафовать менеджера или самого себя и перепрогнозировать. С учётом варианта перехода на си или расширения аппаратуры. Если проблема со сроками - возьму технический долг и воспользуюсь j2c.
Купить комп помощнее это, конечно, отличная отмаза, по мощности примерно такая же, как переписать все на плюсы.
Изначально точная оценка производительности проектируемого по в зависимости от языка реализации - это, конечно, круто. Очень интересно послушать про возможные методы оценки. У меня вот подозрение, что единственный способ такой оценки - это написать на обоих языках и сравнить.
Проблема еще в том, что даже если такой магический способ и существовал бы, то он бы, очевидно, учитывал способности конкретного программиста писать оптимальный код на том или ином языке.
И ты получил бы в итоге очевидную картину - программист, не понимающий на чем он пишет, вынужден писать на ассемблере и тратить человекогоды, чтобы уложиться в требования производительности. Когда нормальный программист пойдет и напишет на той же джаве за полгода.
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.в целом, это не важно, если рассматривается сценарий, когда при работе одно нулевое значение приходится на тысячи ненулевых
обычно это делается через наложение запрета на доступ к нулевой странице памяти, и обращение к ней вызывает "прерывание" процессора, которое уже и преобразуется в исключениеэто где такой подход используют? JVM / CLR?
это где такой подход используют? JVM / CLR?вроде как, везде
У меня вот подозрение, что единственный способ такой оценки - это написать на обоих языках и сравнить.Есть же большая сравнительная кодовая база. Всякие соревнования, где чей язык быстрее. И там вполне стабильное соотношение производительности показывают плюсы и ява
З.Ы. 1ый вариант и не еби моск.
Да это-то понятно, просто интересно как рантайм выбрасывает npe без проверки собственно объекта.
я с тобой согласан, что это неважно, если у нас сценарий со списками с типичной длиной 1000+ элементов, да, в таком случае жалкие тысячи тактов на исключение это будет капля в море, согласен
В принципе не так уж и важно, там же еще нужно сконстрактить сам объект кидаемого исключения, в котором куча строк стектрейса, что даст 99% оверхеда.
в целом, это не важно, если рассматривается сценарий, когда при работе одно нулевое значение приходится на тысячи ненулевых
если у нас сценарий со списками с типичной длиной 1000+ элементовкорректнее "1000+ обращений на один список", чем "1000+ элементов".
честно говоря не знаю, что именно внутри ArrayList, но если это в итоге классический список с указателями, то скорее всего в списке на 1000+ обращений тоже будет все не очень хорошо, т.к. в таких случаях надо думать не о уменьшении кол-ва сравнений, а о лояльности к кэшу
есть две конструкции:
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
или
При добавлении элементов 1 раз отловить Эксепшн и остальные разы слушать или каждый раз проверять на null? Что дорогостоящей?