У меня вопрос: если я сравниваю целые числа, есть ли разница в производительности при вызове thenComparingInt(My::intMethod) и thenComparing(My::intMethod), другими словами, если я сравниваю разные типы, как ссылочные, так и примитивный, т.е. Строка, целое число и т. д. Часть меня просто хочет сказать сравнение (). затем сравнение (). затем сравнение () и т. д., но должен ли я делать сравнение. ?
Я предполагаю, что сравнение () и затем сравнение () используют метод compareTo для сравнения любого заданного типа за кулисами или, возможно, для целых чисел, Integer.compare? Я также предполагаю, что ответ на мой первоначальный вопрос может включать в себя производительность, заключающуюся в том, что thenComparingInt будет знать, что передается int, тогда как thenComparing должен автоматически упаковать int в Integer, а затем, возможно, привести к Object?
Кроме того, еще один вопрос, пока я думаю об этом - есть ли способ связывания ссылок на методы, например. Song::getArtist::length, где getArtist возвращает строку? Причина в том, что я хотел сделать что-то вроде этого:
songlist.sort(
Comparator.comparing((Song s) -> s.getArtist().length()));
songlist.sort(
Comparator.comparing(Song::getArtist,
Comparator.comparingInt(String::length)));
songlist.sort(
Comparator.comparing(Song::getArtist, String::length));
Из трех примеров два верхних компилируются, но нижний, кажется, выдает ошибку компиляции в Eclipse, я бы подумал, что второй аргумент String::length действителен? Но, может быть, нет, поскольку он ожидает, что компаратор не является функцией?
Integer.compareTo
, чтобы получить почти тот же результат, что и без автоупаковки. Таким образом, бенчмаркинг является обязательным, чтобы найти реальную разницу. 27.06.2014Arrays.sort(integerArray, comparing(Integer::intValue));
сArrays.sort(integerArray, comparingInt(Integer::intValue));
, и соотношение производительности было 3,5: 1 в пользу примитивной специализации при использовании целых чисел за пределами диапазона кэша целых чисел; в пределах диапазона кеша (0..127) производительность боксового варианта была лучше (2 к 1). Это указывает на то, что Escape Analysis не позволяет выделять стек, основываясь на моем предыдущем наблюдении, что целые числа EA работают лучше, чем при поиске из кеша. 28.06.2014Arrays.sort(integerArray, comparing(i->new Integer(i.intValue())));
--- и, о чудо, в этом случае соотношение было всего 1,5 к 1. Я упустил из виду, чтоInteger.valueOf
(другими словами, автоупакованный код) не может быть EA'd из-за пути кода, включающего поиск в кеше. Так что мой прогноз все-таки верен: при включенном советнике разница становится совсем небольшой. 28.06.2014Integer
--- который, кстати, можно интерпретировать как подсказку о том, как сделать важное улучшение производительности бокса. Следует пытаться использовать EA без учета техники автоупаковки и использовать конструктор вместо фабрики, если EA преуспеет. 28.06.2014