From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,f6f130eea077b8f8 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-05-21 14:18:14 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!colt.net!kibo.news.demon.net!news.demon.co.uk!demon!not-for-mail From: Simon Wright Newsgroups: comp.lang.ada Subject: Re: 'Write attribute vs Write procedure. Date: 21 May 2003 22:17:39 +0100 Organization: Pushface Sender: simon@smaug.pushface.org Message-ID: References: <7vk7ck7iwc.fsf@vlinux.voxelvision.no> NNTP-Posting-Host: pogner.demon.co.uk Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: news.demon.co.uk 1053551893 23084 62.49.19.209 (21 May 2003 21:18:13 GMT) X-Complaints-To: abuse@demon.net NNTP-Posting-Date: Wed, 21 May 2003 21:18:13 +0000 (UTC) User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.1 Xref: archiver1.google.com comp.lang.ada:37618 Date: 2003-05-21T22:17:39+01:00 List-Id: Ole-Hjalmar Kristensen writes: > tmoran@acm.org writes: > > > > Write (This.Link.all, > > > Buffer (1 .. Stream_element_offset (Chunk))); > > > Stream_element_array'Write (This.Link, > > > Buffer (1 .. Stream_element_offset (Chunk))); > > >... > > > the Write procedure is taking no noticeable amount of time/cpu. > > >In the contrary, the 'Write attribute takes like 3-4 seconds of 100% CPU > > Perhaps Gnat's 'Write is doing one 'Write(Stream_Element) call for > > each element of the Buffer, vs a single call for the whole thing in > > the procedure version? Since you've already got a Stream_Element_Array, > > perhaps you could call > > Ada.Streams.Write(Ada.Streams.Root_Stream_Type'class(This.Link), > > Buffer (1 .. Stream_element_offset (Chunk))); > > directly? > > Personally, I think using the default 'write is only reasonable > > in the very simplest cases. If something is big, or complicated, > > I'd write my own 'write for it. > > Yes, but that removes much of the attraction of using a stream in the > first place. It should only be necessary to do your own write if you > wanted another representation of it in the external format. A prime > example of rendering a very nice feature of the language pretty much > unusable because of a poor implementation. ARM 13.13.2(9) says [...] For composite types, the Write or Read attribute for each component is called in canonical order, which is last dimension varying fastest for an array, and positional aggregate order for a record. Bounds are not included in the stream if T is an array type. [...] I'm not sure whether an implementation has licence to produce code which works "as if" this happened. What about the exceptional cases? (where there isn't enough room in the stream for all the elements, for example).