Hi.

Sorry: I had not seen your post before adding yet another
unnecessary layer of comment to the JIRA issue for MATH-1154.

On Tue, 07 Oct 2014 17:38:34 -0700, Phil Steitz wrote:
Comments in MATH-1154 (bad performance in test code) and the
now-reopened MATH-1124 (slow initialization) point to the need to
fix the problem we created when we moved sample() to the
distribution classes with PRNG provided by a final field with
default implementation initialized by the constructor.  Several
suggestions have been made to improve things.

0) require that sample() take a RandomGenerator as an additional
parameter

Looks fine.
But not for 3.x release.
Caveat: Not thread-safe.

1) improve initialization performance of the default RandomGenerator
2) Replace the default with a generator with negligible
initialization latency

Both are worth doing, but do not address the issue, as there
could always be use-cases where the initialization time, however
small, will be too much, simply because it is not necessary.
[This kind of argument was used for FastMath.]

As long as initialization takes longer than whatever functionality
is requested, this does won't fix issues similar to MATH-1154.

3) Make either PRNG initialization or initialization [lazy]

-1
We are talking of a low-level object; when a user intantiates
a RNG, it is not usually expected that he has called a "dummy"
constructor, and that actual work will be performed at some
unspecified later time.

of the
RandomGenerator field lazy

-0
I'd much prefer to leave the choice to the user, through his own
selection of a "enhanced" RNG that _explicitly_ provides lazy
intialization (cf. Otmar's proposal). See also below.


I may have missed some.

Yes: Otmar's proposal (part of the patch on MAH-1154 page).

One thing to note is that the (default)
Well generators are *not* threadsafe, so having things final,
avoiding lazy init is not really buying us anything in the current
setup.

Thanks for bringing that up again.

 So unless 2) is done with a threadsafe generator, only 0)
really makes sample() threadsafe (assuming the caller protects the
instance that needs to be re-supplied on each call).

Sort of...
It would be nice to make the RNG implementation thread-safe.
Or to know that some (all?) of them cannot be thread-safe, in
principle.
That would narrow the set of possibilities for a design that
depends on the answer.


I am +0 for adding a new method that takes a generator as an
additional actual parameter, but as a user I like the convenience of
just calling sample().  I never use distributions as singletons, so
the lack of threadsafety does not concern me.

Thread-safety is not only about singletons.

Assuming that the RNG is thread-safe, the _same_ object can be used
throughout an application's life-time, paying the initialization cost
only once. [Which would in turn render the initialization bearable in
many cases.]

It seems then that a
reasonable approach might be to add the new method, keep the old one
but move to lazy initialization with documentation that when you use
the default, the provided PRNG it is not threadsafe.

With Otmar's feature, we get
 * lazy initialization (if needed)
 * backward compatibility
 * no API change

Why should it be one or the other?


Gilles

 I would also
obviously be in favor or anything we can do in 1).

Phil



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to