[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