comp.lang.ada
 help / color / mirror / Atom feed
From: tmoran@acm.org
Subject: Re: How to speed up stream & record handling?
Date: Fri, 22 Feb 2002 20:25:50 GMT
Date: 2002-02-22T20:25:50+00:00	[thread overview]
Message-ID: <iPxd8.4817$SY5.2186811617@newssvr21.news.prodigy.com> (raw)
In-Reply-To: e7ebd224.0202220531.3755e013@posting.google.com

>How do I avoid calling 'Unsigned_8'Read' 200 times per packet while still
>using streams?
  Go up a level.  Define your own My_Record'Read.  I made an "is new
Ada.Streams.Root_Stream_Type" (see below) and changed the code to:

   procedure My_Record_Read
     (Stream : access Ada.Streams.Root_Stream_Type'Class;
      Item   : out     My_Record) is
      use type Ada.Streams.Stream_Element_Offset;
      The_Data_Bytes : Ada.Streams.Stream_Element_Array (1 .. Data_Array'size/Unsigned_8'Size);
      for The_Data_Bytes'Address use Item.A'Address;
      Last : Ada.Streams.Stream_Element_Offset;
   begin
     Not_Slow.Read(Not_Slow.My_File_Type(Stream.all), The_Data_Bytes, Last);
     if Last /= The_Data_Bytes'last then
       null; -- what to do?
     end if;
     B_And_C'Read(Stream, Item.BC);
   end My_Record_Read;

   My_File : aliased Not_Slow.My_File_Type;
  ...
  Not_Slow.Open(My_File,
      Mode => Ada.Streams.Stream_IO.In_File,
      Name => "r:big");

  for I in 1 .. 100000 loop
      My_Record'Read (My_File'access, Item);
  end loop;

  Not_Slow.Close(My_File);

and it ran in 0.22 seconds.  (Gnat 3.14p, -O2)
Of course the fixed record size makes Sequential_IO still a faster option.

with Ada.Streams,
     Ada.Streams.Stream_IO;
package Not_Slow is

  type My_File_Type is new Ada.Streams.Root_Stream_Type with private;

  procedure Open(Stream : in out My_File_Type;
                 Mode   : in Ada.Streams.Stream_IO.File_Mode;
                 Name   : in String;
                 Form   : in String := "");

  procedure Close(Stream : in out My_File_Type);

  procedure Read(
    Stream : in out My_File_Type;
    Item   :    out Ada.Streams.Stream_Element_Array;
    Last   :    out Ada.Streams.Stream_Element_Offset);

  procedure Write(
    Stream : in out My_File_Type;
    Item   : in     Ada.Streams.Stream_Element_Array);

private

  type My_File_Type is new Ada.Streams.Root_Stream_Type with record
    The_File : Ada.Streams.Stream_IO.File_Type;
  end record;

end Not_Slow;

package body Not_Slow is

  procedure Open(Stream : in out My_File_Type;
                 Mode   : in Ada.Streams.Stream_IO.File_Mode;
                 Name   : in String;
                 Form   : in String := "") is
  begin
    Ada.Streams.Stream_IO.Open(Stream.The_File, Mode, Name, Form);
  end Open;

  procedure Close(Stream : in out My_File_Type) is
  begin
    Ada.Streams.Stream_IO.Close(Stream.The_File);
  end Close;

  procedure Read(
    Stream : in out My_File_Type;
    Item   :    out Ada.Streams.Stream_Element_Array;
    Last   :    out Ada.Streams.Stream_Element_Offset) is
  begin
    Ada.Streams.Stream_IO.Read(Stream.The_File, Item, Last);
  end Read;

  procedure Write(
    Stream : in out My_File_Type;
    Item   : in     Ada.Streams.Stream_Element_Array) is
  begin
    Ada.Streams.Stream_IO.Write(Stream.The_File, Item);
  end Write;

end Not_Slow;



  reply	other threads:[~2002-02-22 20:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-02-21 12:37 How to speed up stream & record handling? Karl Ran
2002-02-21 14:17 ` Martin Dowie
2002-02-21 17:34 ` Jeffrey Carter
2002-02-21 20:25 ` Florian Weimer
2002-02-21 23:59   ` tmoran
2002-02-22 13:31     ` Karl Ran
2002-02-22 20:25       ` tmoran [this message]
2002-02-24  3:23 ` Nick Roberts
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox