Hi Pekr,

Petr Krenzelok wrote:
> Hello,
<...>
> start: now/time/precise .... do something ... print now/time/precise - 
> start start: now/time/precise
> 
> 
> I wanted to write myself short logger function, which will save me from 
> repeating above sequences, as the script becomes a bit messy then. So I 
> wanted to have following interface:
<...>
Maybe this script will help a little, I normally use only

profiler/test [a short snip I want to test] 10000

but it "should" be possible to set different profiler marks in your 
script, and test them later, but that's not tested.


I hope that helps,

Ingo




-- Attached file included as plaintext by Ecartis --
-- File: profiler.r

REBOL [
        Title: "Rebol Profiler"
        Author: "Ingo Hohmann"
]

profiler: context [
        markers: []
        
        mark: func [
    "adds a profiler mark"
                marker [word!]
        ] [
                insert tail markers reduce [ marker now/time/precise ]
        ]

        

        show: func [
    "shows time since setting a profiler mark"
                marker [word!]
                /local t walk ret-val last-val tmp-val
        ] [
                ret: copy []
                t: now/time/precise
                if walk: find markers marker [
                        walk: next walk
                        last-val: first walk
                        while [walk: find walk marker] [
                                walk: next walk
                                append ret (first walk) - last-val
                                last-val: first walk
                        ]
                ]
                ret
        ]

        test: func [
                {tests a block for speed *!* clears the markers block *!*}
                block [block!]
                times [integer!]
        ] [
                block: copy/deep block
                clear
                mark 't
                loop times [do block]
                mark 't
                show 't
        ]
        
        clear: func [
                "Clears all markers"
                /only marker [word!]
                /local walk
        ] [
                either only [
                        walk: find markers marker
                        until [
                                remove/part walk 2
                                not found? find walk marker
                        ]
                ] [
                        system/words/clear markers
                ]
        ]

        next-marker: 1
        
        _func: function!
        ;
        ; ToDo:
        ; create a list of marks, find a way to name the functions
        ;
        profiling-func: func [
                {Adds profiling data to a normal function}
                    [catch] 
    spec [block!] {Help string (opt) followed by arg words (and opt type and string)} 
    body [block!] "The body block of the function"
                /local pre post
        ][
                pre: copy [catch/name ]
                post: copy ['profiling-return]
                insert body compose [profiler/mark (to-word join 'm next-marker)]
                next-marker: next-marker + 1
                insert tail insert/only tail pre body post
                probe pre
        ]
        
        install: func [
                {Installs a profiling 'func
                        every new func after this will create a profiling function}
        ][
                _func: :func
                func: :profiling-func
        ]
        
]

        

-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to