jvmchat | Unsorted

Telegram-канал jvmchat - pro.jvm

5916

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез

Subscribe to a channel

pro.jvm

Вы переоцениваете мои знания. Замеров или какого-то понимания нет, но плюс всех бенчмарков в том, что в большинстве их можно воссоздать руками и запустить за пятнадцать минут, просто дропнув сорцы в новый класс, починив реплейсом смену имени или пакета, и написав два метода в бенче. Что до процентов, то там надо смотреть, это непосредственно рандом занимал, или что-то ещё. Может там вообще все расходы на обслуживание сисколла.

Читать полностью…

pro.jvm

скажи, если я чего-то не понимаю по мат. части, тут изи могу обосраться) просто пока не вижу

Читать полностью…

pro.jvm

А при чём тут настройка Java Security и генерация UUID? Насколько я помню, то UUID генерируется с помощью ThreadLocalRandom, который не имеет никакого отношения к SecureRandom из Java Security.

Читать полностью…

pro.jvm

https://github.com/openjdk/jmh/blob/master/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_36_BranchPrediction.java

я сейчас смотрю на собственный бенч из 2020, где простой int a > b ? a : b умножился на три при подаче на вход несортированных значений, но там кажется стоит всю статью перепроверить и переписать

Читать полностью…

pro.jvm

Тут больше нужно сравнение реализации алгоритма и его теоретической модели. Можно всегда написать асимптотику без точной константы, но тогда придётся страдать, чтобы понять, какая реальная асимптотика реализации, что не так просто, если на, например, малых значениях происходит одна история, а на больших — другая. Но если я могу дать конкретную оценку, то можно просто проверять, правда ли, что один график всегда ниже другого. DCE тут, кончено, — страшный враг, да. А абсолютных оценок пока не хочется. То есть два (или три) порядка точности, думаю, переживу.

Можно подготовить набор семплов

Можете уточнить, про какие семплы речь? Что-то не очень понял эту часть.

Читать полностью…

pro.jvm

https://habr.com/ru/companies/kingston_technology/articles/408843/

Вот например, пишут про 19 стадий в конвейере ryzen

Читать полностью…

pro.jvm

Интересно, насколько большая эта "куча тактов". Константу где-нибудь порядка 10 я готов попытаться учесть. Иначе придётся менять стратегию сверки теории и практики.

Читать полностью…

pro.jvm

Меня всегда радовало быть одноврменно и админом, разбирающимся в том, что там нового выпустили, и анонимом, которые какие-то примусы паяет, и ещё устраивать перепалки между этими двумя личностями

Читать полностью…

pro.jvm

Потому что:
1. Не готов к такому языку ни морально, ни профессионально.
2. Kotlin сильно проще, и его можно применить сразу на JVM и (при необходимости, которая не часто, но и не редко возникает) на других платформах как JS/WASM. (На последнем производительность мерить пока желания никакого нет, но есть возможность быстро портировать код.)
3. Насколько знаю, разница между JVM и C++ константная (сборщик мусора почти не влияет на время работы, а в остальном нет асимптотической просадки типа "на С++ алгоритм работает за O(n^2), а на JVM — за O(e^n)"). Мне совершенно не страшны большие константы. Мне страшны большие асимптотики, потому что с экспоненциальными асимптотиками и хуже я встречаюсь всё время.

Читать полностью…

pro.jvm

В реальности всё сложно.
Если ты делаешь просто сравнение типа boolean a = b > c,
то оно занимает один такт (вот эти самые 0.2-0.3 нс)

Если по этому значению есть ветвление и там будут промахи предсказаний куда пойдёт выполнение, то можно потерять кучу тактов.

И ещё процессор умеет выполнять независимые операции за один такт, например сразу две:
A0 = b0 > с0
А1 = б1 > с1

Читать полностью…

pro.jvm

1. Необходимо отключить кортану хром всё, что может требовать себе ресурсы и отнимать внимание шедулера операционки. Можно посмотреть вот сюда, например:

