Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
forEach только от памяти зависит. Интересно так же, что по всем графикам видно, что hftc самая оптимальная для использования коллекция. Совпадение ли, но Вы и есть автор этих коллекций:) быстрее других они стали только пару недель назад
@Override
public int get(int key) {
int free;
if (key != (free = freeValue)) {
long[] tab = table;
int capacityMask, index;
int cur;
long entry;
if ((cur = (int) (entry = tab[index = ParallelKVIntKeyMixing.mix(key) & (capacityMask = tab.length - 1)])) == key) {
// key is present
return (int) (entry >>> 32);
} else {
if (cur == free) {
// key is absent
return defaultValue();
} else {
while (true) {
index = (index - 1) & capacityMask;
if ((cur = (int) (entry = tab[index])) == key) {
// key is present
return (int) (entry >>> 32);
} else if (cur == free) {
// key is absent
return defaultValue();
}
}
}
}
} else {
// key is absent
return defaultValue();
}
}
ParallelKVIntKeyMixing это статический внутренний класс, который в данном случае выглядит так:/** = round(2 ^ 32 * (sqrt(5) - 1)), Java form of unsigned 2654435769 */
static final int INT_PHI_MAGIC = -1640531527;
...
static class ParallelKVIntKeyMixing {
static int mix(int key) {
int h = key * INT_PHI_MAGIC;
return h ^ (h >> 16);
}
}
@Override
public int get(int key) {
int free;
if (key != (free = freeValue)) {
long[] tab = table;
int capacity, index;
int cur;
long entry;
if ((cur = (int) (entry = tab[index = ParallelKVIntKeyMixing.mix(key) % (capacity = tab.length)])) == key) {
// key is present
return (int) (entry >>> 32);
} else {
if (cur == free) {
// key is absent
return defaultValue();
} else {
int bIndex = index, fIndex = index, step = 1;
while (true) {
if ((bIndex -= step) < 0) bIndex += capacity;
if ((cur = (int) (entry = tab[bIndex])) == key) {
// key is present
return (int) (entry >>> 32);
} else if (cur == free) {
// key is absent
return defaultValue();
}
int t;
if ((t = (fIndex += step) - capacity) >= 0) fIndex = t;
if ((cur = (int) (entry = tab[fIndex])) == key) {
// key is present
return (int) (entry >>> 32);
} else if (cur == free) {
// key is absent
return defaultValue();
}
step += 2;
}
}
}
} else {
// key is absent
return defaultValue();
}
}
ParallelKVIntKeyMixing тут такой:static class ParallelKVIntKeyMixing {
static int mix(int key) {
return (key * INT_PHI_MAGIC) & Integer.MAX_VALUE;
}
}
может легко получиться разница в 2 раза по памяти
логично делить испытания не по количествам элементов, а по соотношению org.openjdk.jol.info.GraphLayout.parseInstance(map).totalSize() и размеров L2 и L3.
что улучшилось в hftc пару недель назад
Время против памяти на примере хеш-таблиц на Java