Ah. Now it makes more sense. I completely abstracted away overflows (again,
not a scenario that would happen in practice in any case).

On Sat, Feb 22, 2020 at 3:54 AM Nigel Tao <nigel...@golang.org> wrote:

> On 2/22/20, Bruno Albuquerque <b...@gmail.com> wrote:
> > https://play.golang.org/p/P2JPI42YJa8
> >
> > ...
> >
> > So, in this simplified case, if the step divides the length evenly, then
> > there are no bound checks. If it does not, then bound checks are
> inserted.
> >
> > This seems to be an unnecessary check
>
> If the step (e.g. 3) does not divide the length evenly, then e.g. "i
> += 3" can overflow such that i becomes negative, even though the
> "len(a)" in the "i < len(a)" condition is a legitimate array or slice
> length: a non-negative int, less than or equal to INT_MAX.
>
> See:
> https://play.golang.org/p/QGNKOtw3m62
>
>  as the actual relevant thing is to
> > make sure that the index is not equal to or greater than the slice
> length.
> > Either that or I am missing something
> >
> > On Fri, Feb 21, 2020 at 10:24 AM Bruno Albuquerque <b...@gmail.com>
> wrote:
> >
> >> This is interesting. If I simplify the loop to something like this:
> >>
> >> nrgbaData := make([]byte, len(rgbData)+(len(rgbData)/3))
> >>
> >>         _ = nrgbaData[len(rgbData)]
> >>
> >>         for i := 0; i < len(rgbData); i++ {
> >>                 nrgbaData[i] = rgbData[i]
> >>         }
> >>
> >> then the bounds check at the line inside the for loop is removed.
> >>
> >> But if I change it to this:
> >>
> >> nrgbaData := make([]byte, len(rgbData)+(len(rgbData)/3))
> >>
> >>         _ = nrgbaData[len(rgbData)]
> >>
> >>         for i := 0; i < len(rgbData); i += 3 {
> >>                 nrgbaData[i] = rgbData[i]
> >>         }
> >>
> >> then the bounds check is not eliminated.
> >>
> >> Considering it is still guaranteed that "i" inside the loop will never
> be
> >> equal to or greater than len(rgbData), I do not understand why the
> bounds
> >> check is now required.
> >>
> >> Any ideas?
> >>
> >>
> >> On Fri, Feb 21, 2020 at 10:07 AM Bruno Albuquerque <b...@gmail.com>
> wrote:
> >>
> >>> Nope. Bound checks are still there. I am puzzled by this one.
> >>>
> >>>
> >>> On Fri, Feb 21, 2020 at 9:34 AM Sebastien Binet <bi...@cern.ch> wrote:
> >>>
> >>>>
> >>>>
> >>>> On Fri, Feb 21, 2020 at 5:36 PM Bruno Albuquerque <b...@gmail.com>
> >>>> wrote:
> >>>>
> >>>>> I wrote some simple code to convert a RGB24 image represented as a
> >>>>> []byte to a NRGBA image (also as a []byte), like so:
> >>>>>
> >>>>> https://play.golang.org/p/Y7ICg7t4_nd
> >>>>>
> >>>>> Unfortunately, the performance is lacking here and I am trying to
> >>>>> improve it. The first low hanging fruit seems to be taking advantage
> of
> >>>>> BCE:
> >>>>>
> >>>>> $go test -bench .
> >>>>> goos: linux
> >>>>> goarch: amd64
> >>>>> BenchmarkNRGBA-8       484   2636344 ns/op
> >>>>>
> >>>>> $ go test -gcflags="-B" -bench .
> >>>>> goos: linux
> >>>>> goarch: amd64
> >>>>> BenchmarkNRGBA-8       855   1654882 ns/op
> >>>>>
> >>>>> Unfortunately, I could not find an incantation that would remove the
> >>>>> bound checks. My naive attempt was to just do
> >>>>>
> >>>>> _ = nrgbaData[len(nrgbaData)-1]
> >>>>>
> >>>>> at around line 7 in the program above but this did not help and added
> >>>>> one extra bound check.
> >>>>>
> >>>>> Funny enough, if I do
> >>>>>
> >>>>> _ = nrgbaData[len(nrgbaData)]
> >>>>>
> >>>>> all the bound checks seem to be eliminated but, obviously, the
> program
> >>>>> panics at this line.
> >>>>>
> >>>> what about:
> >>>>    _ = nrgbaData[:len(nrgbaData)]
> >>>>
> >>>> does this also remove the bound checks?
> >>>>
> >>>> -s
> >>>>
> >>>
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "golang-nuts" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to golang-nuts+unsubscr...@googlegroups.com.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/golang-nuts/CAEd86Tw_1qLzK4HEw9rA06Wqnrtzs6CuzMT6VAK3Y40Bs7yPBw%40mail.gmail.com
> .
> >
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEd86TxsbiHJH%3DU1LowZP7zPUxETzyw50eNZqWo1nueC6eVQNQ%40mail.gmail.com.

Reply via email to