Benchmarks.empty 1 avgt 3 0,550 ± 1,451 ns/op

Ошибка больше самого показателя, это сразу сигнал, что результату верить нельзя, он либо снят с большим шумом, либо недостаточное количество раз, в один из которых случилась аномалия. Когда мы говорим про микробенчмаркинг, то там и 10% флуктуации говорят о том, что бенчмарк не настроен.
По-хорошему должна быть чистая лабораторная машина вообще без DE и каких-либо лишних сервисов. С виртуалкой на хостинге тоже могут быть истории в виде шумных соседей, CPU steal и прочих эффектов. Для домашних игр, конечно, это всё редко прямо необходимо.

2. Кроме операционки, много влияния оказывает само железо. Во-первых у нас есть турбобуст и температурный потолок (если конфигурация позволяет его достичь), которые могут влиять на результаты бенчмарков во время их выполнения, во-вторых в последние лет пять у нас появилась замечательная вещь - Е-ядра, на которые операционка свободно может перебрасывать тред, что надо купировать (если такие ядра есть на цпу). Дальше уже идут истории уровня кэшей и памяти, но они более специфичны и не дестабилизируют неизменяющуюся нагрузку.

3. Конкретно здесь такая история, что JIT имеет право схлопнуть результаты в константу и не вычислять вообще ничего. Если мы сравниваем два неизменяющихся числа, то можно их просто однократно подсчитать, поэтому здесь проблема заложена уже в самом бенчмарке. Но скорее всего этого не происходит, т.к. происходит доступ к потенциально изменяемому полю; чтобы узнать точно - надо смотреть сгенерированный код.

4. Что до времени выполнения, то оно странное. По идее это должно вырождаться буквально в пару примитивных инструкций, которые скорее всего отлично засуперскаляризуются и не будут иметь большого throughput, другими словами, это должно занимать пару циклов. Дальше в ход идет математика - на условных 4ггц один цикл занимает 0.25нс, то есть операция занимает плюс-минус шестнадцать циклов (чуть ниже будет про то, как эти циклы не подсчитать, а замерить). Даже с учетом внешней итерации это как-то чересчур.
Математика может быть очень конкретной на уровне одной инструкции, но из-за таких вещей как разбиение на микрооперации, фиксированное количество портов для них, время на декодирование и различное кэширование для его избежания, stalls различного вида и много прочего не имеет смысла заходить дальше базовой napkin math и стоит начинать измерять.

5. Эти примтивные инструкции можно получить в ассемблерном представлении с помощью hsdis, и тогда можно прямо потрогать реально выполняющийся код. В таких случаях всё довольно просто, и ассемблер особо знать не нужно, я же ведь не знаю, например, можно легко пройтись по каждой инструкции и понять, что она делает, держа спраовчник под рукой.

6. Для этого есть ещё более клевый инструмент, perfasm profiler прямо в JMH. Он возьмет линуксовый perf и в связке с ним разметит самые горячие куски ассембли, где уже будет фокус на конкретно тех участках, которые занимают процессорное время. Он также будет выдавать проценты напротив каждой инструкции, но вот этому совсем не стоит верить из-за т.н. skid issue - это результат, рождённый из настоящего сигнала, но не отображающий его достоверно.

7. И кроме него есть ещё perfnorm profiler, который использует тот же perf для сбора performance counters, что может показать более интересные аспекты типа попадания/промаха мимо кэшей (об этом речи в данном бенчмарке не идёт) или количество инструкций на цикл. Конкретно этот профайлер является интерфейсом к perf - эти числа можно легко получить из командной строки для любого приложения, без участия JMH, если есть желание поиграться или необходимость.

Читать полностью…

pro.jvm

Есть несколько алгоритмов в вычислительной геометрии (конкретно, вычисление выпуклой оболочки; некоторые уже реализованы). На них есть красивые и короткие формулы асимптотик вида O(nh). Мне были нужны эти алгоритмы для математических экспериментов. Но потом задался вопросом, верны ли эти асимптотики. Оказалось, что если учитывать другие банальные параметры (например, размерность пространства), то формула становится совсем не такой короткой и красивой. Захотелось сделать две вещи: перевычислить асимптотику с самого начала, но теперь честно, и (коли таковая имеется) проверить, правда ли она выполняется (чтобы не было "ай, я забыл очередной параметр"). Для этого нужно осознать, какие базовые операции и сколько они стоят.

