AndWass / pushgen

Apache License 2.0
27 stars 4 forks source link

[Proposal] Separating callback chain building and actual invocation #44

Open NobodyXu opened 3 years ago

NobodyXu commented 3 years ago

Currently, the callback chain building and the actual invocation is done at the same time.

This means that invocation of Generator::run needs to check for initialization and that under debug mode, there might be 2n stack frames where n is the number of pipelines.

Here, I propose a new API for Generator:

trait Callback {
    fn call(&mut self) -> GeneratorResult;
}

trait Generator {
    type Output: Callback;

    fn run(&mut self, output: impl FnMut(Self::Output) -> crate::ValueResult) -> Self::Output;
}

Call to Generator::run will initialize the pipeline (e.g. for Dedup, it would be getting the first element) and then return a callback to a closure that have the entire pipelines already built.

As a result, even under the debug build where no inline is performed, the stack frames used is guaranteed to be equal to the number of pipelines.

The function returned will be called inside for_each, try_for_each and IteratorAdaptor.

This would also make it clear to new contributors on which part is responsible for initialization and which part is accounted for the "loop body" and possibly remove some uses of Option.

AndWass commented 3 years ago

Hi

I don't think you can do a trait like that, you can't have impl FnMut() -> GeneratorResult as a function return value :(

I agree it would be nice to seperate the pipeline creation, and pipeline execution into seperate steps. However I am not sure it can be truly done. In Dedup for instance, if it fails to get the first element at build-time, it will still have to try to get it at run-time.

Say the upstream Generator is trying to fetch data from a channel, if it fails (no element to read at this time) it reports stop, if the channel is closed it reports complete, otherwise it sends each available value through the pipeline. With such a source-generator you can't rely on the first value being available when you build the pipeline. And so you must be able to do the initialization step even when you do later runs on the pipeline.

If we had a marker trait trait NeverStoppingGenerator: Generator we could move the initialization into Dedup::new for any source that is a NeverStoppingGenerator and remove that code entirely from Dedup::run when Src implements NeverStoppingGenerator, but that requires specialization I think?

NobodyXu commented 3 years ago

I don't think you can do a trait like that, you can't have impl FnMut() -> GeneratorResult as a function return value :(

IMHO it should be possible, as I recalled from my memory rust's async function is just a sugar for fn f(...) -> impl Future

Say the upstream Generator is trying to fetch data from a channel, if it fails (no element to read at this time) it reports stop, if the channel is closed it reports complete, otherwise it sends each available value through the pipeline. With such a source-generator you can't rely on the first value being available when you build the pipeline. And so you must be able to do the initialization step even when you do later runs on the pipeline.

If so, then I guess the terminating for_each will just simply return I guess?

And IMO the initialization process can be restarted by calling for_each again,

It is an interesting problem though: I don't think pushgen will work well with channel, which is async by nature.

While pushgen employs callback to avoid branching, it isn't async, which I think program which uses channel would expect.

AndWass commented 3 years ago

IMHO it should be possible, as I recalled from my memory rust's async function is just a sugar for fn f(...) -> impl Future

An async fn some_async() is just sugar for fn some_async() -> impl Future yes, but the Future trait itself, is alot more basic. And a quick test on the playground confirms that you can't have impl Trait as return-type in traits.

If so, then I guess the terminating for_each will just simply return I guess?

for_each will stop and return GeneratorResult::Stopped yes.

And IMO the initialization process can be restarted by calling for_each again,

True

It is an interesting problem though: I don't think pushgen will work well with channel, which is async by nature.

While pushgen employs callback to avoid branching, it isn't async, which I think program which uses channel would expect.

I was more thinking if you have a generator that uses try_recv to generate data. It might not be a common use-case but I think it can prove valuable

NobodyXu commented 3 years ago

An async fn some_async() is just sugar for fn some_async() -> impl Future yes, but the Future trait itself, is alot more basic. And a quick test on the playground confirms that you can't have impl Trait as return-type in traits.

Yep, turns out only way to do this is to add an item to the Test, which implements another trait Callback since we cannot infer the type of closure.

playground

I was more thinking if you have a generator that uses try_recv to generate data. It might not be a common use-case but I think it can prove valuable

Yep, though I think my proposal will not forbid this API.

AndWass commented 3 years ago

Yah I definitely think it's an interesting idea to split the cold and hot paths. Some experimentation and testing is necessary before committing to it though

NobodyXu commented 3 years ago

What kind of experiments do you think is necessary for this?

NobodyXu commented 3 years ago

I was just trying to define a clear example for the new trait, however I immediately discover that without impl FnMut() -> GeneratorResult as the return value, the code failed apart because the output is a generic parameter and it is necessary for run to return different types based on the generic parameter.

AndWass commented 3 years ago

Ah ok. I will try and think of something to try as well, but right now I don't have any clear idea.

NobodyXu commented 3 years ago

I just realized that all pipelines either takes &mut to itself (like Dedup) or takes nothing (Cloned).

So what I now proposed instead is to use an erased interface:

use core::ffi::c_void;
use core::mem::transmute;
use core::ptr::null_mut;
use core::marker::PhantomData;

/// ErasedFnPointer can either points to a free function or associated one that
/// `&mut self`
struct ErasedFnPointer<'a, T, Ret> {
    struct_pointer: *mut c_void,
    wrapper: fn(&ErasedFnPointer<'a, T, Ret>, T) -> Ret, 
    fp: *const (),
    phantom: PhantomData<&'a ()>
}
impl<'a, T, Ret> ErasedFnPointer<'a, T, Ret> {
    fn associated_wrapper<S>(&self, param: T) -> Ret {
        let sp = self.struct_pointer as *mut S;
        let s = unsafe { &mut (*sp) };
        let fp = unsafe { transmute::<_, fn(&mut S, T) -> Ret>(self.fp) };
        fp(s, param)
    }

    pub fn from_associated<S>(struct_pointer: &'a mut S, fp: fn(&mut S, T) -> Ret)
        -> ErasedFnPointer<'a, T, Ret>
    {
        ErasedFnPointer {
            struct_pointer: struct_pointer as *mut _ as *mut c_void,
            fp: fp as *const (),
            wrapper: ErasedFnPointer::associated_wrapper::<S>,
            phantom: PhantomData
        }
    }

    fn free_wrapper(&self, param: T) -> Ret {
        let fp = unsafe { transmute::<_, fn(T) -> Ret>(self.fp) };
        fp(param)
    }

    pub fn from_free(fp: fn(T) -> Ret) -> ErasedFnPointer<'static, T, Ret> {
        ErasedFnPointer {
            struct_pointer: null_mut(),
            fp: fp as *const(),
            wrapper: ErasedFnPointer::free_wrapper,
            phantom: PhantomData
        }
    }

    pub fn call(&self, param: T) -> Ret {
        (self.wrapper)(self, param)
    }
}

trait Callback {
    fn call(&mut self) -> GeneratorResult;
}

trait Generator {
    type Output: Callback;

    fn run(&mut self, output: ErasedFnPointer<Self::Output, crate::ValueResult>) -> Self::Output;
}

The compiler can easily inline the *_wrapper and the underlying function pointer, while Generator can have a stable interface without any generic parameter, so that it can return a single type only.

This makes the separation I described before possible without losing performance, but it also might help with compilation time a bit since there is no need for monomorphization and no duplicate code is generated when one pipeline uses the other more than once (e.x. Dedup).

playground

Edit:

One problem with ErasedFnPointer is that it doesn’t have PhantomData<&S> field, so it might actually caused a problem for enforcing the mutability rule.

I think I got it fixed now with lifetime annotation and PhantomData.

AndWass commented 3 years ago

Hi

I'm not sold at the moment to be honest. This is IMO starting to get more complicated than the system already in place. Have you implemented any of the more involved adaptors (like Dedup or Flatten) using this pattern? I think before any change is decided on the basic benchmarks must be ported to this kind of system and checked against current system.

It is also quite easy to run into UB with the pointer solution; playground

NobodyXu commented 3 years ago

Hi

I'm not sold at the moment to be honest. This is IMO starting to get more complicated than the system already in place. Have you implemented any of the more involved adaptors (like Dedup or Flatten) using this pattern? I think before any change is decided on the basic benchmarks must be ported to this kind of system and checked against current system.

It is also quite easy to run into UB with the pointer solution; playground

About the UB part, I have actually updated my code yesterday and introduces lifetime annotation inside ErasedFnPointer along with PhantomData to fix the lifetime issues.

With the updated code, it will actually fail to compile.

Edit:

Looks like I forgot to update the link yesterday and now I have updated the link in my original comment.

NobodyXu commented 3 years ago

It’s actually possible to implement take one easily with closure, since in rust, associated functions are just regular functions:

fn main() {
    let mut x = None;
    ErasedFnPointer::from_associated(&mut x, |x, param| {
        *x = Some(param);
        println!("{:#?}", x);
    }).call(1);
}
NobodyXu commented 3 years ago

For the part where deduped values is pushed, I guess the parameter output (the callback) in Generator::run has to be saved inside Dedup so that it can be accessed.

However, it does raise issues with lifetime, unless GeneratorExt::for_each and GeneratorExt::try_for_each takes self instead of &mut self.

Personally, I don’t think of this as a major downside, as users can always wraps the pipelines in a closure to use it multiple times, but it does impact existing uses of pushgen.

NobodyXu commented 3 years ago

Here’s a link to the code inside gist

AndWass commented 3 years ago

Thanks for the writeup! At the moment I won't pursue this split. I don't really see the benefit right now and I don't really have the time to do any benchmarking and testing.

NobodyXu commented 3 years ago

Thanks for the writeup! At the moment I won't pursue this split. I don't really see the benefit right now and I don't really have the time to do any benchmarking and testing.

I can definitely understand your decision.

So instead of requesting for implement this in the main repo, I will try to implement this in my own fork and provides update to it in this issue.

AndWass commented 3 years ago

Sounds like a good plan! I'm definitely interested in the approach.

NobodyXu commented 3 years ago

I have created a new branch GeneratorImprovement for this in my own fork.

I am still in the progress of replacing the generic param inn Generator::run with ErasedFnPointer.

NobodyXu commented 3 years ago

I have replaced the generic version of Generator::run with the ErasedFnPointer version of it in here.

I will pause for a while and perform benchmark to see how this alone would affect the performance.

NobodyXu commented 3 years ago

Benchmark result of 6e3af98000d680f023428a5e390c573f218c8e4f using taskset 0x01 cargo bench:

    Finished bench [optimized] target(s) in 0.02s
     Running unittests (target/release/deps/pushgen-9dbcdc1345ab781d)

running 16 tests
test generator_ext::tests::for_each_stopped ... ignored
test structs::chain::tests::basic_chain ... ignored
test structs::dedup::tests::dedup_all_duplicate ... ignored
test structs::dedup::tests::dedup_nonduplicate ... ignored
test structs::dedup::tests::dedup_some_duplicate ... ignored
test structs::dedup::tests::dedup_stopping_source ... ignored
test structs::flatten::tests::slice_flatten ... ignored
test structs::flatten::tests::stopping_generator ... ignored
test structs::flatten::tests::vector_flatten ... ignored
test structs::iterator::tests::fold ... ignored
test structs::iterator::tests::iter_over_slice ... ignored
test structs::take::tests::take ... ignored
test structs::take::tests::take_restart ... ignored
test structs::zip::tests::same_length ... ignored
test structs::zip::tests::shorter_left_side ... ignored
test structs::zip::tests::shorter_right_side ... ignored

test result: ok. 0 passed; 0 failed; 16 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests (target/release/deps/for_each_chain_take_filter_map-c2f1d7bc7957186f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_chain_take_filter_map
Benchmarking iterator_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.1368 s (2400 iterations)
Benchmarking iterator_for_each_chain_take_filter_map: Analyzing
iterator_for_each_chain_take_filter_map
                        time:   [2.1270 ms 2.1460 ms 2.1693 ms]
                        change: [-1.2152% -0.0224% +1.1434%] (p = 0.97 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/for_each_dedup_filter-0792b8997f8ad6ba)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_filter
Benchmarking iterator_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_filter: Collecting 100 samples in estimated 5.3478 s (71k iterations)
Benchmarking iterator_for_each_dedup_filter: Analyzing
iterator_for_each_dedup_filter
                        time:   [74.325 us 74.800 us 75.396 us]
                        change: [-8.2384% -7.1125% -5.9268%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/for_each_dedup_flatten_filter_map-02530f85fb28b946)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_flatten_filter_map
Benchmarking iterator_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.5590 s (15k iterations)
Benchmarking iterator_for_each_dedup_flatten_filter_map: Analyzing
iterator_for_each_dedup_flatten_filter_map
                        time:   [436.31 us 439.38 us 442.92 us]
                        change: [-0.4690% +0.4396% +1.3767%] (p = 0.35 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/for_each_filter_map-23889c5657b80085)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_filter_map
Benchmarking iterator_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_filter_map: Collecting 100 samples in estimated 5.6040 s (35k iterations)
Benchmarking iterator_for_each_filter_map: Analyzing
iterator_for_each_filter_map
                        time:   [158.13 us 159.36 us 160.81 us]
                        change: [-0.9971% +0.1623% +1.3754%] (p = 0.80 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  4 (4.00%) high mild
  7 (7.00%) high severe

     Running unittests (target/release/deps/for_each_flatten_dedup_filter_map-982b60bd65247325)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_flatten_dedup_filter_map
Benchmarking iterator_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 6.0028 s (10k iterations)
Benchmarking iterator_for_each_flatten_dedup_filter_map: Analyzing
iterator_for_each_flatten_dedup_filter_map
                        time:   [591.43 us 595.06 us 599.53 us]
                        change: [-0.9254% +0.6120% +2.8122%] (p = 0.56 > 0.05)
                        No change in performance detected.
Found 15 outliers among 100 measurements (15.00%)
  6 (6.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/for_each_transrangers_test6-ebafe03edf02d334)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_transrangers_test6
Benchmarking iterator_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_for_each_transrangers_test6: Collecting 100 samples in estimated 5.7450 s (20k iterations)
Benchmarking iterator_for_each_transrangers_test6: Analyzing
iterator_for_each_transrangers_test6
                        time:   [282.04 us 283.94 us 286.32 us]
                        change: [-2.7423% -1.3120% +0.0465%] (p = 0.06 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  2 (2.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_basic_loop-37d9035efa073309)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_basic_loop
Benchmarking iterator_next_basic_loop: Warming up for 3.0000 s
Benchmarking iterator_next_basic_loop: Collecting 100 samples in estimated 5.0034 s (56k iterations)
Benchmarking iterator_next_basic_loop: Analyzing
iterator_next_basic_loop
                        time:   [89.551 us 90.250 us 91.122 us]
                        change: [-1.5815% -0.5493% +0.5786%] (p = 0.33 > 0.05)
                        No change in performance detected.
Found 21 outliers among 100 measurements (21.00%)
  12 (12.00%) low mild
  3 (3.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/iter_next_chain_take_filter_map-f319c0ad5d149fc6)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_chain_take_filter_map
Benchmarking iterator_next_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_chain_take_filter_map: Collecting 100 samples in estimated 5.0800 s (2200 iterations)
Benchmarking iterator_next_chain_take_filter_map: Analyzing
iterator_next_chain_take_filter_map
                        time:   [2.2886 ms 2.3026 ms 2.3198 ms]
                        change: [-1.4603% -0.4064% +0.6751%] (p = 0.47 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_dedup_filter-d972ca417e800e75)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_filter
Benchmarking iterator_next_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_filter: Collecting 100 samples in estimated 5.1261 s (106k iterations)
Benchmarking iterator_next_dedup_filter: Analyzing
iterator_next_dedup_filter
                        time:   [47.918 us 48.296 us 48.747 us]
                        change: [-0.2984% +0.7532% +1.8544%] (p = 0.19 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_dedup_flatten_filter_map-b66194b56c578199)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_flatten_filter_map
Benchmarking iterator_next_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_flatten_filter_map: Collecting 100 samples in estimated 8.4989 s (10k iterations)
Benchmarking iterator_next_dedup_flatten_filter_map: Analyzing
iterator_next_dedup_flatten_filter_map
                        time:   [833.15 us 837.99 us 843.64 us]
                        change: [-0.3999% +0.8304% +2.2878%] (p = 0.23 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  2 (2.00%) low mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/iter_next_filter_map-d184a6e09748526e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_filter_map
Benchmarking iterator_next_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_filter_map: Collecting 100 samples in estimated 5.6615 s (15k iterations)
Benchmarking iterator_next_filter_map: Analyzing
iterator_next_filter_map
                        time:   [371.28 us 374.01 us 377.30 us]
                        change: [-1.1823% -0.1644% +0.7638%] (p = 0.75 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/iter_next_flatten_dedup_filter_map-3b82355d0e7308f8)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_flatten_dedup_filter_map
Benchmarking iterator_next_flatten_dedup_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 5.1s, enable flat sampling, or reduce sample count to 70.
Benchmarking iterator_next_flatten_dedup_filter_map: Collecting 100 samples in estimated 5.0660 s (5050 iterations)
Benchmarking iterator_next_flatten_dedup_filter_map: Analyzing
iterator_next_flatten_dedup_filter_map
                        time:   [1.0013 ms 1.0090 ms 1.0183 ms]
                        change: [-4.0667% -0.9408% +1.1043%] (p = 0.61 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  3 (3.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_transrangers_test6-aa5b656484c1d22f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_transrangers_test6
Benchmarking iterator_next_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_next_transrangers_test6: Collecting 100 samples in estimated 6.7045 s (10k iterations)
Benchmarking iterator_next_transrangers_test6: Analyzing
iterator_next_transrangers_test6
                        time:   [660.66 us 665.06 us 670.30 us]
                        change: [-0.6146% +0.3795% +1.4175%] (p = 0.51 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  1 (1.00%) high mild
  8 (8.00%) high severe

     Running unittests (target/release/deps/pushgen_chain_take_filter_map-d0156bcf4d3bfeef)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking generator_chain_take_filter_map
Benchmarking generator_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking generator_chain_take_filter_map: Collecting 100 samples in estimated 7.5320 s (10k iterations)
Benchmarking generator_chain_take_filter_map: Analyzing
generator_chain_take_filter_map
                        time:   [741.44 us 746.07 us 751.54 us]
                        change: [-0.7264% +0.1440% +0.9947%] (p = 0.77 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  1 (1.00%) low mild
  4 (4.00%) high mild
  7 (7.00%) high severe

     Running unittests (target/release/deps/pushgen_dedup_filter-91859256e6e92e85)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_filter
Benchmarking pushgen_dedup_filter: Warming up for 3.0000 s
Benchmarking pushgen_dedup_filter: Collecting 100 samples in estimated 5.0323 s (242k iterations)
Benchmarking pushgen_dedup_filter: Analyzing
pushgen_dedup_filter    time:   [20.762 us 20.907 us 21.089 us]
                        change: [-0.3892% +0.7025% +1.8623%] (p = 0.27 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  3 (3.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/pushgen_dedup_flatten_filter_map-d78681cad649eb0f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_flatten_filter_map
Benchmarking pushgen_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_dedup_flatten_filter_map: Collecting 100 samples in estimated 5.0888 s (20k iterations)
Benchmarking pushgen_dedup_flatten_filter_map: Analyzing
pushgen_dedup_flatten_filter_map
                        time:   [250.01 us 251.90 us 254.27 us]
                        change: [-10.144% -3.6279% +0.9031%] (p = 0.30 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/pushgen_filter_map-9ac271e2acbf21cd)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_filter_map
Benchmarking pushgen_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_filter_map: Collecting 100 samples in estimated 5.6505 s (35k iterations)
Benchmarking pushgen_filter_map: Analyzing
pushgen_filter_map      time:   [158.86 us 160.08 us 161.54 us]
                        change: [-2.1761% -0.2834% +1.2589%] (p = 0.78 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/pushgen_flatten_dedup_filter_map-64ff7169b0b1e6da)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_flatten_dedup_filter_map
Benchmarking pushgen_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_flatten_dedup_filter_map: Collecting 100 samples in estimated 6.0091 s (25k iterations)
Benchmarking pushgen_flatten_dedup_filter_map: Analyzing
pushgen_flatten_dedup_filter_map
                        time:   [236.26 us 237.76 us 239.60 us]
                        change: [-0.8371% -0.0583% +0.7147%] (p = 0.89 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe

     Running unittests (target/release/deps/pushgen_iter_basic_loop-ba604406bd167963)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_basic_loop
Benchmarking pushgen_iter_basic_loop: Warming up for 3.0000 s
Benchmarking pushgen_iter_basic_loop: Collecting 100 samples in estimated 5.0472 s (56k iterations)
Benchmarking pushgen_iter_basic_loop: Analyzing
pushgen_iter_basic_loop time:   [90.251 us 90.951 us 91.823 us]
                        change: [-0.1168% +1.1477% +2.4304%] (p = 0.08 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe

     Running unittests (target/release/deps/pushgen_iter_chain_take_filter_map-2c85753845747283)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_chain_take_filter_map
Benchmarking pushgen_iter_chain_take_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 7.8s, enable flat sampling, or reduce sample count to 50.
Benchmarking pushgen_iter_chain_take_filter_map: Collecting 100 samples in estimated 7.7878 s (5050 iterations)
Benchmarking pushgen_iter_chain_take_filter_map: Analyzing
pushgen_iter_chain_take_filter_map
                        time:   [1.4744 ms 1.4850 ms 1.4973 ms]
                        change: [-0.7726% +0.6280% +1.9490%] (p = 0.38 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

     Running unittests (target/release/deps/pushgen_transrangers_test6-beceb9a7f7f3aa7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_transrangers_test6
Benchmarking pushgen_transrangers_test6: Warming up for 3.0000 s
Benchmarking pushgen_transrangers_test6: Collecting 100 samples in estimated 5.7536 s (20k iterations)
Benchmarking pushgen_transrangers_test6: Analyzing
pushgen_transrangers_test6
                        time:   [283.25 us 285.00 us 287.21 us]
                        change: [-0.9785% +0.0567% +1.1057%] (p = 0.92 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/try_for_each_chain_take_filter_map-dd6018e8ec5d4a7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_chain_take_filter_map
Benchmarking iterator_try_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.0208 s (2300 iterations)
Benchmarking iterator_try_for_each_chain_take_filter_map: Analyzing
iterator_try_for_each_chain_take_filter_map
                        time:   [2.1682 ms 2.1847 ms 2.2045 ms]
                        change: [-0.9323% +0.1446% +1.2684%] (p = 0.80 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/try_for_each_dedup_filter-e3981107a8d0b5c7)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_filter
Benchmarking iterator_try_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_filter: Collecting 100 samples in estimated 5.1125 s (121k iterations)
Benchmarking iterator_try_for_each_dedup_filter: Analyzing
iterator_try_for_each_dedup_filter
                        time:   [41.759 us 42.030 us 42.379 us]
                        change: [-1.5309% -0.4606% +0.5479%] (p = 0.41 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  2 (2.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/try_for_each_dedup_flatten_filter_map-98eef37b8662f178)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_flatten_filter_map
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.2948 s (10k iterations)
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Analyzing
iterator_try_for_each_dedup_flatten_filter_map
                        time:   [619.25 us 623.73 us 629.01 us]
                        change: [-1.0925% -0.0937% +0.8407%] (p = 0.86 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) high mild
  7 (7.00%) high severe

     Running unittests (target/release/deps/try_for_each_filter_map-9dead610a7585c29)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_filter_map
Benchmarking iterator_try_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_filter_map: Collecting 100 samples in estimated 6.1342 s (10k iterations)
Benchmarking iterator_try_for_each_filter_map: Analyzing
iterator_try_for_each_filter_map
                        time:   [601.05 us 604.95 us 609.77 us]
                        change: [-1.4356% -0.4445% +0.5049%] (p = 0.39 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  5 (5.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/try_for_each_flatten_dedup_filter_map-092f2984d109ffc4)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_flatten_dedup_filter_map
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 9.4996 s (10k iterations)
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Analyzing
iterator_try_for_each_flatten_dedup_filter_map
                        time:   [937.58 us 942.78 us 948.65 us]
                        change: [-5.5575% -1.8861% +0.5081%] (p = 0.33 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  2 (2.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/try_for_each_transrangers_test6-33f87431201c709c)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_transrangers_test6
Benchmarking iterator_try_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_transrangers_test6: Collecting 100 samples in estimated 7.0154 s (10k iterations)
Benchmarking iterator_try_for_each_transrangers_test6: Analyzing
iterator_try_for_each_transrangers_test6
                        time:   [690.28 us 695.47 us 701.61 us]
                        change: [-18.268% -12.381% -7.8956%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe
NobodyXu commented 3 years ago

Benchmark of 6090ec39757f7cc85eb6c1583482c40f41d6223f:

   Compiling pushgen v0.0.1 (/home/nobodyxu/Dev/pushgen)
    Finished bench [optimized] target(s) in 3m 03s
     Running unittests (target/release/deps/pushgen-9dbcdc1345ab781d)

running 19 tests
test callback::tests::from_associated ... ignored
test callback::tests::from_associated_for_closure ... ignored
test callback::tests::from_free ... ignored
test generator_ext::tests::for_each_stopped ... ignored
test structs::chain::tests::basic_chain ... ignored
test structs::dedup::tests::dedup_all_duplicate ... ignored
test structs::dedup::tests::dedup_nonduplicate ... ignored
test structs::dedup::tests::dedup_some_duplicate ... ignored
test structs::dedup::tests::dedup_stopping_source ... ignored
test structs::flatten::tests::slice_flatten ... ignored
test structs::flatten::tests::stopping_generator ... ignored
test structs::flatten::tests::vector_flatten ... ignored
test structs::iterator::tests::fold ... ignored
test structs::iterator::tests::iter_over_slice ... ignored
test structs::take::tests::take ... ignored
test structs::take::tests::take_restart ... ignored
test structs::zip::tests::same_length ... ignored
test structs::zip::tests::shorter_left_side ... ignored
test structs::zip::tests::shorter_right_side ... ignored

test result: ok. 0 passed; 0 failed; 19 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests (target/release/deps/for_each_chain_take_filter_map-c2f1d7bc7957186f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_chain_take_filter_map
Benchmarking iterator_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.1416 s (2400 iterations)
Benchmarking iterator_for_each_chain_take_filter_map: Analyzing
iterator_for_each_chain_take_filter_map
                        time:   [2.1307 ms 2.1469 ms 2.1664 ms]
                        change: [-1.2470% +0.0425% +1.3581%] (p = 0.94 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/for_each_dedup_filter-0792b8997f8ad6ba)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_filter
Benchmarking iterator_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_filter: Collecting 100 samples in estimated 5.0360 s (66k iterations)
Benchmarking iterator_for_each_dedup_filter: Analyzing
iterator_for_each_dedup_filter
                        time:   [76.366 us 77.038 us 77.825 us]
                        change: [+1.7262% +3.4645% +5.2383%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
  3 (3.00%) high mild
  3 (3.00%) high severe

     Running unittests (target/release/deps/for_each_dedup_flatten_filter_map-02530f85fb28b946)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_flatten_filter_map
Benchmarking iterator_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.5673 s (15k iterations)
Benchmarking iterator_for_each_dedup_flatten_filter_map: Analyzing
iterator_for_each_dedup_flatten_filter_map
                        time:   [427.84 us 430.80 us 434.27 us]
                        change: [-2.5552% -1.6524% -0.6604%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/for_each_filter_map-23889c5657b80085)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_filter_map
Benchmarking iterator_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_filter_map: Collecting 100 samples in estimated 5.6767 s (35k iterations)
Benchmarking iterator_for_each_filter_map: Analyzing
iterator_for_each_filter_map
                        time:   [159.62 us 160.85 us 162.31 us]
                        change: [-0.2898% +0.9400% +2.0048%] (p = 0.14 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  2 (2.00%) high mild
  7 (7.00%) high severe

     Running unittests (target/release/deps/for_each_flatten_dedup_filter_map-982b60bd65247325)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_flatten_dedup_filter_map
Benchmarking iterator_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 6.0153 s (10k iterations)
Benchmarking iterator_for_each_flatten_dedup_filter_map: Analyzing
iterator_for_each_flatten_dedup_filter_map
                        time:   [591.23 us 595.11 us 599.90 us]
                        change: [-2.7574% -0.8490% +0.5473%] (p = 0.39 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/for_each_transrangers_test6-ebafe03edf02d334)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_transrangers_test6
Benchmarking iterator_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_for_each_transrangers_test6: Collecting 100 samples in estimated 5.7753 s (20k iterations)
Benchmarking iterator_for_each_transrangers_test6: Analyzing
iterator_for_each_transrangers_test6
                        time:   [283.04 us 284.92 us 287.28 us]
                        change: [-0.5860% +0.3632% +1.3297%] (p = 0.47 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_basic_loop-37d9035efa073309)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_basic_loop
Benchmarking iterator_next_basic_loop: Warming up for 3.0000 s
Benchmarking iterator_next_basic_loop: Collecting 100 samples in estimated 5.3813 s (61k iterations)
Benchmarking iterator_next_basic_loop: Analyzing
iterator_next_basic_loop
                        time:   [88.227 us 88.830 us 89.586 us]
                        change: [-2.3394% -1.1818% -0.0575%] (p = 0.05 < 0.05)
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  7 (7.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_chain_take_filter_map-f319c0ad5d149fc6)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_chain_take_filter_map
Benchmarking iterator_next_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_chain_take_filter_map: Collecting 100 samples in estimated 5.0784 s (2200 iterations)
Benchmarking iterator_next_chain_take_filter_map: Analyzing
iterator_next_chain_take_filter_map
                        time:   [2.2954 ms 2.3124 ms 2.3330 ms]
                        change: [-0.5810% +0.4244% +1.5850%] (p = 0.45 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/iter_next_dedup_filter-d972ca417e800e75)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_filter
Benchmarking iterator_next_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_filter: Collecting 100 samples in estimated 5.0968 s (106k iterations)
Benchmarking iterator_next_dedup_filter: Analyzing
iterator_next_dedup_filter
                        time:   [47.792 us 48.176 us 48.636 us]
                        change: [-1.4840% -0.3737% +0.6225%] (p = 0.51 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  1 (1.00%) high mild
  4 (4.00%) high severe

     Running unittests (target/release/deps/iter_next_dedup_flatten_filter_map-b66194b56c578199)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_flatten_filter_map
Benchmarking iterator_next_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_flatten_filter_map: Collecting 100 samples in estimated 8.5047 s (10k iterations)
Benchmarking iterator_next_dedup_flatten_filter_map: Analyzing
iterator_next_dedup_flatten_filter_map
                        time:   [840.23 us 845.14 us 850.85 us]
                        change: [-1.0482% +0.2435% +1.2954%] (p = 0.71 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  2 (2.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/iter_next_filter_map-d184a6e09748526e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_filter_map
Benchmarking iterator_next_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_filter_map: Collecting 100 samples in estimated 5.6721 s (15k iterations)
Benchmarking iterator_next_filter_map: Analyzing
iterator_next_filter_map
                        time:   [371.88 us 374.77 us 378.24 us]
                        change: [-0.5513% +0.3788% +1.5762%] (p = 0.49 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  3 (3.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/iter_next_flatten_dedup_filter_map-3b82355d0e7308f8)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_flatten_dedup_filter_map
Benchmarking iterator_next_flatten_dedup_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 5.1s, enable flat sampling, or reduce sample count to 60.
Benchmarking iterator_next_flatten_dedup_filter_map: Collecting 100 samples in estimated 5.0808 s (5050 iterations)
Benchmarking iterator_next_flatten_dedup_filter_map: Analyzing
iterator_next_flatten_dedup_filter_map
                        time:   [994.51 us 1.0027 ms 1.0125 ms]
                        change: [-2.0237% -0.9274% +0.0606%] (p = 0.09 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  3 (3.00%) high mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/iter_next_transrangers_test6-aa5b656484c1d22f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_transrangers_test6
Benchmarking iterator_next_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_next_transrangers_test6: Collecting 100 samples in estimated 6.7035 s (10k iterations)
Benchmarking iterator_next_transrangers_test6: Analyzing
iterator_next_transrangers_test6
                        time:   [660.18 us 664.37 us 669.43 us]
                        change: [-1.4956% -0.3559% +0.7084%] (p = 0.55 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  4 (4.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/pushgen_chain_take_filter_map-d0156bcf4d3bfeef)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking generator_chain_take_filter_map
Benchmarking generator_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking generator_chain_take_filter_map: Collecting 100 samples in estimated 6.4890 s (10k iterations)
Benchmarking generator_chain_take_filter_map: Analyzing
generator_chain_take_filter_map
                        time:   [638.75 us 643.78 us 649.60 us]
                        change: [-14.694% -13.955% -13.188%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 10 outliers among 100 measurements (10.00%)
  3 (3.00%) high mild
  7 (7.00%) high severe

     Running unittests (target/release/deps/pushgen_dedup_filter-91859256e6e92e85)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_filter
Benchmarking pushgen_dedup_filter: Warming up for 3.0000 s
Benchmarking pushgen_dedup_filter: Collecting 100 samples in estimated 5.0207 s (242k iterations)
Benchmarking pushgen_dedup_filter: Analyzing
pushgen_dedup_filter    time:   [20.577 us 20.747 us 20.954 us]
                        change: [-2.3968% -1.0662% +0.1615%] (p = 0.10 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  4 (4.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/pushgen_dedup_flatten_filter_map-d78681cad649eb0f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_flatten_filter_map
Benchmarking pushgen_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_dedup_flatten_filter_map: Collecting 100 samples in estimated 5.1514 s (10k iterations)
Benchmarking pushgen_dedup_flatten_filter_map: Analyzing
pushgen_dedup_flatten_filter_map
                        time:   [506.45 us 510.29 us 514.96 us]
                        change: [+99.196% +101.67% +103.99%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
  3 (3.00%) low mild
  5 (5.00%) high severe

     Running unittests (target/release/deps/pushgen_filter_map-9ac271e2acbf21cd)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_filter_map
Benchmarking pushgen_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_filter_map: Collecting 100 samples in estimated 5.6642 s (35k iterations)
Benchmarking pushgen_filter_map: Analyzing
pushgen_filter_map      time:   [159.16 us 160.20 us 161.49 us]
                        change: [-1.1014% +0.1143% +1.2986%] (p = 0.86 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/pushgen_flatten_dedup_filter_map-64ff7169b0b1e6da)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_flatten_dedup_filter_map
Benchmarking pushgen_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_flatten_dedup_filter_map: Collecting 100 samples in estimated 8.9666 s (10k iterations)
Benchmarking pushgen_flatten_dedup_filter_map: Analyzing
pushgen_flatten_dedup_filter_map
                        time:   [885.01 us 890.09 us 895.92 us]
                        change: [+271.62% +274.84% +278.06%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 10 outliers among 100 measurements (10.00%)
  1 (1.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/pushgen_iter_basic_loop-ba604406bd167963)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_basic_loop
Benchmarking pushgen_iter_basic_loop: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 7.5s, enable flat sampling, or reduce sample count to 50.
Benchmarking pushgen_iter_basic_loop: Collecting 100 samples in estimated 7.5461 s (5050 iterations)
Benchmarking pushgen_iter_basic_loop: Analyzing
pushgen_iter_basic_loop time:   [1.4848 ms 1.4939 ms 1.5045 ms]
                        change: [+1525.7% +1544.2% +1561.7%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 12 outliers among 100 measurements (12.00%)
  3 (3.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/pushgen_iter_chain_take_filter_map-2c85753845747283)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_chain_take_filter_map
Benchmarking pushgen_iter_chain_take_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 6.7s, enable flat sampling, or reduce sample count to 60.
Benchmarking pushgen_iter_chain_take_filter_map: Collecting 100 samples in estimated 6.7268 s (5050 iterations)
Benchmarking pushgen_iter_chain_take_filter_map: Analyzing
pushgen_iter_chain_take_filter_map
                        time:   [1.3233 ms 1.3336 ms 1.3458 ms]
                        change: [-11.833% -10.562% -9.1405%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 7 outliers among 100 measurements (7.00%)
  4 (4.00%) high mild
  3 (3.00%) high severe

     Running unittests (target/release/deps/pushgen_transrangers_test6-beceb9a7f7f3aa7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_transrangers_test6
Benchmarking pushgen_transrangers_test6: Warming up for 3.0000 s
Benchmarking pushgen_transrangers_test6: Collecting 100 samples in estimated 7.5459 s (10k iterations)
Benchmarking pushgen_transrangers_test6: Analyzing
pushgen_transrangers_test6
                        time:   [743.61 us 748.33 us 753.88 us]
                        change: [+159.79% +162.52% +165.39%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 10 outliers among 100 measurements (10.00%)
  1 (1.00%) high mild
  9 (9.00%) high severe

     Running unittests (target/release/deps/try_for_each_chain_take_filter_map-dd6018e8ec5d4a7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_chain_take_filter_map
Benchmarking iterator_try_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.0196 s (2300 iterations)
Benchmarking iterator_try_for_each_chain_take_filter_map: Analyzing
iterator_try_for_each_chain_take_filter_map
                        time:   [2.1683 ms 2.1860 ms 2.2080 ms]
                        change: [-1.1223% +0.0580% +1.3757%] (p = 0.93 > 0.05)
                        No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
  6 (6.00%) low mild
  4 (4.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/try_for_each_dedup_filter-e3981107a8d0b5c7)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_filter
Benchmarking iterator_try_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_filter: Collecting 100 samples in estimated 5.0968 s (121k iterations)
Benchmarking iterator_try_for_each_dedup_filter: Analyzing
iterator_try_for_each_dedup_filter
                        time:   [41.793 us 42.111 us 42.503 us]
                        change: [-0.8095% +0.1412% +1.1413%] (p = 0.78 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/try_for_each_dedup_flatten_filter_map-98eef37b8662f178)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_flatten_filter_map
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.2973 s (10k iterations)
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Analyzing
iterator_try_for_each_dedup_flatten_filter_map
                        time:   [619.80 us 623.83 us 628.69 us]
                        change: [-0.8105% +0.0665% +0.9953%] (p = 0.88 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (target/release/deps/try_for_each_filter_map-9dead610a7585c29)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_filter_map
Benchmarking iterator_try_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_filter_map: Collecting 100 samples in estimated 6.1253 s (10k iterations)
Benchmarking iterator_try_for_each_filter_map: Analyzing
iterator_try_for_each_filter_map
                        time:   [602.46 us 606.62 us 611.60 us]
                        change: [-0.7174% +0.1216% +1.0620%] (p = 0.79 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  2 (2.00%) high mild
  8 (8.00%) high severe

     Running unittests (target/release/deps/try_for_each_flatten_dedup_filter_map-092f2984d109ffc4)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_flatten_dedup_filter_map
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 9.5406 s (10k iterations)
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Analyzing
iterator_try_for_each_flatten_dedup_filter_map
                        time:   [937.79 us 943.25 us 949.28 us]
                        change: [-1.2269% -0.2153% +0.6648%] (p = 0.67 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  1 (1.00%) high mild
  10 (10.00%) high severe

     Running unittests (target/release/deps/try_for_each_transrangers_test6-33f87431201c709c)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_transrangers_test6
Benchmarking iterator_try_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_transrangers_test6: Collecting 100 samples in estimated 7.0399 s (10k iterations)
Benchmarking iterator_try_for_each_transrangers_test6: Analyzing
iterator_try_for_each_transrangers_test6
                        time:   [692.75 us 697.97 us 704.16 us]
                        change: [-0.4898% +0.8592% +2.2790%] (p = 0.25 > 0.05)
                        No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) high mild
  12 (12.00%) high severe
AndWass commented 3 years ago

Interesting!

Looks like there were performance-regression for pretty much all benchmarks except for chain_take_filter_map? I wonder why that managed to improve while the others regressed by such hefty amounts?

NobodyXu commented 3 years ago

It seems benchmark test

are showing improvements, not just chain_take_filter_map.

NobodyXu commented 3 years ago

@AndWass How about also running the benchmark on your computer to confirm these benchmark tests are indeed showing improvements?

AndWass commented 3 years ago

It seems benchmark test iterator_for_each_dedup_flatten_filter_map, iterator_next_basic_loop, generator_chain_take_filter_map and pushgen_iter_chain_take_filter_map are showing improvements, not just chain_take_filter_map.

The first two are not using pushgen at all so shouldn't be impacted by the changes. The improvement percentage is also small, so more likely that there was some jitter during those benchmarks.

The other two benchmark the same operations using pushgen and the iterator adaptor of pushgen. So they are closely related.

AndWass commented 3 years ago

@AndWass How about also running the benchmark on your computer to confirm these benchmark tests are indeed showing improvements?

I'll try and run them tonight.

NobodyXu commented 3 years ago

It seems benchmark test iterator_for_each_dedup_flatten_filter_map, iterator_next_basic_loop, generator_chain_take_filter_map and pushgen_iter_chain_take_filter_map are showing improvements, not just chain_take_filter_map.

The first two are not using pushgen at all so shouldn't be impacted by the changes. The improvement percentage is also small, so more likely that there was some jitter during those benchmarks.

The other two benchmark the same operations using pushgen and the iterator adaptor of pushgen. So they are closely related.

Ah, sorry that I got them wrong.

AndWass commented 3 years ago

Ah, sorry that I got them wrong.

Nothing to be sorry about!

NobodyXu commented 3 years ago

BTW, I also did another benchmark for b949ebaace966a5f3417ccca3edc0e80a5a2bf32 which adds #[inline(always)] to associated functions of ErasedFnPointer:

NOTE that the I ran this benchmark after the previous one on GeneratorImprovement branch, so the result here isn't relative to main.

   Compiling pushgen v0.0.1 (/home/nobodyxu/Dev/pushgen)
    Finished bench [optimized] target(s) in 3m 04s
     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen-9dbcdc1345ab781d)

running 19 tests
test callback::tests::from_associated ... ignored
test callback::tests::from_associated_for_closure ... ignored
test callback::tests::from_free ... ignored
test generator_ext::tests::for_each_stopped ... ignored
test structs::chain::tests::basic_chain ... ignored
test structs::dedup::tests::dedup_all_duplicate ... ignored
test structs::dedup::tests::dedup_nonduplicate ... ignored
test structs::dedup::tests::dedup_some_duplicate ... ignored
test structs::dedup::tests::dedup_stopping_source ... ignored
test structs::flatten::tests::slice_flatten ... ignored
test structs::flatten::tests::stopping_generator ... ignored
test structs::flatten::tests::vector_flatten ... ignored
test structs::iterator::tests::fold ... ignored
test structs::iterator::tests::iter_over_slice ... ignored
test structs::take::tests::take ... ignored
test structs::take::tests::take_restart ... ignored
test structs::zip::tests::same_length ... ignored
test structs::zip::tests::shorter_left_side ... ignored
test structs::zip::tests::shorter_right_side ... ignored

test result: ok. 0 passed; 0 failed; 19 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_chain_take_filter_map-c2f1d7bc7957186f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_chain_take_filter_map
Benchmarking iterator_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.1524 s (2400 iterations)
Benchmarking iterator_for_each_chain_take_filter_map: Analyzing
iterator_for_each_chain_take_filter_map
                        time:   [2.1299 ms 2.1443 ms 2.1619 ms]
                        change: [-1.1988% -0.1180% +1.0000%] (p = 0.84 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_dedup_filter-0792b8997f8ad6ba)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_filter
Benchmarking iterator_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_filter: Collecting 100 samples in estimated 5.1628 s (66k iterations)
Benchmarking iterator_for_each_dedup_filter: Analyzing
iterator_for_each_dedup_filter
                        time:   [74.275 us 74.873 us 75.595 us]
                        change: [-5.6235% -3.8748% -2.4623%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_dedup_flatten_filter_map-02530f85fb28b946)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_dedup_flatten_filter_map
Benchmarking iterator_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.5704 s (15k iterations)
Benchmarking iterator_for_each_dedup_flatten_filter_map: Analyzing
iterator_for_each_dedup_flatten_filter_map
                        time:   [432.76 us 435.92 us 439.57 us]
                        change: [+0.0471% +1.0949% +2.1850%] (p = 0.04 < 0.05)
                        Change within noise threshold.
Found 7 outliers among 100 measurements (7.00%)
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_filter_map-23889c5657b80085)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_filter_map
Benchmarking iterator_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_filter_map: Collecting 100 samples in estimated 5.6405 s (35k iterations)
Benchmarking iterator_for_each_filter_map: Analyzing
iterator_for_each_filter_map
                        time:   [158.40 us 159.49 us 160.81 us]
                        change: [-2.0810% -1.0343% -0.0990%] (p = 0.04 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_flatten_dedup_filter_map-982b60bd65247325)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_flatten_dedup_filter_map
Benchmarking iterator_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 6.0156 s (10k iterations)
Benchmarking iterator_for_each_flatten_dedup_filter_map: Analyzing
iterator_for_each_flatten_dedup_filter_map
                        time:   [591.22 us 595.44 us 600.52 us]
                        change: [-0.8741% +0.0444% +0.9715%] (p = 0.93 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/for_each_transrangers_test6-ebafe03edf02d334)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_for_each_transrangers_test6
Benchmarking iterator_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_for_each_transrangers_test6: Collecting 100 samples in estimated 5.7434 s (20k iterations)
Benchmarking iterator_for_each_transrangers_test6: Analyzing
iterator_for_each_transrangers_test6
                        time:   [283.30 us 285.40 us 287.92 us]
                        change: [-0.8300% +0.3013% +1.5750%] (p = 0.65 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_basic_loop-37d9035efa073309)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_basic_loop
Benchmarking iterator_next_basic_loop: Warming up for 3.0000 s
Benchmarking iterator_next_basic_loop: Collecting 100 samples in estimated 5.0658 s (56k iterations)
Benchmarking iterator_next_basic_loop: Analyzing
iterator_next_basic_loop
                        time:   [90.813 us 91.433 us 92.212 us]
                        change: [+0.9357% +2.0819% +3.2069%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_chain_take_filter_map-f319c0ad5d149fc6)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_chain_take_filter_map
Benchmarking iterator_next_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_chain_take_filter_map: Collecting 100 samples in estimated 5.0712 s (2200 iterations)
Benchmarking iterator_next_chain_take_filter_map: Analyzing
iterator_next_chain_take_filter_map
                        time:   [2.2794 ms 2.2967 ms 2.3175 ms]
                        change: [-1.8310% -0.6786% +0.4489%] (p = 0.26 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  5 (5.00%) high mild
  5 (5.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_dedup_filter-d972ca417e800e75)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_filter
Benchmarking iterator_next_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_filter: Collecting 100 samples in estimated 5.0780 s (106k iterations)
Benchmarking iterator_next_dedup_filter: Analyzing
iterator_next_dedup_filter
                        time:   [47.163 us 47.527 us 47.966 us]
                        change: [-1.6487% +0.2363% +2.6709%] (p = 0.87 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  6 (6.00%) high mild
  5 (5.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_dedup_flatten_filter_map-b66194b56c578199)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_dedup_flatten_filter_map
Benchmarking iterator_next_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_dedup_flatten_filter_map: Collecting 100 samples in estimated 8.2807 s (10k iterations)
Benchmarking iterator_next_dedup_flatten_filter_map: Analyzing
iterator_next_dedup_flatten_filter_map
                        time:   [824.25 us 829.92 us 836.17 us]
                        change: [-3.1964% -2.3549% -1.5474%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  6 (6.00%) high mild
  2 (2.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_filter_map-d184a6e09748526e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_filter_map
Benchmarking iterator_next_filter_map: Warming up for 3.0000 s
Benchmarking iterator_next_filter_map: Collecting 100 samples in estimated 5.6743 s (15k iterations)
Benchmarking iterator_next_filter_map: Analyzing
iterator_next_filter_map
                        time:   [371.77 us 374.19 us 377.11 us]
                        change: [-1.3948% -0.2976% +0.7256%] (p = 0.59 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  5 (5.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_flatten_dedup_filter_map-3b82355d0e7308f8)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_flatten_dedup_filter_map
Benchmarking iterator_next_flatten_dedup_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 5.1s, enable flat sampling, or reduce sample count to 70.
Benchmarking iterator_next_flatten_dedup_filter_map: Collecting 100 samples in estimated 5.0779 s (5050 iterations)
Benchmarking iterator_next_flatten_dedup_filter_map: Analyzing
iterator_next_flatten_dedup_filter_map
                        time:   [999.23 us 1.0070 ms 1.0166 ms]
                        change: [-0.5148% +0.4892% +1.4748%] (p = 0.35 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/iter_next_transrangers_test6-aa5b656484c1d22f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_next_transrangers_test6
Benchmarking iterator_next_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_next_transrangers_test6: Collecting 100 samples in estimated 6.6861 s (10k iterations)
Benchmarking iterator_next_transrangers_test6: Analyzing
iterator_next_transrangers_test6
                        time:   [659.96 us 664.28 us 669.30 us]
                        change: [-1.0315% +0.0658% +1.3197%] (p = 0.92 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  3 (3.00%) high mild
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_chain_take_filter_map-d0156bcf4d3bfeef)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking generator_chain_take_filter_map
Benchmarking generator_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking generator_chain_take_filter_map: Collecting 100 samples in estimated 7.5446 s (10k iterations)
Benchmarking generator_chain_take_filter_map: Analyzing
generator_chain_take_filter_map
                        time:   [742.68 us 747.65 us 753.43 us]
                        change: [+15.287% +16.276% +17.305%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) high mild
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_dedup_filter-91859256e6e92e85)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_filter
Benchmarking pushgen_dedup_filter: Warming up for 3.0000 s
Benchmarking pushgen_dedup_filter: Collecting 100 samples in estimated 5.0660 s (247k iterations)
Benchmarking pushgen_dedup_filter: Analyzing
pushgen_dedup_filter    time:   [20.463 us 20.620 us 20.816 us]
                        change: [-1.7907% -0.6087% +0.6338%] (p = 0.34 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_dedup_flatten_filter_map-d78681cad649eb0f)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_dedup_flatten_filter_map
Benchmarking pushgen_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_dedup_flatten_filter_map: Collecting 100 samples in estimated 5.1006 s (20k iterations)
Benchmarking pushgen_dedup_flatten_filter_map: Analyzing
pushgen_dedup_flatten_filter_map
                        time:   [250.08 us 251.93 us 254.27 us]
                        change: [-50.976% -50.378% -49.703%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_filter_map-9ac271e2acbf21cd)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_filter_map
Benchmarking pushgen_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_filter_map: Collecting 100 samples in estimated 5.6106 s (35k iterations)
Benchmarking pushgen_filter_map: Analyzing
pushgen_filter_map      time:   [157.58 us 158.76 us 160.16 us]
                        change: [-2.2154% -1.1452% -0.0369%] (p = 0.05 < 0.05)
                        Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
  8 (8.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_flatten_dedup_filter_map-64ff7169b0b1e6da)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_flatten_dedup_filter_map
Benchmarking pushgen_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking pushgen_flatten_dedup_filter_map: Collecting 100 samples in estimated 6.0200 s (25k iterations)
Benchmarking pushgen_flatten_dedup_filter_map: Analyzing
pushgen_flatten_dedup_filter_map
                        time:   [237.16 us 238.80 us 240.80 us]
                        change: [-73.441% -73.118% -72.731%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) high mild
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_iter_basic_loop-ba604406bd167963)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_basic_loop
Benchmarking pushgen_iter_basic_loop: Warming up for 3.0000 s
Benchmarking pushgen_iter_basic_loop: Collecting 100 samples in estimated 5.4069 s (61k iterations)
Benchmarking pushgen_iter_basic_loop: Analyzing
pushgen_iter_basic_loop time:   [88.381 us 89.033 us 89.833 us]
                        change: [-94.090% -94.038% -93.987%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_iter_chain_take_filter_map-2c85753845747283)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_iter_chain_take_filter_map
Benchmarking pushgen_iter_chain_take_filter_map: Warming up for 3.0000 s

Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 7.8s, enable flat sampling, or reduce sample count to 50.
Benchmarking pushgen_iter_chain_take_filter_map: Collecting 100 samples in estimated 7.7925 s (5050 iterations)
Benchmarking pushgen_iter_chain_take_filter_map: Analyzing
pushgen_iter_chain_take_filter_map
                        time:   [1.5369 ms 1.5456 ms 1.5559 ms]
                        change: [+13.369% +14.945% +16.368%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) low mild
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/pushgen_transrangers_test6-beceb9a7f7f3aa7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking pushgen_transrangers_test6
Benchmarking pushgen_transrangers_test6: Warming up for 3.0000 s
Benchmarking pushgen_transrangers_test6: Collecting 100 samples in estimated 5.7539 s (20k iterations)
Benchmarking pushgen_transrangers_test6: Analyzing
pushgen_transrangers_test6
                        time:   [283.17 us 285.38 us 288.03 us]
                        change: [-62.310% -61.886% -61.430%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_chain_take_filter_map-dd6018e8ec5d4a7e)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_chain_take_filter_map
Benchmarking iterator_try_for_each_chain_take_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_chain_take_filter_map: Collecting 100 samples in estimated 5.0112 s (2300 iterations)
Benchmarking iterator_try_for_each_chain_take_filter_map: Analyzing
iterator_try_for_each_chain_take_filter_map
                        time:   [2.1670 ms 2.1834 ms 2.2033 ms]
                        change: [-1.3590% -0.1154% +1.1142%] (p = 0.86 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_dedup_filter-e3981107a8d0b5c7)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_filter
Benchmarking iterator_try_for_each_dedup_filter: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_filter: Collecting 100 samples in estimated 5.1109 s (121k iterations)
Benchmarking iterator_try_for_each_dedup_filter: Analyzing
iterator_try_for_each_dedup_filter
                        time:   [41.814 us 42.134 us 42.522 us]
                        change: [-0.9225% +0.0574% +1.0324%] (p = 0.91 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  2 (2.00%) high mild
  7 (7.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_dedup_flatten_filter_map-98eef37b8662f178)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_dedup_flatten_filter_map
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Collecting 100 samples in estimated 6.2983 s (10k iterations)
Benchmarking iterator_try_for_each_dedup_flatten_filter_map: Analyzing
iterator_try_for_each_dedup_flatten_filter_map
                        time:   [619.76 us 624.02 us 629.05 us]
                        change: [-0.7038% +0.1630% +0.9587%] (p = 0.71 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  1 (1.00%) high mild
  8 (8.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_filter_map-9dead610a7585c29)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_filter_map
Benchmarking iterator_try_for_each_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_filter_map: Collecting 100 samples in estimated 6.1309 s (10k iterations)
Benchmarking iterator_try_for_each_filter_map: Analyzing
iterator_try_for_each_filter_map
                        time:   [601.42 us 605.28 us 610.06 us]
                        change: [-0.9470% -0.0525% +0.8285%] (p = 0.91 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) high mild
  6 (6.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_flatten_dedup_filter_map-092f2984d109ffc4)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_flatten_dedup_filter_map
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Collecting 100 samples in estimated 9.4908 s (10k iterations)
Benchmarking iterator_try_for_each_flatten_dedup_filter_map: Analyzing
iterator_try_for_each_flatten_dedup_filter_map
                        time:   [935.91 us 940.68 us 946.20 us]
                        change: [-0.5845% +0.2973% +1.4541%] (p = 0.57 > 0.05)
                        No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
  2 (2.00%) low mild
  2 (2.00%) high mild
  9 (9.00%) high severe

     Running unittests (/home/nobodyxu/Dev/pushgen/target/release/deps/try_for_each_transrangers_test6-33f87431201c709c)
WARNING: HTML report generation will become a non-default optional feature in Criterion.rs 0.4.0.
This feature is being moved to cargo-criterion (https://github.com/bheisler/cargo-criterion) and will be optional in a future version of Criterion.rs. To silence this warning, either switch to cargo-criterion or enable the 'html_reports' feature in your Cargo.toml.

Gnuplot not found, using plotters backend
Benchmarking iterator_try_for_each_transrangers_test6
Benchmarking iterator_try_for_each_transrangers_test6: Warming up for 3.0000 s
Benchmarking iterator_try_for_each_transrangers_test6: Collecting 100 samples in estimated 7.1084 s (10k iterations)
Benchmarking iterator_try_for_each_transrangers_test6: Analyzing
iterator_try_for_each_transrangers_test6
                        time:   [699.31 us 704.44 us 710.48 us]
                        change: [-0.7978% +0.7563% +2.2267%] (p = 0.34 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe
NobodyXu commented 3 years ago

Seems like adding #[inline(always)] does dramatically affect

AndWass commented 3 years ago

Seems like adding #[inline(always)] does dramatically affect

  • pushgen_dedup_flatten_filter_map,
  • pushgen_filter_map,
  • pushgen_flatten_dedup_filter_map,
  • pushgen_iter_basic_loop,
  • pushgen_transrangers_test6

Just did a quick check on my cell phone but looks like it's pretty much the same as baseline pushgen I think?

NobodyXu commented 3 years ago

Yeah, the different is so small that it can be considered as jitter

NobodyXu commented 3 years ago

So if that is true, then the ErasedFnPointer with #[inline(always)] doesn't have regression in performance.

NobodyXu commented 3 years ago

And one of the advantage of this approach is that DynGenerator is removed and have less generic instantiation, so maybe faster compilation time.

AndWass commented 3 years ago

And one of the advantage of this approach is that DynGenerator is removed and have less generic instantiation, so maybe faster compilation time.

Yah that's clearly a benefit. It does make the API a bit more convoluted though.

NobodyXu commented 3 years ago

And one of the advantage of this approach is that DynGenerator is removed and have less generic instantiation, so maybe faster compilation time.

Yah that's clearly a benefit. It does make the API a bit more convoluted though.

Unfortunately, I didn't find a better way.

Though we can write a macro for it to makes it much easier.

NobodyXu commented 3 years ago

I was able to use a #[inline(always)] generic function run_gen to simplify the process instead of a macro.

68220ef871efba7d276a8b2eac38bfd975ca9f37

AndWass commented 3 years ago

I ran the benchmarks on my machine, I ran them for both stable, beta and nightly

main stable main beta main nightly erasefn stable erasedfn beta erasedfn nightly
filter_map 185 182 182 177 181 180
chain_take_filter_map 963 843 836 931 1145 1138
dedup_filter 25 25 25 24 25 24
flatten_dedup_filter_map 300 302 296 293 312 309
dedup_flatten_filter_map 315 314 312 307 310 310
transrangers_test6 365 362 362 356 369 370

Overall I would say they are pretty much the same, some minor differences but it could be jitter when running the benchmarks etc. Beta and nightly does regress noticably when running with the erased function though. Why that is I have no idea really but I guess it fails to optimize for some reason?

NobodyXu commented 3 years ago

IDK, feels like that could be a regression on the rustc side, or maybe the underlying llvm that rustc is using since it is the one doing all the optimization?

NobodyXu commented 3 years ago

BTW, Branch GeneratorImprovement in my fork is now frozen and any new development I make later will be in a separate branch.

NobodyXu commented 3 years ago

Sadly, I don’t have enough time for doing the continuation part, so I decided to instead, submit a PR on ErasedFnPointer first, which will help pushgen to have a stable trait API without the use of generics.

@AndWass What’s your thought on this?

AndWass commented 3 years ago

Only doing ErasedFnPointer doesn't really have a good risk-reward ratio at the moment IMO. The code isn't as straight-forward and the only reward ATM is that we get an object-safe trait. Since we also saw that there were regressions in beta (probably llvm/rustc regressions, but still) it skews the ratio even further.

I searched github for usages of dyn Iterator and it appears to not be used very often, which IMO is an indicator that it's not that much of a deal to have object safety.

NobodyXu commented 3 years ago

Right.

Maybe I shall have another attempt at continuation style Generator tomorrow, I might get it working with some explicit lifetime annotations.

NobodyXu commented 3 years ago

@AndWass It looks like it is really hard to get this done with existing language specification.

Even with lifetime satisfied, the presence of associated type Ret means that if to store a Generator, you would need to also specify the type of Ret had you specified Output.

I think this means that it would be extremely difficult to implement and would make the code too fragile, so I want to give up on this idea for now (unless there is support for impl Trait inside trait).

AndWass commented 3 years ago

Ok, nice of you to try! Let's close the issue for now then?

NobodyXu commented 3 years ago

Yep

NobodyXu commented 2 years ago

@AndWass Reopening this issue for GAT is closed to stabilisation.

It's likely to be stablised in 1.62, once it is there, we can restart the work to separate initialisation stage and the actual looping passes.

NobodyXu commented 1 year ago

GAT is now stablised, so I will retry this soon when I'm free.