The recommended method to construct a UniformRandomProvider is to use, e.g.:
The factory method knows the type of seed required for the constructor and generates one as appropriate.
This factory method could be made more efficient, in particular:
- Reducing synchronisation around the single source of random seed data
- Adding knowledge of the required seed size for arrays
- Changing internal data structures, e.g. Map<Class<?>, SeedConverter<?,?>> can be changed to Map<SeedType, SeedConverter<?,?>> using an EnumMap if a new enum SeedType was created for all the supported seeds (currently 4 types).
- Add a new interface to replace SeedConverter<?,?>.convert() with a .convert(int outputArraySize) method to allow conversions to generate appropriately sized arrays. The parameter can be ignored for non-array conversions but could optimise array conversions.
This ticket is to add a JMH benchmark to compare the speed of construction of all the providers using:
- Their native constructor
- RandomSource using the native seed of the correct size (calls a constructor using reflection)
- RandomSource using a non native seed (requires seed conversion)
- RandomSource using no seed (requires seed generation)
The report will be posted here. It could be added to the user guide for reference.
This work is motivated by the new XorShiRo generators in version 1.3 that have a native array seed size of 2, 4, or 8. The current RandomSource create method will generate a fixed seed of length 128 for seeding.