Hi all!
I'm facing a weird situation... I tracked down in a program of mine a bottleneck which came up to be a call to thread-send. After addint a (time ...) around it I found that it takes around ~20 ms to perform the thread send (which I believe is pretty slow):
(time (thread-send user-interface-thread `(redraw ,level))) 24 ms real time 20 ms cpu time (10 user, 10 system) 1 collection accounting for 2 ms real time (0 user, 0 system) 40536 bytes allocated no minor faults no major faults (time (thread-send user-interface-thread `(redraw ,level))) 18 ms real time 10 ms cpu time (10 user, 0 system) no collections 37900 bytes allocated no minor faults no major faults
I'd like to note here that level in the code sample above is a rather big data structure, but I believe this is irrelevant because only the pointer should be passed down?
Strangely, I tried to reproduced the behaviour in a repl but I only happened to get ~0ms for these thread-send calls:
(define t (make-thread (lambda () (let loop () (pp (thread-receive)) (loop))))) (thread-start! t)
#<thread #2>
(time (thread-send t 'allo))
(time (thread-send t 'allo)) 0 ms real time 0 ms cpu time (0 user, 0 system) no collections 24 bytes allocated no minor faults no major faults
allo
(time (thread-send t 'allo)) (time (thread-send t 'allo)) 0 ms real time 0 ms cpu time (0 user, 0 system) no collections 24 bytes allocated no minor faults no major faults
allo
Thank you very much for your help!
David
Afficher les réponses par date
The reason is simply that you have other threads running at that point and this slows down the code executed by (time ...). The runtime system does not maintain run times on individual threads. There is just one global clock. I once considered maintaining run times on individual threads but it would be a very large overhead for threads that do very little computation between context switching (because getting the current-time from the operating system can be expensive, I have seen 1 microsecond, which would double the execution time of a thread which runs every microsecond, like the ring benchmark).
Marc
On 22-Jan-09, at 3:49 PM, David St-Hilaire wrote:
Hi all!
I'm facing a weird situation... I tracked down in a program of mine a bottleneck which came up to be a call to thread-send. After addint a (time ...) around it I found that it takes around ~20 ms to perform the thread send (which I believe is pretty slow):
(time (thread-send user-interface-thread `(redraw ,level))) 24 ms real time 20 ms cpu time (10 user, 10 system) 1 collection accounting for 2 ms real time (0 user, 0 system) 40536 bytes allocated no minor faults no major faults (time (thread-send user-interface-thread `(redraw ,level))) 18 ms real time 10 ms cpu time (10 user, 0 system) no collections 37900 bytes allocated no minor faults no major faults
I'd like to note here that level in the code sample above is a rather big data structure, but I believe this is irrelevant because only the pointer should be passed down?
Strangely, I tried to reproduced the behaviour in a repl but I only happened to get ~0ms for these thread-send calls:
(define t (make-thread (lambda () (let loop () (pp (thread- receive)) (loop))))) (thread-start! t)
#<thread #2>
(time (thread-send t 'allo))
(time (thread-send t 'allo)) 0 ms real time 0 ms cpu time (0 user, 0 system) no collections 24 bytes allocated no minor faults no major faults
allo
(time (thread-send t 'allo)) (time (thread-send t 'allo)) 0 ms real time 0 ms cpu time (0 user, 0 system) no collections 24 bytes allocated no minor faults no major faults
allo
Thank you very much for your help!
David
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list