Читать полностью…

pro.jvm

Привет! Извините, пришёл из чата по Kotlin, поэтому не готов настроить окружение под Java, но вопрос про бенчмарки на JVM и JMH.

Хочется замерить, сколько выполняются базовые операции как, например, сравнение двух Int-ов. Чтобы понимать порядок затрачиваемого времени и сделать осмысленные теоретические расчёты для алгоритмов и сравнить с реальными данными. (Понятно, что 100 нс — это много, а 0,001 нс — мало. Но сколько тогда на деле?) Есть ли смысл пытаться сделать это с помощью JMH?

Пока напарываюсь на проблему, что, например, blackhole.consume(57) работает примерно 3,6—3,7 нс и blackhole.consume(a > b) работает в среднем на примерно 0,2 нс больше (но это значение нельзя брать как время выполнения сравнения, так как разброс у обоих бенчмарков заметно больше). Код бенчмарка:

@OutputTimeUnit(BenchmarkTimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
class Benchmarks {
@Param("1", "10", "100", "1000")
@JvmField
final var integer: Int = 0
@JvmField
final val otherInteger = 179

@Benchmark
fun empty() {}

@Benchmark
fun benchmark1(blackhole: Blackhole) {
blackhole.consume(integer)
}

@Benchmark
fun benchmark2(blackhole: Blackhole) {
blackhole.consume(integer > otherInteger)
}
}

Его результат:
Benchmark              (integer)  Mode  Cnt  Score   Error  Units
Benchmarks.benchmark1 1 avgt 3 3,634 ± 0,296 ns/op
Benchmarks.benchmark1 10 avgt 3 3,717 ± 1,200 ns/op
Benchmarks.benchmark1 100 avgt 3 3,659 ± 0,396 ns/op
Benchmarks.benchmark1 1000 avgt 3 3,668 ± 0,433 ns/op
Benchmarks.benchmark2 1 avgt 3 3,891 ± 0,388 ns/op
Benchmarks.benchmark2 10 avgt 3 3,942 ± 0,323 ns/op
Benchmarks.benchmark2 100 avgt 3 3,940 ± 0,750 ns/op
Benchmarks.benchmark2 1000 avgt 3 3,934 ± 0,576 ns/op
Benchmarks.empty 1 avgt 3 0,550 ± 1,451 ns/op
Benchmarks.empty 10 avgt 3 0,492 ± 0,083 ns/op
Benchmarks.empty 100 avgt 3 0,503 ± 0,089 ns/op
Benchmarks.empty 1000 avgt 3 0,503 ± 0,134 ns/op

Читать полностью…

pro.jvm

Пруфы прилагаются:
https://en.m.wikipedia.org/wiki/Ultrawide_formats

Читать полностью…

pro.jvm

Это всего 21х9. Не 32х9 же :)

Читать полностью…

pro.jvm

Хм, значит я ошибаюсь, всегда казалось там используется именно ThreadLocalRandom

Читать полностью…

pro.jvm

https://github.com/openjdk/jdk/blob/jdk-25%2B20/src/java.base/share/classes/java/util/UUID.java#L149

    public static UUID randomUUID() {
SecureRandom ng = Holder.numberGenerator;
}

?

Читать полностью…

pro.jvm

@microkite а случайно нет замеров на актуальных версиях Java /dev/random vs /dev/urandom ?
Да и в принципе есть ли смысл с этим морочиться.

