This is the mail archive of the
kawa@sourceware.org
mailing list for the Kawa project.
'time' in class-style
- From: Yaroslav Kavenchuk <kavenchuk at gmail dot com>
- To: kawa at sourceware dot org
- Date: Thu, 03 Jan 2008 15:36:10 +0200
- Subject: 'time' in class-style
Forgive me for importunity.
Any comments for this version of 'time', please:
(define-syntax consumFormat
(syntax-rules ()
((consumFormat consumer sFormat ...)
(consumer:write (as <String> (format #f sFormat ...))))))
(define-simple-class <process-data> (<java.lang.Object>
<gnu.text.Printable>)
(end-non-heap-mem :: <java.lang.management.MemoryUsage> init-value:
#!null)
(end-heap-mem :: <java.lang.management.MemoryUsage> init-value: #!null)
(end-time :: <gnu.math.IntNum> init-value: #!null) ;; <int> is not
initialized #!null
(start-non-heap-mem :: <java.lang.management.MemoryUsage> init-value:
#!null)
(start-heap-mem :: <java.lang.management.MemoryUsage> init-value: #!null)
(start-time :: <gnu.math.IntNum> init-value: #!null)
(value init-value: ())
;; Shadow default constructor
((*init*) access: 'private ())
((*init* (process :: <gnu.expr.ModuleMethod>)) ;; ?? correct class
(let ((mem-bean :: <java.lang.management.MemoryMXBean>
(java.lang.management.ManagementFactory:getMemoryMXBean)))
(mem-bean:gc) (mem-bean:gc) (mem-bean:gc) ;; Why so much? I do not
know :)
(set! start-non-heap-mem (mem-bean:getNonHeapMemoryUsage))
(set! start-heap-mem (mem-bean:getHeapMemoryUsage))
(set! start-time (java.lang.System:currentTimeMillis))
(set! value
(dynamic-wind
(lambda () #t)
;; run our process (a function)
process
(lambda ()
(set! end-non-heap-mem (mem-bean:getNonHeapMemoryUsage))
(set! end-heap-mem (mem-bean:getHeapMemoryUsage))
(set! end-time (java.lang.System:currentTimeMillis)))))
(mem-bean:gc))) ;; This is need?
;; getters
((getDuration) :: <gnu.math.RealNum> ;; <double> - java.lang.Double
cannot be cast to gnu.math.RealNum
(/ (- end-time start-time) 1000.0))
((getInitHeapMemDiff) :: <int>
(- end-heap-mem:init start-heap-mem:init))
((getUsedHeapMemDiff) :: <int>
(- end-heap-mem:used start-heap-mem:used))
((getCommittedHeapMemDiff) :: <int>
(- end-heap-mem:committed start-heap-mem:committed))
((getMaxHeapMemDiff) :: <int>
(- end-heap-mem:max start-heap-mem:max))
((getInitNonHeapMemDiff) :: <int>
(- end-non-heap-mem:init start-non-heap-mem:init))
((getUsedNonHeapMemDiff) :: <int>
(- end-non-heap-mem:used start-non-heap-mem:used))
((getCommittedNonHeapMemDiff) :: <int>
(- end-non-heap-mem:committed start-non-heap-mem:committed))
((getMaxNonHeapMemDiff) :: <int>
(- end-non-heap-mem:max start-non-heap-mem:max))
;; gnu.text.Printable
((print out :: <gnu.lists.Consumer>) :: <void>
(consumFormat out "Value: ~A\n" value)
(consumFormat out "Duration: ~,3F sec.\n" (this):Duration)
(out:write "Memory usage:\n Heap memory:\n")
(consumFormat out " init: ~:D\n" (this):InitHeapMemDiff)
(consumFormat out " used: ~:D\n" (this):UsedHeapMemDiff)
(consumFormat out " committed: ~:D\n" (this):CommittedHeapMemDiff)
(consumFormat out " max: ~:D\n" (this):MaxHeapMemDiff)
(out:write " Non heap memory:\n")
(consumFormat out " init: ~:D\n" (this):InitHeapMemDiff)
(consumFormat out " used: ~:D\n" (this):UsedHeapMemDiff)
(consumFormat out " committed: ~:D\n" (this):CommittedHeapMemDiff)
(consumFormat out " max: ~:D\n" (this):MaxHeapMemDiff)))
(define-syntax time
(syntax-rules ()
((time expression)
;; =>
(make <process-data> (lambda () expression)))))
Thanks!
And excuse me again.
--
WBR, Yaroslav Kavenchuk.