From: tmoran@acm.org
Subject: Re: Ada bench : count words
Date: Wed, 23 Mar 2005 15:38:56 -0600
Date: 2005-03-23T15:38:56-06:00 [thread overview]
Message-ID: <qN-dnfoY3u5tfNzfRVn-2Q@comcast.com> (raw)
In-Reply-To: hrudncctb7ZxXtzfRVn-gA@comcast.com
Here's a simple multitasking conversion. I would appreciate it if someone
with a dual core or hyperthreaded CPU tried it out. Probably increasing
the buffer size, by lessening task interactions, would speed it up. With
multiple CPUs, the array
Counter : array(1 .. 2) of Counters;
might be increased to more tasks, also.
with Ada.Calendar,
Ada.Streams,
Ada.Streams.Stream_IO,
Ada.Text_IO,
Ada.Text_IO.Text_Streams;
procedure Cwt is
use Ada.Streams;
use type Ada.Calendar.Time;
T0 : Ada.Calendar.Time := Ada.Calendar.Clock; -- start timing
T1 : Ada.Calendar.Time;
subtype Buffer_Type is Stream_Element_Array(1 .. 4096);
LF : constant Stream_Element := Character'pos(Ascii.LF);
Is_Whitespace : constant array(Stream_Element) of Boolean
:= (Character'pos(Ascii.LF) | Character'pos(Ascii.HT)
| Character'pos(' ') => True, others => False);
-- "Counters" tasks run independently, asking Data_Source for buffer loads
-- and tallying word and line counts. When done, they wait for their
-- (partial) counts to be harvested, then terminate.
task type Counters is
entry Harvest(Line_Count, Word_Count : out Natural);
end Counters;
-- Data_Source is the IO task, supplying data as requested to Counters.
-- Note that Data_Source counts the whitespace->non-white transitions
-- at the ends of buffers. Counters' partial counts are added to that.
-- Data_Source also counts the Total number of characters.
task Data_Source is
entry Get(Buffer : out Buffer_Type;
Last : out Stream_Element_Offset);
end Data_Source;
task body Counters is
Buffer : Buffer_Type;
Last : Stream_Element_Offset;
Lines, Words, Total : Natural := 0;
In_Whitespace : Boolean;
begin
loop
Data_Source.Get(Buffer, Last);
exit when Last = 0;
In_Whitespace := Is_Whitespace(Buffer(1));
for I in 1 .. Last loop
if Is_Whitespace(Buffer(I)) then
if Buffer(I) = LF then
Lines := Lines + 1;
end if;
In_Whitespace := True;
elsif In_Whitespace then
In_Whitespace := False;
Words := Words + 1;
end if;
end loop;
exit when Last < Buffer'last;
end loop;
accept Harvest(Line_Count, Word_Count : out Natural) do
Line_Count := Lines;
Word_Count := Words;
end;
end Counters;
Lines, Words, Total : Natural := 0;
task body Data_Source is
Stream : Ada.Text_IO.Text_Streams.Stream_Access;
At_End : Boolean := False;
In_Whitespace : Boolean := True; -- we must count at edges of buffer loads
begin
Stream := Ada.Text_IO.Text_Streams.Stream(Ada.Text_IO.Current_Input);
loop
select
accept Get(Buffer : out Buffer_Type;
Last : out Stream_Element_Offset) do
if At_End then Last := 0;
else
Ada.Streams.Read(Ada.Streams.Root_Stream_Type'Class(Stream.all),
Buffer, Last);
Total := Total+Integer(Last);
if Last > 0 then
if In_Whitespace and not Is_Whitespace(Buffer(1)) then
Words := Words+1;
end if;
In_Whitespace := Is_Whitespace(Buffer(Last));
end if;
if Last < Buffer'last then At_End := True;end if;
end if;
end;
or terminate;
end select;
end loop;
end Data_Source;
A_Line_Count, A_Word_Count : Natural := 0;
Counter : array(1 .. 2) of Counters;
begin
for i in Counter'range loop
Counter(i).Harvest(A_Line_Count, A_Word_Count);
Lines := Lines+A_Line_Count;
Words := Words+A_Word_Count;
end loop;
T1 := Ada.Calendar.Clock;
Ada.Text_IO.Put_Line(Natural'Image(Lines)
& Natural'Image(Words)
& Natural'Image(Total));
Ada.Text_IO.Put_Line("took" & Duration'Image(T1 - T0));
end Cwt;
next prev parent reply other threads:[~2005-03-23 21:38 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
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 [this message]
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