To be honest, Pavel, your benchmark is not quite correct. Please, rewrite it using BlackHole
чт, 9 сент. 2021 г. в 10:28, Nikolay Izhikov <nizhi...@apache.org>: > +1 to ban Streams usage. > > > > > 9 сент. 2021 г., в 02:59, Valentin Kulichenko < > valentin.kuliche...@gmail.com> написал(а): > > > > Pavel, > > > > Quite frankly, I think we used to lean into performance too much. We > > generally preferred it over data consistency, project modularity and code > > readability. Performance, of course, plays a very important rule in > Ignite, > > but it's possible to overdo anything. > > > > There are certainly parts of the project that can benefit from features > > like Stream API, without significant concern over performance. CLI is an > > obvious example, but I'm sure it's not the only one. > > > > That said, I don't think that banning something is productive. At the > same > > time, we should make sure we pay more attention to performance during > > reviews. Maybe we should have a checklist of major things to look for? > Not > > as a set of strict rules, but more as a guideline for contributors and > > committers. > > > > We might also want to start benchmarking the code and tracking the > progress. > > > > -Val > > > > On Wed, Sep 8, 2021 at 12:09 PM Pavel Tupitsyn <ptupit...@apache.org> > wrote: > > > >> 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 > >>>> > >>> > >> > > -- Sincerely yours, Ivan Daschinskiy