Annotation of researchv10no/cmd/sml/doc/optimize, revision 1.1

1.1     ! root        1:                How to Standard ML of New Jersey run faster
        !             2: 
        !             3: 
        !             4: 1. Each compilation unit is compiled separately.  None of the 
        !             5:    optimizations take place across compilation-unit boundaries.   
        !             6:    Example:
        !             7: 
        !             8:        fun f(x) = (x,x);
        !             9:         fun g 0 = nil | g i = f i :: g(i-1);
        !            10:         
        !            11:    This is two compilation units if typed at top level, or if loaded
        !            12:    from a file because at the first semicolon, the function f is compiled,
        !            13:    and then at the next semicolon, g is compiled.  The function g will run
        !            14:    significantly faster if any of the following is used instead:
        !            15: 
        !            16:        fun f(x) = (x,x)
        !            17:         fun g 0 = nil | g i = f i :: g(i-1);
        !            18: 
        !            19:        local fun f(x) = (x,x);
        !            20:           in  fun g 0 = nil | g i = f i :: g(i-1)
        !            21:          end;
        !            22: 
        !            23:     structure S = struct 
        !            24:        fun f(x) = (x,x);
        !            25:         fun g 0 = nil | g i = f i :: g(i-1);
        !            26:      end;
        !            27: 
        !            28:     In either of these last two, of course, the semicolons are optional.
        !            29: 
        !            30:     Moral of the story:  use small compilation units while typing to
        !            31:     the interactive system and seeing how things work.  Use larger
        !            32:     compilation units when compiling large programs.  I recommend the
        !            33:     use of the module system, or of "let" and "local" declarations,
        !            34:     to bind things together in a well-structured way.
        !            35: 
        !            36:     The use of signature constraints to minimize the number of things
        !            37:     exported from structures will reduce memory usage, and is just clean style.
        !            38: 
        !            39: 2.  For the fanatic:  (these are not guaranteed forever)
        !            40: 
        !            41:        The initial environment (i.e. the List, Array, Ref, etc. structures)
        !            42:     is normally in a separate module from the user program.  If you
        !            43:     would like a copy of this stuff in your program so that calls to the
        !            44:     pervasive functions will have less overhead, textually insert
        !            45:     src/boot/fastlib.sml near the beginning of your own structure.
        !            46:     This only helps, of course, if fastlib.sml is put into the same
        !            47:     compilation unit as the functions calling it, using the module
        !            48:     system as described above.
        !            49: 
        !            50:        You can nest structures.  To get better performance, after you
        !            51:     have developed your program, nest the whole thing in one huge
        !            52:     structure, e.g.
        !            53: 
        !            54:        structure Whole : sig end = struct
        !            55: 
        !            56:                your program
        !            57:        end
        !            58: 
        !            59:     You can even put signatures and functors at top level inside such a
        !            60:     structure, although this is not "Standard" ML.
        !            61: 
        !            62: 
        !            63: 3.  You can increase the level of optimization, if you want to wait
        !            64:     a bit longer for compiles.  To make things compile more slowly
        !            65:     but run faster, execute this before compiling your program:
        !            66: 
        !            67:        System.Control.CG.reducemore := 0;
        !            68:        System.Control.CG.rounds := 10;
        !            69:        System.Control.CG.bodysize := 20;
        !            70: 
        !            71:     To make things compile faster but run slower, try this:
        !            72: 
        !            73:        System.Control.CG.reducemore := 10000;
        !            74:        System.Control.CG.rounds := 0;
        !            75:        System.Control.CG.bodysize := ~100;
        !            76:        System.Control.CG.reduce := false;
        !            77: 
        !            78: 4.  You can measure the execution time of your programs using the
        !            79:     functions in System.Timer.
        !            80:     (* in the initial environment,
        !            81:        signature TIMER =
        !            82:          sig  
        !            83:            datatype time = TIME of {sec : int, usec : int}
        !            84:            type timer
        !            85:            val start_timer : unit -> timer
        !            86:            val check_timer : timer -> time
        !            87:            val check_timer_gc: timer -> time
        !            88:            val makestring : time -> string
        !            89:            val add_time : time * time -> time
        !            90:          end
        !            91:         structure System.Timer : TIMER 
        !            92:      *)
        !            93: 
        !            94:       let val t = System.Timer.start_timer()
        !            95:           val _ = run_my_program()
        !            96:           val non_gc_time = System.Timer.check_timer t
        !            97:           val gc_time = System.Timer.check_timer_gc t
        !            98:           val total_time = System.Timer.add_time(non_gc_time,gc_time)
        !            99:        in print(System.Timer.makestring total_time)
        !           100:       end
        !           101: 
        !           102: 5.  You can also use the execution profiler, described in doc/profiling

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.