Периодически сталкиваюсь с WTF-моментами, которые оказываются результатом того, что JVM Hotspot распознаёт некоторые паттерны кода и имеет специальные оптимизации для этих паттернов. Два примера:
StringBuilder sb = new StringBuilder();
sb.append("abc").append("def"); // эта строка быстрей
sb.append("abc"); sb.append("def"); // эта строка медленней
List<MyClass> list = ...;
MyClass[] arr;
arr = list.toArray(new MyClass[0]); // эта строка быстрей
arr = list.toArray(new MyClass[list.length()]); // эта строка медленней
Второй пример и вовсе контр-интуитивный. Если посмотреть в реализацию метода toArray, то там при недостаточном размере с помощью reflection создаётся новый массив нужного размера, поэтому ожидается, что вторая строка будет работать быстрей, т.к. там никаких реаллокаций и массив создаётся заранее с помощью правильных инструкций, а не reflection-а. Однако
нет. Может кто-то где-то видел каталогизированный сборник таких примеров? Я, конечно, понимаю, что можно потратить пару лет жизни на просмотр всех докладов и блог-постов Шипилёва
Здравствуйте, vsb, Вы писали:
vsb>Может кто-то где-то видел каталогизированный сборник таких примеров? Я, конечно, понимаю, что можно потратить пару лет жизни на просмотр всех докладов и блог-постов Шипилёва
Если такая книга где-то и существовала бы, то ее нужно было бы первым делом сжечь.
Просто пиши понятный код, если упираешься в проблемы производительности, то простой код ускорить намного проще.
Оба приведенных примера могут работать быстрее на некоторых данных, или могут работать медленне на других jvm/платформе/опциях/etc/etc/etc.