-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
averaging over several random inputs #61
Comments
|
funcToRandomBench
:: forall a b c.
(b -> c) -- ^ How to evaluate results, usually 'id' or 'rnf'.
-> (a -> b) -- ^ What to benchmark
-> IO a -- ^ Generator of inputs
-> Benchmarkable
funcToRandomBench frc = (Benchmarkable .) . funcToRandomBenchLoop SPEC
where
funcToRandomBenchLoop :: SPEC -> (a -> b) -> IO a -> Word64 -> IO ()
funcToRandomBenchLoop !_ f mx n
| n == 0 = pure ()
| otherwise = do
x <- mx
_ <- evaluate (frc (f x))
funcToRandomBenchLoop SPEC f mx (n - 1)
{-# INLINE funcToRandomBench #-} Would this be enough? It's up to supplied |
You would probably still benchmark a single random input multiple times to get good confidence and then average over multiple random inputs. I tried to use perRunEnv with criterion with this random function and it gave me wild results. It might be similar here (though it might also be just fine?) I think the function you propose is pretty good for random inputs that are expected to have very similar runtimes. |
If you limit |
I mean sure but I feel like this should ultimately be part of the interface, no? Btw ~ really cool library, currently only using it to output stats in form of a csv but that’s much easier and quicker than with criterion ❤️ |
Since |
Alright ~ I will try out to make something useful out if it :) |
@MangoIV any chance you had an opportunity to use |
I have ended up using something external. It just didn’t fit my purpose enough. That’s not a fault of the function or the implementation, I just needed all of the information so I made the random generation external… I’ll tell you when I come around this again. |
Hi! Say I have an algorithm that I expect to perform differently on a bunch of different inputs and say I have a sufficiently good
Gen
instance ~ why would it be a bad idea to generate a bunch of inputs withGen
and then average the benchmarks over these to get a good picture on how the algorithm behaves on different inputs?I feel like this would be kind of an obvious thing to do, not necessarily via
Gen
but maybe with an interface like this:and then maybe
What do you think?
The text was updated successfully, but these errors were encountered: