From: Gautier write-only <gautier_niouzes@hotmail.com>
Subject: Performance of the Streams 'Read and 'Write
Date: Thu, 29 Oct 2009 16:29:47 -0700 (PDT)
Date: 2009-10-29T16:29:47-07:00 [thread overview]
Message-ID: <e93ea909-9b8e-44c6-a537-fd68ed47cbc4@z41g2000yqz.googlegroups.com> (raw)
Hello.
I got used to think that I/O was the last spot where our preferred
language was condemned to slowness.
Now consider this. Variant 1 of a buffered I/O:
type Buffer is array(Natural range <>) of Unsigned_8;
procedure Read( b: out Buffer ) is
begin
Buffer'Read(Stream(f_in), b);
exception
when Ada.Streams.Stream_IO.End_Error =>
null;
-- Nothing bad, just some garbage in the buffer
-- after end of compressed code
end Read;
procedure Write( b: in Buffer ) is
begin
Buffer'Write(Stream(f_out), b);
end Write;
Bad luck, it is as slow as doing I/O's with single bytes and
Sequential_IO! But if it is slow by receiving/sending a whole buffer,
how to make it faster ? Now someone (in a slightly different context)
came with this (call it variant 2):
procedure Read( b: out Buffer ) is
use Ada.Streams;
First : constant Stream_Element_Offset:= Stream_Element_Offset
(b'First);
Last : Stream_Element_Offset:= Stream_Element_Offset
(b'Last);
SE_Buffer : Stream_Element_Array (First..Last);
begin
Read(Stream(f_in).all, SE_Buffer, Last);
for i in First..Last loop
b(Natural(i)):= Unsigned_8(SE_Buffer(i));
end loop;
end Read;
procedure Write( b: in Buffer ) is
use Ada.Streams;
First : constant Stream_Element_Offset:= Stream_Element_Offset
(b'First);
Last : constant Stream_Element_Offset:= Stream_Element_Offset
(b'Last);
SE_Buffer : Stream_Element_Array (First..Last);
begin
for i in SE_Buffer'Range loop
SE_Buffer(i):= Stream_Element(b(Natural(i)));
end loop;
Write(Stream(f_out).all, SE_Buffer);
end Write;
Naively, you would say it is even slower: you do even more by copying
a buffer into another one, right ?
Indeed, not at all, it is *lots* faster (on GNAT and ObjectAda)!
To give an idea, the variant 1 applied to a bzip2 decompressor makes
it 4x slower than the C version, and variant 2 makes it only 7%
slower! With only I/O (like copying a file) you would get an even much
larger difference.
Now, it raises some questions:
Is there maybe a reason in the RM why the 'Read and 'Write have to be
that slow ?
Or are these two compilers lazy when compiling these attributes ?
Should I bug Adacore about that, then ?
Do some other compilers do it better ?
_________________________________________________________
Gautier's Ada programming -- http://sf.net/users/gdemont/
NB: For a direct answer, e-mail address on the Web site!
next reply other threads:[~2009-10-29 23:29 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-29 23:29 Gautier write-only [this message]
2009-10-30 0:39 ` Performance of the Streams 'Read and 'Write Jeffrey R. Carter
2009-10-30 8:58 ` Gautier write-only
2009-10-30 19:12 ` Jeffrey R. Carter
2009-10-31 23:46 ` Gautier write-only
2009-11-01 21:38 ` Gautier write-only
2009-11-02 21:32 ` Randy Brukardt
2009-10-30 3:36 ` Georg Bauhaus
2009-10-30 9:13 ` Gautier write-only
2009-11-02 21:37 ` Randy Brukardt
2009-11-02 22:16 ` Gautier write-only
2009-10-30 13:40 ` Gautier write-only
2009-11-02 22:19 ` Gautier write-only
2009-11-17 12:57 ` Gautier write-only
2009-11-17 13:26 ` Ludovic Brenta
2009-11-17 20:19 ` Building GNAT on Windows (Was: Re: Performance of the Streams 'Read and 'Write) Tero Koskinen
2009-11-18 10:55 ` Gautier write-only
2009-11-26 13:23 ` Performance of the Streams 'Read and 'Write Gautier write-only
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox