[m-rev.] diff: 3% speedup on tools/speedtest
Zoltan Somogyi
zs at csse.unimelb.edu.au
Wed Aug 19 17:31:07 AEST 2009
compiler/dead_proc_elim.m:
Use set_tree234s instead of plain sets. Since this module does
a lot of manipulation of big sets, the faster operations allowed
by the tree234 structure lead to a 3% speedup.
library/set_tree234.m:
Set the language for syntax colouring to Mercury.
Zoltan.
cvs diff: Diffing .
cvs diff: Diffing analysis
cvs diff: Diffing bindist
cvs diff: Diffing boehm_gc
cvs diff: Diffing boehm_gc/Mac_files
cvs diff: Diffing boehm_gc/cord
cvs diff: Diffing boehm_gc/cord/private
cvs diff: Diffing boehm_gc/doc
cvs diff: Diffing boehm_gc/include
cvs diff: Diffing boehm_gc/include/private
cvs diff: Diffing boehm_gc/libatomic_ops-1.2
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/doc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/hpc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/ibmc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/icc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/msftc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/sunc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/tests
cvs diff: Diffing boehm_gc/tests
cvs diff: Diffing boehm_gc/windows-untested
cvs diff: Diffing boehm_gc/windows-untested/vc60
cvs diff: Diffing boehm_gc/windows-untested/vc70
cvs diff: Diffing boehm_gc/windows-untested/vc71
cvs diff: Diffing browser
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
Index: compiler/dead_proc_elim.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/dead_proc_elim.m,v
retrieving revision 1.132
diff -u -b -r1.132 dead_proc_elim.m
--- compiler/dead_proc_elim.m 11 Jun 2009 07:00:07 -0000 1.132
+++ compiler/dead_proc_elim.m 18 Aug 2009 12:07:29 -0000
@@ -96,11 +96,11 @@
:- import_module maybe.
:- import_module pair.
:- import_module queue.
+:- import_module set_tree234.
:- import_module set.
:- import_module string.
:- import_module svmap.
:- import_module svqueue.
-:- import_module svset.
%-----------------------------------------------------------------------------%
@@ -127,7 +127,7 @@
% or type_ctor_info structure whose id is not in the needed map.
:- type entity_queue == queue(entity).
-:- type examined_set == set(entity).
+:- type examined_set == set_tree234(entity).
dead_proc_elim(ElimOptImported, !ModuleInfo, Specs) :-
dead_proc_analyze(!ModuleInfo, Needed),
@@ -136,7 +136,7 @@
%-----------------------------------------------------------------------------%
dead_proc_analyze(!ModuleInfo, !:Needed) :-
- set.init(Examined0),
+ Examined0 = set_tree234.init,
dead_proc_initialize(!ModuleInfo, Queue0, !:Needed),
dead_proc_examine(Queue0, Examined0, !.ModuleInfo, !Needed).
@@ -318,10 +318,10 @@
% See if the queue is empty.
( svqueue.get(Entity, !Queue) ->
% See if the next element has been examined before.
- ( set.member(Entity, !.Examined) ->
+ ( set_tree234.member(!.Examined, Entity) ->
dead_proc_examine(!.Queue, !.Examined, ModuleInfo, !Needed)
;
- svset.insert(Entity, !Examined),
+ set_tree234.insert(Entity, !Examined),
(
Entity = entity_proc(PredId, ProcId),
PredProcId = proc(PredId, ProcId),
@@ -875,9 +875,15 @@
---> pred_elim_info(
pred_elim_module_info :: module_info,
pred_elim_queue :: queue(pred_id), % preds to examine.
- pred_elim_examined :: set(pred_id), % preds examined.
- pred_elim_needed_ids :: set(pred_id), % needed pred_ids.
- pred_elim_needed_named :: set(sym_name) % pred names needed.
+
+ % preds examined.
+ pred_elim_examined :: set_tree234(pred_id),
+
+ % needed pred_ids.
+ pred_elim_needed_ids :: set_tree234(pred_id),
+
+ % pred names needed.
+ pred_elim_needed_named :: set_tree234(sym_name)
).
dead_pred_elim(!ModuleInfo) :-
@@ -896,14 +902,14 @@
Needed1, Needed),
map.keys(Needed, Entities),
queue.init(Queue1),
- set.init(NeededPreds0),
+ NeededPreds0 = set_tree234.init,
list.foldl2(dead_pred_elim_add_entity, Entities, Queue1, Queue,
NeededPreds0, NeededPreds1),
module_info_predids(PredIds, !ModuleInfo),
- set.init(Preds0),
- set.init(Names0),
+ Preds0 = set_tree234.init,
+ Names0 = set_tree234.init,
DeadInfo0 = pred_elim_info(!.ModuleInfo, Queue, Preds0, NeededPreds1,
Names0),
list.foldl(dead_pred_elim_initialize, PredIds, DeadInfo0, DeadInfo1),
@@ -914,38 +920,44 @@
% to force type specialization are also not needed. Here we add in those
% which are needed.
- module_info_get_type_spec_info(!.ModuleInfo,
- type_spec_info(TypeSpecProcs0, TypeSpecForcePreds0,
- SpecMap0, PragmaMap0)),
- set.to_sorted_list(NeededPreds2, NeededPredList2),
+ module_info_get_type_spec_info(!.ModuleInfo, TypeSpecInfo0),
+ TypeSpecInfo0 = type_spec_info(TypeSpecProcs0, TypeSpecForcePreds0,
+ SpecMap0, PragmaMap0),
+ set_tree234.to_sorted_list(NeededPreds2) = NeededPredList2,
list.foldl((pred(NeededPred::in, AllPreds0::in, AllPreds::out) is det :-
( map.search(SpecMap0, NeededPred, NewNeededPreds) ->
- set.insert_list(AllPreds0, NewNeededPreds, AllPreds)
+ set_tree234.insert_list(NewNeededPreds, AllPreds0, AllPreds)
;
AllPreds = AllPreds0
)
), NeededPredList2, NeededPreds2, NeededPreds),
- set.intersect(TypeSpecForcePreds0, NeededPreds, TypeSpecForcePreds),
+ % We expect TypeSpecForcePreds0 to have very few elements, and NeededPreds
+ % to have many. Therefore doing an individual O(log N) lookup in
+ % NeededPreds for each element of TypeSpecForcePreds0 is a better approach
+ % than an intersection operation that would have to traverse all of
+ % NeededPreds.
+ TypeSpecForcePreds =
+ set.filter(set_tree234.contains(NeededPreds), TypeSpecForcePreds0),
- module_info_set_type_spec_info(
- type_spec_info(TypeSpecProcs0, TypeSpecForcePreds,
+ TypeSpecInfo = type_spec_info(TypeSpecProcs0, TypeSpecForcePreds,
SpecMap0, PragmaMap0),
- !ModuleInfo),
+ module_info_set_type_spec_info(TypeSpecInfo, !ModuleInfo),
module_info_get_predicate_table(!.ModuleInfo, PredTable0),
module_info_get_partial_qualifier_info(!.ModuleInfo, PartialQualInfo),
predicate_table_restrict(PartialQualInfo,
- set.to_sorted_list(NeededPreds), PredTable0, PredTable),
+ set_tree234.to_sorted_list(NeededPreds), PredTable0, PredTable),
module_info_set_predicate_table(PredTable, !ModuleInfo).
:- pred dead_pred_elim_add_entity(entity::in, queue(pred_id)::in,
- queue(pred_id)::out, set(pred_id)::in, set(pred_id)::out) is det.
+ queue(pred_id)::out, set_tree234(pred_id)::in, set_tree234(pred_id)::out)
+ is det.
dead_pred_elim_add_entity(entity_type_ctor(_, _, _), !Queue, !Preds).
dead_pred_elim_add_entity(entity_table_struct(_, _), !Queue, !Preds).
dead_pred_elim_add_entity(entity_proc(PredId, _), !Queue, !Preds) :-
svqueue.put(PredId, !Queue),
- svset.insert(PredId, !Preds).
+ set_tree234.insert(PredId, !Preds).
:- pred dead_pred_elim_initialize(pred_id::in,
pred_elim_info::in, pred_elim_info::out) is det.
@@ -1002,7 +1014,7 @@
pred_info_get_goal_type(PredInfo, goal_type_promise(_))
)
->
- svset.insert(qualified(PredModule, PredName), !NeededNames),
+ set_tree234.insert(qualified(PredModule, PredName), !NeededNames),
svqueue.put(PredId, !Queue)
;
true
@@ -1018,12 +1030,12 @@
!.DeadInfo = pred_elim_info(ModuleInfo, !:Queue, !:Examined,
!:Needed, NeededNames),
( svqueue.get(PredId, !Queue) ->
- ( set.member(PredId, !.Examined) ->
+ ( set_tree234.member(!.Examined, PredId) ->
!:DeadInfo = pred_elim_info(ModuleInfo, !.Queue, !.Examined,
!.Needed, NeededNames)
;
- svset.insert(PredId, !Needed),
- svset.insert(PredId, !Examined),
+ set_tree234.insert(PredId, !Needed),
+ set_tree234.insert(PredId, !Examined),
!:DeadInfo = pred_elim_info(ModuleInfo, !.Queue, !.Examined,
!.Needed, NeededNames),
module_info_pred_info(ModuleInfo, PredId, PredInfo),
@@ -1118,11 +1130,11 @@
some [!Queue, !NeededNames] (
!.DeadInfo = pred_elim_info(ModuleInfo, !:Queue, Examined,
Needed, !:NeededNames),
- ( set.member(Name, !.NeededNames) ->
+ ( set_tree234.member(!.NeededNames, Name) ->
true
;
module_info_get_predicate_table(ModuleInfo, PredicateTable),
- svset.insert(Name, !NeededNames),
+ set_tree234.insert(Name, !NeededNames),
(
predicate_table_search_sym(PredicateTable,
may_be_partially_qualified, Name, PredIds)
cvs diff: Diffing compiler/notes
cvs diff: Diffing debian
cvs diff: Diffing debian/patches
cvs diff: Diffing deep_profiler
cvs diff: Diffing deep_profiler/notes
cvs diff: Diffing doc
cvs diff: Diffing extras
cvs diff: Diffing extras/base64
cvs diff: Diffing extras/cgi
cvs diff: Diffing extras/complex_numbers
cvs diff: Diffing extras/complex_numbers/samples
cvs diff: Diffing extras/complex_numbers/tests
cvs diff: Diffing extras/concurrency
cvs diff: Diffing extras/curs
cvs diff: Diffing extras/curs/samples
cvs diff: Diffing extras/curses
cvs diff: Diffing extras/curses/sample
cvs diff: Diffing extras/dynamic_linking
cvs diff: Diffing extras/error
cvs diff: Diffing extras/fixed
cvs diff: Diffing extras/gator
cvs diff: Diffing extras/gator/generations
cvs diff: Diffing extras/gator/generations/1
cvs diff: Diffing extras/graphics
cvs diff: Diffing extras/graphics/easyx
cvs diff: Diffing extras/graphics/easyx/samples
cvs diff: Diffing extras/graphics/mercury_allegro
cvs diff: Diffing extras/graphics/mercury_allegro/examples
cvs diff: Diffing extras/graphics/mercury_allegro/samples
cvs diff: Diffing extras/graphics/mercury_allegro/samples/demo
cvs diff: Diffing extras/graphics/mercury_allegro/samples/mandel
cvs diff: Diffing extras/graphics/mercury_allegro/samples/pendulum2
cvs diff: Diffing extras/graphics/mercury_allegro/samples/speed
cvs diff: Diffing extras/graphics/mercury_glut
cvs diff: Diffing extras/graphics/mercury_opengl
cvs diff: Diffing extras/graphics/mercury_tcltk
cvs diff: Diffing extras/graphics/samples
cvs diff: Diffing extras/graphics/samples/calc
cvs diff: Diffing extras/graphics/samples/gears
cvs diff: Diffing extras/graphics/samples/maze
cvs diff: Diffing extras/graphics/samples/pent
cvs diff: Diffing extras/lazy_evaluation
cvs diff: Diffing extras/lex
cvs diff: Diffing extras/lex/samples
cvs diff: Diffing extras/lex/tests
cvs diff: Diffing extras/log4m
cvs diff: Diffing extras/logged_output
cvs diff: Diffing extras/moose
cvs diff: Diffing extras/moose/samples
cvs diff: Diffing extras/moose/tests
cvs diff: Diffing extras/mopenssl
cvs diff: Diffing extras/morphine
cvs diff: Diffing extras/morphine/non-regression-tests
cvs diff: Diffing extras/morphine/scripts
cvs diff: Diffing extras/morphine/source
cvs diff: Diffing extras/net
cvs diff: Diffing extras/odbc
cvs diff: Diffing extras/posix
cvs diff: Diffing extras/posix/samples
cvs diff: Diffing extras/quickcheck
cvs diff: Diffing extras/quickcheck/tutes
cvs diff: Diffing extras/references
cvs diff: Diffing extras/references/samples
cvs diff: Diffing extras/references/tests
cvs diff: Diffing extras/solver_types
cvs diff: Diffing extras/solver_types/library
cvs diff: Diffing extras/trailed_update
cvs diff: Diffing extras/trailed_update/samples
cvs diff: Diffing extras/trailed_update/tests
cvs diff: Diffing extras/windows_installer_generator
cvs diff: Diffing extras/windows_installer_generator/sample
cvs diff: Diffing extras/windows_installer_generator/sample/images
cvs diff: Diffing extras/xml
cvs diff: Diffing extras/xml/samples
cvs diff: Diffing extras/xml_stylesheets
cvs diff: Diffing java
cvs diff: Diffing java/runtime
cvs diff: Diffing library
Index: library/set_tree234.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/set_tree234.m,v
retrieving revision 1.10
diff -u -b -r1.10 set_tree234.m
--- library/set_tree234.m 23 Oct 2006 00:33:00 -0000 1.10
+++ library/set_tree234.m 18 Aug 2009 11:58:55 -0000
@@ -1,5 +1,5 @@
%---------------------------------------------------------------------------%
-% vim:ts=4 sw=4 expandtab
+% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
% Copyright (C) 2005-2006 The University of Melbourne.
% This file may only be copied under the terms of the GNU Library General
cvs diff: Diffing mdbcomp
cvs diff: Diffing profiler
cvs diff: Diffing robdd
cvs diff: Diffing runtime
cvs diff: Diffing runtime/GETOPT
cvs diff: Diffing runtime/machdeps
cvs diff: Diffing samples
cvs diff: Diffing samples/c_interface
cvs diff: Diffing samples/c_interface/c_calls_mercury
cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/mercury_calls_c
cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/standalone_c
cvs diff: Diffing samples/diff
cvs diff: Diffing samples/muz
cvs diff: Diffing samples/rot13
cvs diff: Diffing samples/solutions
cvs diff: Diffing samples/solver_types
cvs diff: Diffing samples/tests
cvs diff: Diffing samples/tests/c_interface
cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/tests/diff
cvs diff: Diffing samples/tests/muz
cvs diff: Diffing samples/tests/rot13
cvs diff: Diffing samples/tests/solutions
cvs diff: Diffing samples/tests/toplevel
cvs diff: Diffing scripts
cvs diff: Diffing slice
cvs diff: Diffing ssdb
cvs diff: Diffing tests
cvs diff: Diffing tests/analysis
cvs diff: Diffing tests/analysis/ctgc
cvs diff: Diffing tests/analysis/excp
cvs diff: Diffing tests/analysis/ext
cvs diff: Diffing tests/analysis/sharing
cvs diff: Diffing tests/analysis/table
cvs diff: Diffing tests/analysis/trail
cvs diff: Diffing tests/analysis/unused_args
cvs diff: Diffing tests/benchmarks
cvs diff: Diffing tests/debugger
cvs diff: Diffing tests/debugger/declarative
cvs diff: Diffing tests/dppd
cvs diff: Diffing tests/general
cvs diff: Diffing tests/general/accumulator
cvs diff: Diffing tests/general/string_format
cvs diff: Diffing tests/general/structure_reuse
cvs diff: Diffing tests/grade_subdirs
cvs diff: Diffing tests/hard_coded
cvs diff: Diffing tests/hard_coded/exceptions
cvs diff: Diffing tests/hard_coded/purity
cvs diff: Diffing tests/hard_coded/sub-modules
cvs diff: Diffing tests/hard_coded/typeclasses
cvs diff: Diffing tests/invalid
cvs diff: Diffing tests/invalid/purity
cvs diff: Diffing tests/misc_tests
cvs diff: Diffing tests/mmc_make
cvs diff: Diffing tests/mmc_make/lib
cvs diff: Diffing tests/par_conj
cvs diff: Diffing tests/recompilation
cvs diff: Diffing tests/stm
cvs diff: Diffing tests/stm/orig
cvs diff: Diffing tests/stm/orig/stm-compiler
cvs diff: Diffing tests/stm/orig/stm-compiler/test1
cvs diff: Diffing tests/stm/orig/stm-compiler/test10
cvs diff: Diffing tests/stm/orig/stm-compiler/test2
cvs diff: Diffing tests/stm/orig/stm-compiler/test3
cvs diff: Diffing tests/stm/orig/stm-compiler/test4
cvs diff: Diffing tests/stm/orig/stm-compiler/test5
cvs diff: Diffing tests/stm/orig/stm-compiler/test6
cvs diff: Diffing tests/stm/orig/stm-compiler/test7
cvs diff: Diffing tests/stm/orig/stm-compiler/test8
cvs diff: Diffing tests/stm/orig/stm-compiler/test9
cvs diff: Diffing tests/stm/orig/stm-compiler-par
cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm1
cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm2
cvs diff: Diffing tests/stm/orig/stm-compiler-par/stmqueue
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test1
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test10
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test11
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test2
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test3
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test4
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test5
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test6
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test7
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test8
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test9
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test1
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test2
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test3
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test4
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test5
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test6
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test7
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test8
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test9
cvs diff: Diffing tests/tabling
cvs diff: Diffing tests/term
cvs diff: Diffing tests/trailing
cvs diff: Diffing tests/valid
cvs diff: Diffing tests/warnings
cvs diff: Diffing tools
cvs diff: Diffing trace
cvs diff: Diffing util
cvs diff: Diffing vim
cvs diff: Diffing vim/after
cvs diff: Diffing vim/ftplugin
cvs diff: Diffing vim/syntax
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list