[m-dev.] diff: io.nu.nl performance fix
Tyson Richard DOWD
trd at students.cs.mu.oz.au
Sat Sep 27 12:14:27 AEST 1997
Fergus Henderson wrote:
> Hi,
>
> Could one of those people concerned about adherence to procedure
> please review this change?
>
> library/io.nu.nl:
> Fix a performance problem introduced in a recent change:
> go back to passing around I/O states rather than using assert
> and retract.
Apart from the quibble noted below, this change is fine.
>
> -:- dynamic io__save_user_globals/1.
> -:- dynamic io__save_stream_names/1.
> -:- dynamic io__save_putback/1.
> +% Note: in C, the io__state is all represented as global variables.
> +% But for Prolog, using assert/retract for global variables was
> +% found to be much too slow. So we do actually pass around an io__state.
"in C" is not quite right - perhaps "in Mercury" or "in the C Mercury
runtime model" or something like that.
> +
> +:- type io__state
> + ---> io__state(
> + io__stream_names, % map from stream to stream name
> + io__stream_putback, % map from input stream to
> + % list of putback characters
> + univ, % for use by the application
> + io__external_state
> + ).
>
> :- pred main(list(atom)).
> :- mode main(in) is det.
> @@ -131,7 +140,8 @@
> ),
> assert(io__save_exit_status(0)).
>
> -:- pred io__gc_init(io__state::di, io__state::uo) is det.
> +:- pred io__gc_init(io__state, io__state).
> +:- mode io__gc_init(di, uo) is det.
> io__gc_init --> [].
>
> :- pred atoms_to_strings(list(atom), list(string)).
> @@ -258,7 +268,7 @@
> % input predicates
>
> io__read_char_code(Stream, Code, IO_0, IO) :-
> - io__save_putback(PutBack0),
> + IO_0 = io__state(A, PutBack0, C, D),
> (
> map__search(PutBack0, Stream, PutBackChars),
> PutBackChars = [Char | Chars]
> @@ -268,24 +278,22 @@
> ;
> map__det_update(PutBack0, Stream, Chars, PutBack)
> ),
> - retractall(io__save_putback(_)),
> - assert(io__save_putback(PutBack)),
> + IO = io__state(A, PutBack, C, D),
> char__to_int(Char, Code)
> ;
> - get0(Stream, Code)
> - ),
> - IO = IO_0.
> + get0(Stream, Code),
> + IO = IO_0
> + ).
> + %%% io__update_state.
>
> io__putback_char(Stream, Char, IO_0, IO) :-
> - io__save_putback(PutBack0),
> + IO_0 = io__state(A, PutBack0, C, D),
> ( map__search(PutBack0, Stream, Chars) ->
> map__det_update(PutBack0, Stream, [Char | Chars], PutBack)
> ;
> map__det_insert(PutBack0, Stream, [Char], PutBack)
> ),
> - retractall(io__save_putback(_)),
> - assert(io__save_putback(PutBack)),
> - IO = IO_0.
> + IO = io__state(A, PutBack, C, D).
>
> io__putback_byte(_Stream, _Char, IO, IO) :-
> error("io__putback_byte: binary IO is not implemented for Prolog.").
> @@ -462,7 +470,7 @@
>
> io__get_line_number(Stream, LineNumber) -->
> { lineCount(Stream, LineNumber0) },
> - { io__save_putback(PutBack) },
> + =(io__state(_, PutBack, _, _)),
> { map__search(PutBack, Stream, Chars) ->
> io__adjust_line_num(Chars, LineNumber0, LineNumber)
> ;
> @@ -488,9 +496,13 @@
> % to ensure that once an io state has been used it can't be
> % used again.
>
> +
> :- pred io__init_state(io__state).
> io__init_state(IO_State) :-
> - io__init_state(current, IO_State).
> + ExternalState = current,
> + map__init(PutBack),
> + IOState0 = io__state(_Names0, PutBack, _Globals, ExternalState),
> + io__init_state(IOState0, IO_State).
>
> :- pred io__update_state(io__state, io__state).
> io__update_state(IOState0, IOState) :-
> @@ -501,14 +513,14 @@
> ;
> true
> ),
> - %%% ( IOState0 = io__state(_, _, current) ->
> + %%% ( IOState0 = io__state(_, _, _, current) ->
> %%% true
> %%% ;
> %%% error("io.nu.nl: cannot retry I/O operation")
> %%% ),
> - %%% IOState0 = io__state(Names, Globals, _),
> + %%% IOState0 = io__state(Names, PutBack, Globals, _),
> %%% $replacn(2, IOState0, old),
> - %%% IOState = io__state(Names, Globals, current).
> + %%% IOState = io__state(Names, PutBack, Globals, current).
> IOState = IOState0.
>
> :- pred io__final_state(io__state).
> @@ -538,17 +550,19 @@
> { retractall(io__save_exit_status(_)) },
> { assert(io__save_exit_status(ExitStatus)) }.
>
> -io__get_globals(Globals) -->
> - { io__save_user_globals(Globals) }.
> -io__set_globals(Globals) -->
> - { retractall(io__save_user_globals(_)) },
> - { assert(io__save_user_globals(Globals)) }.
> -
> -io__get_stream_names(StreamNames) -->
> - { io__save_stream_names(StreamNames) }.
> -io__set_stream_names(StreamNames) -->
> - { retractall(io__save_stream_names(_)) },
> - { assert(io__save_stream_names(StreamNames)) }.
> +io__get_stream_names(StreamNames, IOState, IOState) :-
> + IOState = io__state(StreamNames, _, _, _).
> +
> +io__set_stream_names(StreamNames, IOState0, IOState) :-
> + IOState0 = io__state(_, B, C, D),
> + IOState = io__state(StreamNames, B, C, D).
> +
> +io__get_globals(Globals, IOState, IOState) :-
> + IOState = io__state(_, _, Globals, _).
> +
> +io__set_globals(Globals, IOState0, IOState) :-
> + IOState0 = io__state(A, B, _, D),
> + IOState = io__state(A, B, Globals, D).
>
> %-----------------------------------------------------------------------------%
> %-----------------------------------------------------------------------------%
>
> --
> Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
> WWW: <http://www.cs.mu.oz.au/~fjh> | of excellence is a lethal habit"
> PGP: finger fjh at 128.250.37.3 | -- the last words of T. S. Garp.
> --------------------------------------------------------------------------
> mercury-developers mailing list
> Post messages to: mercury-developers at cs.mu.oz.au
> Administrative Queries: owner-mercury-developers at cs.mu.oz.au
> Subscriptions: mercury-developers-request at cs.mu.oz.au
> --------------------------------------------------------------------------
>
--
Tyson Dowd # Another great idea from the
# people who brought you
trd at .cs.mu.oz.au # Beer Milkshakes!
http://www.cs.mu.oz.au/~trd # Confidence --- Red Dwarf
More information about the developers
mailing list