Hi Qi, > For example, SingleInputGate is already creating Optional for every > BufferOrEvent in getNextBufferOrEvent(). How much performance gain would we > get if it’s replaced by null check?
When I was introducing it there, I have micro-benchmarked this change, and there was no visible throughput change in a pure network only micro benchmark (with whole Flink running around it any changes would be even less visible). Piotrek > On 5 Aug 2019, at 15:20, Till Rohrmann <trohrm...@apache.org> wrote: > > I'd be in favour of > > - Optional for method return values if not performance critical > - Optional can be used for internal methods if it makes sense > - No optional fields > > Cheers, > Till > > On Mon, Aug 5, 2019 at 12:07 PM Aljoscha Krettek <aljos...@apache.org> > wrote: > >> Hi, >> >> I’m also in favour of using Optional only for method return values. I >> could be persuaded to allow them for parameters of internal methods but I’m >> sceptical about that. >> >> Aljoscha >> >>> On 2. Aug 2019, at 15:35, Yu Li <car...@gmail.com> wrote: >>> >>> TL; DR: I second Timo that we should use Optional only as method return >>> type for non-performance critical code. >>> >>> From the example given on our AvroFactory [1] I also noticed that >> Jetbrains >>> marks the OptionalUsedAsFieldOrParameterType inspection as a warning. >> It's >>> relatively easy to understand why it's not suggested to use (java.util) >>> Optional as a field since it's not serializable. What made me feel >> curious >>> is that why we shouldn't use it as a parameter type, so I did some >>> investigation and here is what I found: >>> >>> There's a JB blog talking about java8 top tips [2] where we could find >> the >>> advice around Optional, there I found another blog telling about the >>> pragmatic approach of using Optional [3]. Reading further we could see >> the >>> reason why we shouldn't use Optional as parameter type, please allow me >> to >>> quote here: >>> >>> It is often the case that domain objects hang about in memory for a fair >>> while, as processing in the application occurs, making each optional >>> instance rather long-lived (tied to the lifetime of the domain object). >> By >>> contrast, the Optionalinstance returned from the getter is likely to be >>> very short-lived. The caller will call the getter, interpret the result, >>> and then move on. If you know anything about garbage collection you'll >> know >>> that the JVM handles these short-lived objects well. In addition, there >> is >>> more potential for hotspot to remove the costs of the Optional instance >>> when it is short lived. While it is easy to claim this is "premature >>> optimization", as engineers it is our responsibility to know the limits >> and >>> capabilities of the system we work with and to choose carefully the point >>> where it should be stressed. >>> >>> And there's another JB blog about code smell on Null [4], which I'd also >>> suggest to read(smile). >>> >>> [1] >>> >> https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 >>> [2] https://blog.jetbrains.com/idea/2016/07/java-8-top-tips/ >>> [3] >> https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html >>> [4] https://blog.jetbrains.com/idea/2017/08/code-smells-null/ >>> >>> Best Regards, >>> Yu >>> >>> >>> On Fri, 2 Aug 2019 at 14:54, JingsongLee <lzljs3620...@aliyun.com >> .invalid> >>> wrote: >>> >>>> Hi, >>>> First, Optional is just a wrapper, just like boxed value. So as long as >>>> it's >>>> not a field level operation, I think it is OK to performance. >>>> I think guava optional has a good summary to the uses. [1] >>>>> As a method return type, as an alternative to returning null to >> indicate >>>> that no value was available >>>>> To distinguish between "unknown" (for example, not present in a map) >>>> and "known to have no value" >>>>> To wrap nullable references for storage in a collection that does not >>>> support >>>> The latter two points seem reasonable, but they have few scenes. >>>> >>>> [1] >>>> >> https://github.com/google/guava/blob/master/guava/src/com/google/common/base/Optional.java >>>> >>>> Best, >>>> Jingsong Lee >>>> >>>> >>>> ------------------------------------------------------------------ >>>> From:Timo Walther <twal...@apache.org> >>>> Send Time:2019年8月2日(星期五) 14:12 >>>> To:dev <dev@flink.apache.org> >>>> Subject:Re: [DISCUSS][CODE STYLE] Usage of Java Optional >>>> >>>> Hi everyone, >>>> >>>> I would vote for using Optional only as method return type for >>>> non-performance critical code. Nothing more. No fields, no method >>>> parameters. Method parameters can be overloaded and internally a class >>>> can work with nulls and @Nullable. Optional is meant for API method >>>> return types and I think we should not abuse it and spam the code with >>>> `@SuppressWarnings("OptionalUsedAsFieldOrParameterType")`. >>>> >>>> Regards, >>>> >>>> Timo >>>> >>>> >>>> >>>> Am 02.08.19 um 11:08 schrieb Biao Liu: >>>>> Hi Jark & Zili, >>>>> >>>>> I thought it means "Optional should not be used for class fields". >>>> However >>>>> now I get a bit confused about the edited version. >>>>> >>>>> Anyway +1 to "Optional should not be used for class fields" >>>>> >>>>> Thanks, >>>>> Biao /'bɪ.aʊ/ >>>>> >>>>> >>>>> >>>>> On Fri, Aug 2, 2019 at 5:00 PM Zili Chen <wander4...@gmail.com> wrote: >>>>> >>>>>> Hi Jark, >>>>>> >>>>>> Follow your opinion, for class field, we can make >>>>>> use of @Nullable/@Nonnull annotation or Flink's >>>>>> SerializableOptional. It would be sufficient. >>>>>> >>>>>> Best, >>>>>> tison. >>>>>> >>>>>> >>>>>> Jark Wu <imj...@gmail.com> 于2019年8月2日周五 下午4:57写道: >>>>>> >>>>>>> Hi Andrey, >>>>>>> >>>>>>> I have some concern on point (3) "even class fields as e.g. optional >>>>>> config >>>>>>> options with implicit default values". >>>>>>> >>>>>>> Regarding to the Oracle's guide (4) "Optional should not be used for >>>>>> class >>>>>>> fields". >>>>>>> And IntelliJ IDEA also report warnings if a class field is Optional, >>>>>>> because Optional is not serializable. >>>>>>> >>>>>>> >>>>>>> Do we allow Optional as class field only if the class is not >>>> serializable >>>>>>> or forbid this totally? >>>>>>> >>>>>>> Thanks, >>>>>>> Jark >>>>>>> >>>>>>> On Fri, 2 Aug 2019 at 16:30, Biao Liu <mmyy1...@gmail.com> wrote: >>>>>>> >>>>>>>> Hi Andrey, >>>>>>>> >>>>>>>> Thanks for working on this. >>>>>>>> >>>>>>>> +1 it's clear and acceptable for me. >>>>>>>> >>>>>>>> To Qi, >>>>>>>> >>>>>>>> IMO the most performance critical codes are "per record" code path. >> We >>>>>>>> should definitely avoid Optional there. For your concern, it's "per >>>>>>> buffer" >>>>>>>> code path which seems to be acceptable with Optional. >>>>>>>> >>>>>>>> Just one more question, is there any other code paths which are also >>>>>>>> critical? I think we'd better note that clearly. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Biao /'bɪ.aʊ/ >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Fri, Aug 2, 2019 at 11:08 AM qi luo <luoqi...@gmail.com> wrote: >>>>>>>> >>>>>>>>> Agree that using Optional will improve code robustness. However >> we’re >>>>>>>>> hesitating to use Optional in data intensive operations. >>>>>>>>> >>>>>>>>> For example, SingleInputGate is already creating Optional for every >>>>>>>>> BufferOrEvent in getNextBufferOrEvent(). How much performance gain >>>>>>> would >>>>>>>> we >>>>>>>>> get if it’s replaced by null check? >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Qi >>>>>>>>> >>>>>>>>>> On Aug 1, 2019, at 11:00 PM, Andrey Zagrebin < >> and...@ververica.com >>>>>>>>> wrote: >>>>>>>>>> Hi all, >>>>>>>>>> >>>>>>>>>> This is the next follow up discussion about suggestions for the >>>>>>> recent >>>>>>>>>> thread about code style guide in Flink [1]. >>>>>>>>>> >>>>>>>>>> In general, one could argue that any variable, which is nullable, >>>>>> can >>>>>>>> be >>>>>>>>>> replaced by wrapping it with Optional to explicitly show that it >>>>>> can >>>>>>> be >>>>>>>>>> null. Examples are: >>>>>>>>>> >>>>>>>>>> - returned values to force user to check not null >>>>>>>>>> - optional function arguments, e.g. with implicit default values >>>>>>>>>> - even class fields as e.g. optional config options with >> implicit >>>>>>>>>> default values >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> At the same time, we also have @Nullable annotation to express >> this >>>>>>>>>> intention. >>>>>>>>>> >>>>>>>>>> Also, when the class Optional was introduced, Oracle posted a >>>>>>> guideline >>>>>>>>>> about its usage [2]. Basically, it suggests to use it mostly in >>>>>> APIs >>>>>>>> for >>>>>>>>>> returned values to inform and force users to check the returned >>>>>> value >>>>>>>>>> instead of returning null and avoid NullPointerException. >>>>>>>>>> >>>>>>>>>> Wrapping with Optional also comes with the performance overhead. >>>>>>>>>> >>>>>>>>>> Following the Oracle's guide in general, the suggestion is: >>>>>>>>>> >>>>>>>>>> - Avoid using Optional in any performance critical code >>>>>>>>>> - Use Optional only to return nullable values in the API/public >>>>>>>> methods >>>>>>>>>> unless it is performance critical then rather use @Nullable >>>>>>>>>> - Passing an Optional argument to a method can be allowed if it >>>>>> is >>>>>>>>>> within a private helper method and simplifies the code, example >>>>>> is >>>>>>> in >>>>>>>>> [3] >>>>>>>>>> - Optional should not be used for class fields >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Please, feel free to share you thoughts. >>>>>>>>>> >>>>>>>>>> Best, >>>>>>>>>> Andrey >>>>>>>>>> >>>>>>>>>> [1] >>>>>>>>>> >>>>>> >>>> >> http://mail-archives.apache.org/mod_mbox/flink-dev/201906.mbox/%3ced91df4b-7cab-4547-a430-85bc710fd...@apache.org%3E >>>>>>>>>> [2] >>>>>>>>>> >>>>>> >>>> >> https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html >>>>>>>>>> [3] >>>>>>>>>> >>>>>> >>>> >> https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 >>>>>>>>> >>>> >>>> >>>> >> >>