comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada bench : count words
Date: Tue, 22 Mar 2005 14:08:04 +0100
Date: 2005-03-22T14:08:02+01:00	[thread overview]
Message-ID: <460oxs2p0hbc.yjqxjeasx37r.dlg@40tude.net> (raw)
In-Reply-To: mailman.49.1111495687.23655.comp.lang.ada@ada-france.org

On Tue, 22 Mar 2005 12:47:51 +0000, Marius Amado Alves wrote:

>>>> Is Text_IO that bad?
>>>
>>> No, if you can solve The Get_Line puzzle :-)
>>
>> What about Get (Item : out Character)?
> 
> I tried and was too slow. Anyway I think I cracked the Get_Line puzzle 
> (review welcome). So now it reads from standard input as required. But 
> it's still 3 to 4 times slower than the C version.
> 
> -- Count words in Ada for the language shootout
> -- by Marius Amado Alves
> 
> with Ada.Characters.Handling;
> with Ada.Characters.Latin_1;
> with Ada.Text_IO;
> 
> procedure Count_Words is
> 
>     use Ada.Characters.Handling;
>     use Ada.Characters.Latin_1;
>     use Ada.Text_IO;
> 
>     Buffer : String (1 .. 4096);
>     Lines : Natural := 0;
>     Words : Natural := 0;
>     Total : Natural := 0;
>     In_Word : Boolean := False;
>     N : Natural;
> 
>     function Is_Separator (C : Character) return Boolean is
>     begin
>        return Is_Control (C) or C = ' ';
>     end;
> 
>     procedure Begin_Word is
>     begin
>        In_Word := True;
>     end;
> 
>     procedure End_Word is
>     begin
>        if In_Word then
>           Words := Words + 1;
>           In_Word := False;
>        end if;
>     end;
> 
>     procedure End_Line is
>     begin
>        Lines := Lines + 1;
>        Total := Total + 1;
>        End_Word;
>     end;
> 
>     procedure Count_Words (S : in String) is
>     begin
>        Total := Total + S'Length;
>        for I in S'Range loop
>           if Is_Separator (S (I)) then
>              if In_Word then End_Word; end if;
>           else
>              if not In_Word then Begin_Word; end if;
>           end if;
>        end loop;
>     end;
> 
> begin
>     while not End_Of_File loop

Replace End_Of_File with End_Error handling.

>        Get_Line (Buffer, N);

Get_Line does one extra line scan. So it will be inherently slower. Then it
would not take any advantage of having Buffer if lines are shorter than 4K.
Once Count_Words is inlined the buffer size does not matter.

BTW, you can safely declare Buffer either 1 or 1G bytes, because hidden
buffering happens anyway in Text_IO. (You only save calls to Get_Line.) Who
knows how large are buffers there? This probably disqualifies Text_IO, as
well as C's getc! It should be raw "read".

>        Count_Words (Buffer (1 .. N));

Wouldn't it count buffer ends as word separators for lines longer than 4K?

>        if N < Buffer'Length then
>           End_Line;
>        end if;
>     end loop;
> 
>     Ada.Text_IO.Put_Line
>       (Natural'Image (Lines) &
>        Natural'Image (Words) &
>        Natural'Image (Total));
> end;

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2005-03-22 13:08 UTC|newest]

Thread overview: 122+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-19 16:22 Ada bench Pascal Obry
2005-03-19 16:55 ` Dr. Adrian Wrigley
2005-03-19 21:32   ` Michael Bode
2005-03-20  9:20     ` Pascal Obry
2005-03-20  9:39       ` Michael Bode
2005-03-20 11:16         ` Pascal Obry
2005-03-20 12:20           ` Dmitry A. Kazakov
2005-03-20 12:32             ` Pascal Obry
2005-03-21  1:42             ` (see below)
2005-03-21  2:24               ` (see below)
2005-03-21 15:00                 ` (see below)
2005-03-21  3:54               ` Ed Falis
2005-03-21 12:20                 ` Jeff C
2005-03-21 15:18                 ` (see below)
2005-03-21 15:24                   ` (see below)
2005-03-21 18:56                   ` Isaac Gouy
2005-03-21 21:31                 ` Randy Brukardt
2005-03-21 22:14                   ` Ed Falis
2005-03-21 18:07               ` Pascal Obry
2005-03-20 10:11       ` Adrian Knoth
2005-03-20 10:30         ` Michael Bode
2005-03-21 23:27       ` Georg Bauhaus
2005-03-22  1:16         ` Ada bench : count words Marius Amado Alves
2005-03-22 10:59           ` Dmitry A. Kazakov
2005-03-22 11:57             ` Marius Amado Alves
2005-03-22 12:17               ` Dmitry A. Kazakov
2005-03-22 12:47                 ` Marius Amado Alves
2005-03-22 13:08                   ` Dmitry A. Kazakov [this message]
2005-03-22 13:28                     ` Marius Amado Alves
2005-03-22 16:48                     ` Marius Amado Alves
2005-03-22 17:34                       ` Dmitry A. Kazakov
2005-03-27 20:14                         ` jtg
2005-03-27 21:22                           ` Dmitry A. Kazakov
2005-03-28 19:54                             ` jtg
2005-03-28 20:56                               ` Dmitry A. Kazakov
2005-03-29 12:40                                 ` jtg
2005-03-29 13:00                                   ` [OT] " Tapio Kelloniemi
2005-03-29 13:47                                     ` Dmitry A. Kazakov
2005-03-29 15:53                                       ` Tapio Kelloniemi
2005-03-29 16:17                                         ` Dmitry A. Kazakov
     [not found]                                         ` <k33j419lgei1ui89s26o1dlr9ccf1qe1hd@4ax.com>
