Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Метаморфозы в String. Java 7

Anna | 1.06.2014 | нет комментариев
Всем здравствуй. Последние события в Украине как-то отбросили меня от програ, но вот, все, больше менее, наладилось и я, вернувшись к привычному темпу работы, припомнил о парочке своих постов в черновиках. В связи с выходом 8-й версии явы, пост, допустимо, теснее несколько устарел, но не исчезать же добру.
Выходит, как-то вечером, оптимизируя следующий ломтик кода — нечаянно заглянул в String и нашел, что класс строки теснее не тот. Так как строка, вероятно, один из самых распространенных типов, думаю многим будет увлекательно узнать об изменениях.

Оптимизирован способ String.split()

Способ split строки стал стремительней трудиться для односимвольного параметра. Сейчас в способе вообще не будет применяться регексп и будет применен indexOf в цикле.
Было:

public String[] split(String regex, int limit) {
        return Pattern.compile(regex).split(this, limit);
}

Стало:

public String[] split(String regex, int limit) {
    if (((regex.value.length == 1 && 
           ".$|()[{^?* \".indexOf(ch = regex.charAt(0)) == -1) || ...)) {
            ...
            while ((next = indexOf(ch, off)) != -1) {
                ...
            }
            ...
            return result;
    }
    return Pattern.compile(regex).split(this, limit);
}
2 поля удалены

Начиная с 6-го апдейта 7-й явы из класса строки были удалены 2 поля:

private int offset;
private int count;

Как вы, вероятно, помните эти поля применялись при вызове способа substring. Предназначение полей — уменьшение трудности способа и попытка избежать создания нового массива символов строки применяя ссылку на теснее присутствующий массив. Что, в свою очередь, в некоторых обстановках могло порождатьзнаменитую утрату памяти. Сейчас же размер строки на 8 байт поменьше и задача утраты навечно решена.

Новейший хеш-алгорифм
private transient int hash32 = 0;

int hash32() {
    int h = hash32;
    if (0 == h) {
        // harmless data race on hash32 here.
        h = sun.misc.Hashing.murmur3_32(HASHING_SEED, value, 0, value.length);

        // ensure result is not zero to avoid recalcing
        h = (0 != h) ? h : 1;

        hash32 = h;
    }
    return h;
}

Взамен 2-х удаленных полей, возникло 1 новое целочисельное — hash32. Предуготовленное для хранение нового хеша строки. Новейший хеш применяется, скажем, в hashmap:

transient int  hashSeed = useAltHashing ? sun.misc.Hashing.randomHashSeed(this) : 0;
final int hash(Object k) {
    int h = hashSeed;
    if (0 != h && k instanceof String) {
        return sun.misc.Hashing.stringHash32((String) k);
    }
    ...
}

Новейший алгорифм хеширования должен усовершенствовать разделение хешей для строк (я не сумел обнаружить, чем он реально отличнее присутствующего, может кто-то в комментариях подскажет). Новая хеш-функция по умолчанию отключена и Дабы ее включить вам потребуется опция «jdk.map.althashing.threshold». Правда, скоро позже релиза 6-го апдейта оказалось, что в высококонкурентной многопоточной среде из-за способа sun.misc.Hashing.randomHashSeed() создание множества hashmapпроисходит значительно медленней чем до апдейта, так как способ randomHashSeed использует внутри Random, тот, что в свою очередь основывается на AtomicLong, тот, что и вызвал задачи с продуктивностью.
Начиная с апдейта 40 баг теснее поправлен.

Update по Java 8

Как мне подсказали, в 8-й яве новейший алгорифм хеширования был удален.

Еще оптимизация по split

Так уж сложилось, что множество разработчиков редко заглядывают во внутренние способы стандартных классов. Тем не менее внутри дозволено обнаружить много простора для оптимизации. Так же и получилось с способом split строки. Для скептических участков кода, взамен:

someString.split("[_,;,-]");

дозволено сделать:

private static final Pattern PATTERN = Pattern.compile("[_,;,-]");

PATTERN.split(someString);

И получить приход продуктивности способа split на порядок, исключительно для крупных и трудных регулярных выражений.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB