Самому стало интересно, написал несколько небольших бенчмарков.
Процессор i7 3630qm - 4 физических ядра, 8 логических. Компил и запуск через Intellij Idea 15, Java 8, win 10 x64.
Скорость
Описание: за 1 тест получаем 1 000 000 случайных чисел и считаем миллисы, затраченные на генерацию. В случае однопоточного теста всегда ждем окончание предыдущего потока теста с помощью join(), после чего стартуем новый. В случае мультипоточного все тесты запускаются в отдельном потоке одновременно.
Для каждого участника будет выполнено 100 однопточных и многопоточных тестов, после чего рассчитано их среднее время выполнения, которое будет принято за результат (меньше - лучше).
Math.random() - Получение случайного Double числа от 0 до 1:
Single test of millon calculations =
29.0
One-thread test - avg time of million calculations 100 times =
24.59
Multi-thread test - avg time of million calculations 100 times =
21410.09
ThreadLocalRandom.current().nextDouble() - Получение случайного Double числа от 0 до 1
:
Single test of millon calculations =
10.0
One-thread test - avg time of million calculations 100 times =
2.19
Multi-thread test - avg time of million calculations 100 times =
18.07
UPD: Заметил интересную закономерность - чем больше потоков, тем быстрее обработка, так например среднее время генерации в 10 000 потоках равно 2.0901
MersenneTwister.makeDefault().nextDouble() - Получение случайного Double числа от 0 до 1
:
Single test of millon calculations =
2861.0
One-thread test - avg time of million calculations 100 times =
2665.28
Multi-thread test - avg time of million calculations 100 times =
49829.57
UPD: В мульти-тред тесте процесс сначала секунд 40 висел, а потом достаточно быстро все рассчитал
В плане производительности бесспорный победитель
ThreadLocalRandom
Качество
Описание: качество
псевдо-рандома определяется частотой попадания в каждую часть своего диапазона. Например если мы условно поделим Double диапазон [от 0 до 10] на 10 равных частей, то получим одинаковые промежутки [от 0 до 1], [от 3 до 4] и тд. Чем меньше разница между частотой попадания в каждый из этих условных промежутков, тем точнее будет случайная выборка. Т.е. условно 10% на попадание в каждый промежуток. Соответственно Integer выборка псвевдо-рандома от 0 до 1 с 50% шансом должна выводить 1. А в промежутке от 0 до 3 шанс выпадения определенного числа должен быть равен 25%. Более подробно тут
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или
Регистрация
В тесте будет высчитана средняя частота попадания в каждый из 100 промежутков на основании 10 тестов с 1 000 000 000 генераций рандомного числа. После чего средняя частота будет сравниваться с частотой каждого промежутка для получения средней разницы, которая станет результатом (среднее значение от среднего значения, кек). Так же будет рассчитана простая разница между максимальной и минимальной частотой и еще че нить. Для упрощения сгенерированные числа будут домножаться на 100 и конвертироваться в Integer. Обработка будет идти одним потоком. Погрешность ~5%
Math.random():
Avg rate diff = 25.196
Avg rate =
1000.0
Min rate =
911.8
Max rate =
1077.7
Avg rate diff between min & max =
994.75
ThreadLocalRandom.current().nextDouble():
Avg rate diff = 26.032
Avg rate =
1000.0
Min rate =
921.4
Max rate =
1076.9
Avg rate diff between min & max =
999.15
MersenneTwister.makeDefault().nextDouble():
Avg rate diff = 76.4779
Avg rate =
1000.0
Min rate =
771.8
Max rate =
1260.1
Avg rate diff between min & max =
1015.95
С незначительным перевесом побеждает самый простейший
Math.random. Что самое интересное - библиотека одобренная математиками имеет в разы более худшую выборку и гораздо больший разброс по частоте использования промежутков по сравнению со стандартными библиотеками явы. Вполне возможно, что это какой-то очень узко-специализированный рандомайзер, но для сервера ла2 ни в плане производительности, ни в плане качества выборки он не подходит.
Выводы: самым оптимальным вариантом будет использование
ThreadLocalRandom т.к. на сервере ла2 его производительность будет в разы выше любого рандомайзера при весьма годной выборке.
P.S. Библиотека переведена на
ThreadLocalRandom и обновлена.