Postgresql использует /dev/urandom, насколько я понимаю (https://security.stackexchange.com/questions/93902/is-postgress-uuid-generate-v4-securely-random)

а вот в конфиге JAVA_HOME/conf/security/java.security - /dev/random

вообще, вопрос ещё насколько актуальна информация в сети про эти 2 метода, читаю это

https://www.thomas-huehn.com/myths-about-urandom/

где написано в том числе, что /dev/random несколько раз переписывался. может сейчас вообще между ними нет разницы ?

изначально вопрос возник в процессе аналитики flamegraph от профиля async profile, где UUID.randomUUID() занимал достаточно значительную долю (около 4.5%)

в
proc/sys/kernel/random/entropy_avail - 256

Читать полностью…

pro.jvm

private static final Random GENERATOR = new Random(0);
private static final int[][] INPUTS = Stream.generate(() -> new int[] { GENERATOR.nextInt(), GENERATOR.nextInt() }).limit(1 << 16).toArray(int[][]::new);


Потом их можно запихивать по одному в исследуемую операцию, чтобы не было даже предположений о том, что там какие-то паттерны в данных есть
(ещё лучше сделать там один плоский массив и обращаться по i, i + 1)

Читать полностью…

pro.jvm

Там скорее всего выполняется запрошенное сравнение - насколько понимаю, джит там видит обращение к мутабельному полю, это больше ворчание. Настоящий ответ даст hsdis, разбирать мелкие примеры как правило довольно просто, на каждый десяток-другой инструкций будет комментарий о том, чему он реально соответствует. Для операций с одним возвращаемым значением можно вообще не использовать blackhole и возвращать это значение из метода, но на результаты это влиять не должно.

Попробую создать более нормальные условия и позапускать его подольше.

Тут вопрос в точности ответов, которые нужны. Я любитель придираться к частоте, но если у вас там 1мс против 20мкс, то неважно сколько шума и какая машина. Если же нужны конкретные ответы на вопросы где, почему, сколько, куда ушла наносекунда - то да, нужны лабораторные условия.

Поэтому и было интересно, как всё-таки правильно.

Можно подготовить набор семплов и итерироваться по ним, держа в голове потери на сам процесс (там буквально пара инструкций, которые усилиями процессора скорее всего ещё и сожмутся в один uops)

Повторяясь, если нужны просто сравнения двух алгоритмов, то нужно по большому счету только удостовериться, что в бенчмарк попадает вся необходимая операция и не более того, что нет DCE, нет какого-то неравенства между двумя алгоритмами (e.g. они возвращают результаты разной степени подготовленности)

Читать полностью…

pro.jvm

Да, порядка 10-30 если предсказание процессора подумало что ветвление пойдёт не туда.
Если предсказание было правильным, то всё быстро

Читать полностью…

pro.jvm

Спасибо за ключевые идеи! Сходу не всё понятно, но теперь понятно, куда двигаться.

Да, бенчмарк проведён быстро на коленке, чтобы хотя бы понимать, что получается, а что нет. Попробую создать более нормальные условия и позапускать его подольше.

Про JIT оптимизации знаю, поэтому был вопрос, как правильно померить такие вещи. В тупую написать blackhole.consume(integer < otherInteger), как видно, — неправильная стратегия. Поэтому и было интересно, как всё-таки правильно. Попробую утилиты, которые Вы посоветовали.

Ещё раз спасибо!

Читать полностью…

pro.jvm

порви шаблон

ответь первому

Читать полностью…

pro.jvm

Да просто делать нечего, отвечаю своему же второму аккаунту

Читать полностью…

pro.jvm

Ахуеть у тебя там чё возле монитора всегда блокнотик лежит с ответами на подобные незадаваемые никогда вопросы?

Читать полностью…

pro.jvm

Почему не на плюсах?

Читать полностью…

pro.jvm

Расскажи для начала какую цель приследуешь прикладную

Читать полностью…

pro.jvm

глянул в гугле, да, 32х9 называют суперультра... Тогда бери его, его стетхем не поносит)

Читать полностью…

pro.jvm

Я к тому что 21:9 это ведь тоже ультравайд 🤔

Читать полностью…

pro.jvm

тип на своем языке говорит, а этот за какие-то принципы квакает, iq -4

Читать полностью…
Subscribe to a channel