2005-04-11 23:04                                           ` Marius Amado Alves
2005-03-29 13:47                                   ` Dmitry A. Kazakov
2005-04-01 20:58                                   ` Georg Bauhaus
2005-04-01 20:18                                     ` Pascal Obry
2005-03-22 12:53                 ` Marius Amado Alves
     [not found]                 ` <f205219321dd18dba878fab16b7cb50d@netcabo.pt>
2005-03-22 13:12                   ` Marius Amado Alves
2005-03-23 16:58                     ` Isaac Gouy
2005-03-22 13:58                 ` Robert A Duff
2005-03-22 16:30                   ` Marius Amado Alves
2005-03-22 16:41                     ` Tapio Kelloniemi
2005-03-22 17:39                       ` Marius Amado Alves
2005-03-22 18:59                         ` Dmitry A. Kazakov
2005-03-22 19:08                         ` Tapio Kelloniemi
2005-03-22 18:34                     ` Georg Bauhaus
2005-03-22 19:32                     ` Robert A Duff
2005-03-22 20:04                       ` tmoran
2005-03-23 16:55                       ` Isaac Gouy
     [not found]                   ` <1820eab50b57f2fe1c4e8e50bb0f4fe5@netcabo.pt>
2005-03-22 22:49                     ` Stephen Leake
2005-03-22 22:58                       ` Robert A Duff
2005-03-22 23:27                   ` Larry Kilgallen
2005-03-23 22:33                     ` Robert A Duff
2005-03-24  5:02                     ` Larry Kilgallen
     [not found]                     ` <wccpsxqro0c.fsfOrganization: LJK Software <bM40pHW6P2KW@eisner.encompasserve.org>
2005-03-25  1:34                       ` Robert A Duff
2005-03-22 12:22             ` Jeff C
2005-03-23 16:48               ` Isaac Gouy
2005-03-23 17:06             ` Isaac Gouy
2005-03-22 19:49           ` tmoran
2005-03-22 21:51             ` Dmitry A. Kazakov
2005-03-23  0:16               ` tmoran
2005-03-23  7:25                 ` Dmitry A. Kazakov
2005-03-22 22:33             ` Marius Amado Alves
     [not found]             ` <00b362390273e6c04844dd4ff1885ee0@netcabo.pt>
2005-03-23 15:09               ` Marius Amado Alves
2005-03-23 19:00                 ` tmoran
2005-03-23 19:30                   ` tmoran
2005-03-23 21:38                     ` tmoran
2005-03-25  7:30                       ` Simon Wright
2005-03-25  9:38                         ` tmoran
2005-03-25 16:20                           ` Tapio Kelloniemi
2005-03-25 22:18                             ` Ada:The High Performance Language for Hyperthreaded and Multicore CPUs; was " tmoran
2005-03-23 19:54                   ` Tapio Kelloniemi
2005-03-23 20:39                     ` Ada bench : word frequency Marius Amado Alves
2005-03-23 21:26                       ` Isaac Gouy
2005-03-24  1:24                         ` Marius Amado Alves
2005-03-24 17:23                           ` Isaac Gouy
2005-03-24 19:52                           ` Martin Dowie
2005-04-11 15:11                             ` Marius Amado Alves
2005-03-24 20:16                           ` Pascal Obry
2005-03-24 22:54                             ` tmoran
2005-04-11 15:38                               ` Marius Amado Alves
2005-03-24 21:18                           ` Gautier Write-only
2005-04-11 15:32                             ` Marius Amado Alves
2005-04-11 23:56                               ` Robert A Duff
2005-04-28  4:04                       ` Matthew Heaney
2005-04-28 20:40                         ` Matthew Heaney
2005-03-23 21:38                     ` Ada bench : count words tmoran
2005-03-24 20:19                   ` tmoran
2005-03-24 21:00                     ` Pascal Obry
2005-03-24 22:54                       ` tmoran
2005-03-30 16:08                 ` Andre
2005-03-30 16:36                   ` Pascal Obry
2005-03-22 22:27           ` Dmitry A. Kazakov
2005-03-23  7:46             ` Pascal Obry
2005-03-23  7:56               ` Dmitry A. Kazakov
2005-03-23 13:38                 ` Robert A Duff
2005-03-22  7:05         ` Ada bench Pascal Obry
2005-04-07 20:59   ` David Sauvage
2005-04-07 23:40     ` David Sauvage
2005-04-08 17:11     ` Pascal Obry
2005-04-08 17:39       ` tmoran
2005-04-08 18:49       ` David Sauvage
2005-04-18 19:14       ` David Sauvage
2005-04-19 16:43         ` Matthew Heaney
2005-04-19 23:22           ` David Sauvage
2005-04-20  0:49             ` Matthew Heaney
2005-04-20  4:22               ` Georg Bauhaus
2005-04-20 21:24               ` David Sauvage
2005-04-20 23:06                 ` Georg Bauhaus
2005-04-20  9:41             ` Pascal Obry
2005-04-20 11:44               ` Matthew Heaney
2005-04-20 14:47                 ` Pascal Obry
2005-04-20 19:26                   ` Georg Bauhaus
2005-04-20 19:34                     ` Pascal Obry
replies disabled

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