Alexander, Ivan,

> not very productive to assume that 100% of your code is
> on the hot path

That is exactly what we should be doing.
When I joined Ignite community 6 years ago, this was the prevalent mindset.

I'm not sure which part of Ignite can be considered "not on a hot path".
Create/alter table (mentioned above) should perform well too.

> measured first and only then optimized
> https://wiki.c2.com/?OptimizeLater

Extra allocations are a "death by a thousand cuts".
They add up here and there, and then there are GC pauses.
This would be hard to "optimize later".

It is common for perf-oriented projects to avoid some techniques.
For example, LINQ (streams analog from C# with similar perf issues) is
avoided in libraries and compilers [1].

[1] https://github.com/dotnet/roslyn/blob/main/CONTRIBUTING.md

On Wed, Sep 8, 2021 at 9:49 PM Valentin Kulichenko <
valentin.kuliche...@gmail.com> wrote:

> I don't think we should ban anything. Streams API is just a tool in the
> toolbox - it should be used appropriately. It's up to the contributor and
> reviewer(s) to identify whether a particular usage might cause performance
> issues.
>
> -Val
>
> On Wed, Sep 8, 2021 at 8:01 AM Alexander Polovtcev <
> alexpolovt...@gmail.com>
> wrote:
>
> > -1
> > I think that it is not very productive to assume that 100% of your code
> is
> > on the hot path, it would be impossible to write and maintain. Humans are
> > not very good at guessing where the performance bottlenecks are, so the
> > performance of the possible hot paths should be measured first and only
> > then optimized and documented.
> >
> > On Wed, Sep 8, 2021 at 5:53 PM Ivan Pavlukhin <vololo...@gmail.com>
> wrote:
> >
> > > Does not this trivial strategy work for us?
> > > https://wiki.c2.com/?OptimizeLater
> > >
> > > 2021-09-08 13:52 GMT+03:00, Andrey Gura <ag...@apache.org>:
> > > > Agree that any additional object creation on a hot path could be a
> > > > problem. So hot path should not contain stream API and any other
> > > > potentially problem code (e.g. iterator instead of for by index).
> > > >
> > > > On Wed, Sep 8, 2021 at 1:45 PM Pavel Tupitsyn <ptupit...@apache.org>
> > > wrote:
> > > >>
> > > >> Ok, maybe a total ban is overkill, but right now streams are used
> even
> > > on
> > > >> some hot paths like getAllAsync [1].
> > > >>
> > > >> Another issue is that Collectors.toList() and other variants don't
> > > accept
> > > >> capacity, and we end up with unnecessary reallocations of underlying
> > > >> arrays.
> > > >>
> > > >> [1]
> > > >>
> > >
> >
> https://github.com/apache/ignite-3/blob/1d7d703ff2b18234b15a9a7b03104fbb73388edf/modules/table/src/main/java/org/apache/ignite/internal/table/KVBinaryViewImpl.java#L83
> > > >>
> > > >> On Wed, Sep 8, 2021 at 1:06 PM Konstantin Orlov <
> kor...@gridgain.com>
> > > >> wrote:
> > > >>
> > > >> > Hi!
> > > >> >
> > > >> > Agree with Ivan that it’s an overkill. Code readability and
> > > >> > maintainability should have
> > > >> > the same priority as the performance (with some exceptions of
> > course).
> > > >> >
> > > >> > BTW the result of your benchmark looks quite strange. The
> > performance
> > > >> > penalty on
> > > >> > my laptop (Core i7 9750H, 6 cores up to 4.50 GHz) is 25%, not 8
> > times:
> > > >> >
> > > >> > Benchmark                         Mode  Cnt      Score     Error
> > > >> > Units
> > > >> > JmhIncrementBenchmark.loopSum    thrpt   10  32347.819 ± 676.548
> > > >> > ops/ms
> > > >> > JmhIncrementBenchmark.streamSum  thrpt   10  24459.196 ± 610.152
> > > >> > ops/ms
> > > >> >
> > > >> >
> > > >> > --
> > > >> > Regards,
> > > >> > Konstantin Orlov
> > > >> >
> > > >> >
> > > >> > > On 8 Sep 2021, at 12:23, Ivan Bessonov <bessonov...@gmail.com>
> > > wrote:
> > > >> > >
> > > >> > > Hello Igniters,
> > > >> > >
> > > >> > > I object, banning streams is an overkill. I would argue that
> most
> > of
> > > >> > > the
> > > >> > > code
> > > >> > > is not on hot paths and that allocations in TLAB don't create
> much
> > > >> > pressure
> > > >> > > on GC.
> > > >> > >
> > > >> > > Streams must be used cautiously, developers should know whether
> > they
> > > >> > > write hot methods or not. And if methods are not hot, code
> > > simplicity
> > > >> > must
> > > >> > > be
> > > >> > > the first priority. I don't want Ignite 3 code to look like
> > Ignite 2
> > > >> > code,
> > > >> > > where
> > > >> > > people would iterate over Lists using explicit access by
> indexes,
> > > >> > because it
> > > >> > > saves them a single Iterator allocation. That's absurd.
> > > >> > >
> > > >> > > ср, 8 сент. 2021 г. в 11:43, Pavel Tupitsyn <
> ptupit...@apache.org
> > >:
> > > >> > >
> > > >> > >> Igniters,
> > > >> > >>
> > > >> > >> Java streams are known to be slower and cause more GC pressure
> > than
> > > >> > >> an
> > > >> > >> equivalent loop.
> > > >> > >> Below is a simple filter/map/reduce scenario (code [1]):
> > > >> > >>
> > > >> > >> * Benchmark
> > >  Mode
> > > >> > Cnt
> > > >> > >>    Score     Error   Units
> > > >> > >>
> > > >> > >> * StreamVsLoopBenchmark.loopSum
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >> 7987.016 ± 293.013  ops/ms
> > > >> > >> * StreamVsLoopBenchmark.loopSum:·gc.alloc.rate
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >>   ≈ 10⁻⁴            MB/sec
> > > >> > >> * StreamVsLoopBenchmark.loopSum:·gc.count
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >>      ≈ 0            counts
> > > >> > >>
> > > >> > >> * StreamVsLoopBenchmark.streamSum
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >> 1060.244 ±  36.485  ops/ms
> > > >> > >> * StreamVsLoopBenchmark.streamSum:·gc.alloc.rate
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >>  315.819 ±  10.844  MB/sec
> > > >> > >> * StreamVsLoopBenchmark.streamSum:·gc.count
> > > >> > >> thrpt
> > > >> >   3
> > > >> > >>   55.000            counts
> > > >> > >>
> > > >> > >> Loop is several times faster and does not allocate at all.
> > > >> > >>
> > > >> > >> 1. Performance is one of the most important features of our
> > > product.
> > > >> > >> 2. Most of our APIs will be on the hot path.
> > > >> > >>
> > > >> > >> One can argue about performance differences in real-world
> > > scenarios,
> > > >> > >> but increasing GC pressure just to make the code a little bit
> > nicer
> > > >> > >> is
> > > >> > >> unacceptable.
> > > >> > >>
> > > >> > >> I propose to ban streams usage in the codebase (except for the
> > > >> > >> tests).
> > > >> > >>
> > > >> > >> Thoughts, objections?
> > > >> > >>
> > > >> > >> [1]
> > > >> > >>
> > https://gist.github.com/ptupitsyn/5934bbbf8f92ac4937e534af9386da97
> > > >> > >>
> > > >> > >
> > > >> > >
> > > >> > > --
> > > >> > > Sincerely yours,
> > > >> > > Ivan Bessonov
> > > >> >
> > > >> >
> > > >
> > >
> > >
> > > --
> > >
> > > Best regards,
> > > Ivan Pavlukhin
> > >
> >
> >
> > --
> > With regards,
> > Aleksandr Polovtcev
> >
>

Reply via email to