Где блекджек, где мои шлюхи? Ничерта не работает! Войти !bnw Сегодня Клубы
УНЯНЯ. У нас есть немножечко инфы об этом пользователе. Мы знаем, что он понаписал, порекомендовал и даже и то и другое сразу. А ещё у нас есть RSS.
Теги: Клубы:

осознал что у Map функция get(...) принимает Object. Это значит, что поиске объекта вовсе не обязательно конструировать ключ, достаточно создать объект любого типа с правильными hashCode() и equals(Object). Практическое применение — лукапы в Map<String, ?>, при которых можно избежать конструирования String'а из char[]

#SZBBB9 (6) / @hirthwork / 3640 дней назад

а ещё у меня дикая ломка от того что IBM всё никак не выпустит свой билд jvm для восьмой джавы, так уже хочется в лямбдочки попердолиться, да default-функции заюзать

#QPV3JL (1) / @hirthwork / 3640 дней назад

Если известно, что obj != null, то лучше писать sb.append(obj.toString()), чем sb.append(obj), чтобы избежать лишнего вызова String.valueOf(obj)

#RD3XZM (83+2) / @hirthwork / 3644 дня назад

error: a generic class may not extend java.lang.Throwable

#MNG666 (0) / @hirthwork / 3647 дней назад

http://ideone.com/xTl9Uw

#WSQ3T8 (0) / @hirthwork / 3650 дней назад

Нужно быть очень аккуратными при закрытии сокета, дорогой читатель. https://img-fotki.yandex.ru/get/2914/5598601.2/0_dd789_37c4253d_orig.png

