Thanks, that make sense!

One more thing which bothers me is if I put a (collect-garbage) in front of 
the testing, I got gc time: 0 if not I got gc time: 9.
Why can't 1 gc reclaim all memory during execution while it can before 
executes?

Sam Tobin-Hochstadt 在 2020年8月5日 星期三下午11:44:21 [UTC+8] 的信中寫道:

> What's happening here is that your function takes effectively 0 time, 
> but when you ran the first version, there was a GC pause during it 
> (that's why there's the "gc time: 9" there). GC pauses can happen at 
> any time, basically, so it's not something about what your function is 
> doing. 
>
> Here's a benchmark of your two functions that takes long enough to run 
> that it avoids some of these issues, and also runs a GC before 
> benchmarking: https://gist.github.com/7cb4645308d8572e2250833ef7b90b7c 
>
> On my machine, I get 40 ms for version 1, and 100 ms for version 2, as 
> you expected. 
>
> Sam 
>
> On Wed, Aug 5, 2020 at 11:21 AM [email protected] <[email protected]> 
> wrote: 
> > 
> > I was working on a exercism problem named Raindrops. 
> > 
> > Problem description: 
> > Convert a number to a string, the contents of which depend on the 
> number's factors. 
> > 
> > If the number has 3 as a factor, output 'Pling'. 
> > If the number has 5 as a factor, output 'Plang'. 
> > If the number has 7 as a factor, output 'Plong'. 
> > If the number does not have 3, 5, or 7 as a factor, just pass the 
> number's digits straight through. 
> > 
> > I came out with two version. 
> > 
> > ; version 1 
> > (define (convert n) 
> > (define pling (divides? 3 n)) 
> > (define plang (divides? 5 n)) 
> > (define plong (divides? 7 n)) 
> > (if (or pling plang plong) 
> > (string-append (if pling "Pling" "") 
> > (if plang "Plang" "") 
> > (if plong "Plong" "")) 
> > (number->string n))) 
> > 
> > ; version 2 
> > (define (convert n) 
> > (define table '((3 . "Pling") (5 . "Plang") (7 . "Plong"))) 
> > (define result (for/list ([(k v) (in-dict table)] #:when (divides? k n)) 
> v)) 
> > (if (empty? result) (number->string n) 
> > (string-append* result))) 
> > 
> > (require math/number-theory) 
> > 
> > I thought version 1 would be faster, but it turned out to be wrong. 
> Running with raco test got following timing information. 
> > 
> > version 1 
> > cpu time: 9 real time: 9 gc time: 9 
> > version 2 
> > cpu time: 0 real time: 0 gc time: 0 
> > 
> > Then I ran both version in DrRacket, both output following result. 
> > cpu time: 0 real time: 0 gc time: 0 
> > 
> > It's strange, isn't it? 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups "Racket Users" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to [email protected]. 
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/racket-users/46592171-c357-4897-af1a-bea91c838cacn%40googlegroups.com.
>  
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/e7d0d239-1b36-4e7d-a93d-7dbdfcbcc04en%40googlegroups.com.

Reply via email to