#HYPAL0 (4+2) / @hirthwork / 3669 дней назад
Оказывается, в Unsafe в Java8 появилась возможность явно поставить load/store/full memory fence
#7SCF7W (1) / @hirthwork / 3683 дня назад
Продолжаем серию охуительных историй про производительность простейших операций Итак, есть бенчмарк, который просто обходит большой массив и суммирует элементы http://ideone.com/UtpVej Запускаем под последней оракловой jvm: $ /opt/oracle-jdk-bin-1.8.0.20/bin/java Iter 100000000 0 -10621346557024: 43 $ /opt/oracle-jdk-bin-1.8.0.20/bin/java Iter 100000000 1 -10621346557024: 42 $ /opt/oracle-jdk-bin-1.8.0.20/bin/java Iter 100000000 2 -10621346557024: 48 Казалось бы логично — обход массиве в обратном направлении не cache-friendy Запускаем под айбиэмовской машиной: $ /opt/ibm/java-x86_64-71/bin/java Iter 100000000 0 -10621346557024: 107 $ /opt/ibm/java-x86_64-71/bin/java Iter 100000000 1 -10621346557024: 98 $ /opt/ibm/java-x86_64-71/bin/java Iter 100000000 2 -10621346557024: 90 Если отбросить тот факт, что работает медленно, можно отметить, что реализация обратного обхода и должна была работать быстрее, потому что в байткоде видно, что размер массива загружается всего один раз, а в реализации с прямым циклом по массиву его приходится получать каждый раз. В общем, я продолжаю охуевать от айбиэмовских jvm и продолжаю их использовать в силу более быстрого gc
#VK33HN (8) / @hirthwork / 3692 дня назад
#7BPTIP (0) / @hirthwork / 3697 дней назад
хвала утилите checkstyle и позор криворуким долбоёбам (мне). написал в коде: ```java if (cancelled) { throw new CancellationException(); } if (exception == null) { return result; } ``` Видите ошибку? А я вот в двенадцатом часу ночи не увидел: `EnterpriseShit.java:60: if at indentation level 10 not at correct indentation, 8`
#S7GBT7 (2) / @hirthwork / 3698 дней назад
специально для @lord: http://ideone.com/qG6C2N tl;dr: стандартная работа со временем в go такая же медленная как в джаве, а joda-time — рулит
#VCCSPV (11+1) / @hirthwork / 3698 дней назад
Понадобилось мне из секунд с начала эпохи™ получать год и месяц. Итерация №0: Берём java.util.Calendar, делаем .setTimeMillis(...), делаем .get(Calendar.YEAR) и .get(Calendar.MONTH) (не забываем месяц на единицу увеличивать) Исследование №1: Запускаем под JProfiler, видим, что 16.3% времени занимает извлечение даты. Печалимся. Итерация №1: Видим, что в папке lib/ проекта уже лежит joda-time-2.0.jar. Делаем date = new DateTime(millis) и .get(DateTimeFieldType.year()) и .get(DateTimeFieldType.month()). Исследование №2: Запускаем под JProfiler, видим, что извлечение даты занимает уже 12.7%. «И увидел Бог, что это хорошо». Исследование №3: Хочется понять насколько реально быстрее работает joda-time: 1. Качаем joda-time-2.4 2. Пишем небольшой бенчмарк. 3. Запускаем 10kk итераций. Видим, что Calendar выполняет их за 789 мс, а joda-time — за 1126 мс. 4. Охуеваем 5. Чешем репу 6. Копируем из папки проекта joda-time-2.0.jar и запускаем с ним. Результат — 458 мс. Исследование №4: 1. Качаем бету Java 8 от IBM 2. Дописываем бенчмарк, который делает LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), id).getYear() 3. Запускаем — 960 мс. Т.е. уже лучше Calendar, но всё ещё хуже joda-time-2.0. Выводы: Новое — не значит лучшее. Хочешь реально быстрого извлечения времени — создавай один объект MutableDateTime из joda-time и будет тебе счастье. Для истории, код бенчмарка: ```java import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoField; import java.util.Calendar; import org.joda.time.DateTimeFieldType; import org.joda.time.DateTime; import org.joda.time.MutableDateTime; interface MillisToYear { int year(long millis); } class CalendarMillisToYear implements MillisToYear { private final Calendar cal = Calendar.getInstance(); @Override public int year(final long millis) { cal.setTimeInMillis(millis); return cal.get(Calendar.YEAR); } } class JodaMillisToYear implements MillisToYear { private final DateTimeFieldType year = DateTimeFieldType.year(); @Override public int year(final long millis) { return new DateTime(millis).get(year); } } class MutableJodaMillisToYear implements MillisToYear { private final DateTimeFieldType year = DateTimeFieldType.year(); private final MutableDateTime date = new MutableDateTime(); @Override public int year(final long millis) { date.setMillis(millis); return date.get(year); } } class Java8MillisToYear implements MillisToYear { private final ZoneId id = ZoneId.of("Europe/Moscow"); @Override public int year(final long millis) { return LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), id) .getYear(); } } public class Main { public static void main(final String... args) { MillisToYear mty; switch (Integer.parseInt(args[0])) { case 0: mty = new CalendarMillisToYear(); break; case 1: mty = new JodaMillisToYear(); break; case 2: mty = new MutableJodaMillisToYear(); break; case 3: mty = new Java8MillisToYear(); break; default: throw new RuntimeException(); } long now = System.currentTimeMillis() / 86400000L * 86400000L; for (long i = 0; i < 1000000; ++i) { mty.year(now + i); } long start = System.currentTimeMillis(); long chksum = 0L; for (long i = 0L; i < 10000000000L; i += 1000L) { chksum += mty.year(now + i); } long total = (System.currentTimeMillis() - start); System.out.println("Total time: " + total); System.out.println("Checksum: " + chksum); } } ```
#N6DAAM (7) / @hirthwork / 3699 дней назад
хётворк тупил в монитор, нервно кусал губы и ждал её — восьмую jvm от IBM
#HOA86U (2) / @hirthwork / 3707 дней назад
Год назад меня доебал ant и я написал свою билд систему на базе мэйка. Сейчас меня уже доебала моя билд-система и я хочу написать новую билд-систему на джаве с бутстрапом на make. Я знаю что я хуй и противен себе. Такие дела
#EL3YH4 (9) / @hirthwork / 3720 дней назад

StringBuilder.toString() и String.<init>(StringBuilder) в IBM JRE делают разные вещи. Очень разные. Во втором случае копирования массива char'ов не происходит. Правда, узнать это можно только почитав код.

#XT16CT (2) / @hirthwork / 3773 дня назад

Collections.unmodifiableCollection(...) не проксирует вызовы hashCode() и equals(Object). Хочешь класть в хэшмап — заворачивай в .unmodifiableList или .unmodifiableSet

#9298R1 (0) / @hirthwork / 3846 дней назад

tfw просматриваешь байткод, чтобы найти lookupswitch в performance-critical функции и заменить его вручную на лукап в таблице. mfw функция начинает работать двое быстрее.

#UOK1XN (15) / @hirthwork / 3857 дней назад

tfw самописный json-парсер оказывается в три раза быстрее того что используется сейчас в продакшене

#959XWH (15) / @hirthwork / 3858 дней назад

ну охуеть теперь, живёшь себе, думаешь что джаву знаешь, а оказывается у строк оператор += есть.

#RKG511 (22) / @hirthwork / 3867 дней назад

tfw когда на коленке написанная оттормаживающая http-прокся хорошо держит нагрузку и даже не сегфолтится. алсо, практика показала, что https://github.com/square/tape довольно шустро позволяет сохранять данные в файловую очередь и вычитывать. рекомендую

#24JJ9T (2) / @hirthwork / 3868 дней назад
--
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.