33 integer,
private,
parameter :: allocated_num_loops = 50
45 real ( kind=8 ),
public :: start_time
46 real ( kind=8 ),
public :: end_time
48 integer ( kind=4 ),
public :: number_loops
50 real ( kind=8 ),
public,
allocatable,
dimension(:) :: loop_times
52 real ( kind=8 ),
private :: internal_start_time
53 real ( kind=8 ),
private :: internal_end_time
57 procedure,
public :: start => timer_start
58 procedure,
public :: stop => timer_stop
59 procedure,
public :: loop => timer_loop
60 procedure,
public :: average => timer_average
61 procedure,
public :: variance => timer_variance
62 procedure,
public :: elapsed_time => timer_elapsed
63 procedure,
public :: reset => timer_reset
64 procedure,
public :: wait => timer_wait
65 procedure,
public :: time => timer_time
79 subroutine timer_start( self )
83 class( timer ) :: self
88 self%start_time = self%time()
90 end subroutine timer_start
94 subroutine timer_stop( self )
98 class( timer ) :: self
101 self%end_time = self%time()
103 end subroutine timer_stop
107 subroutine timer_loop( self )
111 class( timer ) :: self
113 integer ( kind=4 ) :: temp_size, ind
114 real ( kind=8 ),
allocatable,
dimension(:) :: temp_loop_times
117 self%internal_end_time = self%time()
119 self%number_loops = self%number_loops +1
121 if ( .not.
allocated( self%loop_times ) )
then 122 allocate( self%loop_times(allocated_num_loops ) )
123 self%loop_times = 0.0d0
126 temp_size =
size(self%loop_times)
128 if ( self%number_loops > temp_size )
then 130 allocate( temp_loop_times(temp_size) )
132 temp_loop_times = self%loop_times
134 deallocate( self%loop_times )
135 allocate( self%loop_times( (self%number_loops/allocated_num_loops+1)*allocated_num_loops ) )
136 self%loop_times = 0.0d0
138 do ind=1, self%number_loops-1
139 self%loop_times(ind) = temp_loop_times(ind)
143 if ( self%number_loops==1 )
then 144 self%loop_times(self%number_loops) = self%internal_end_time -self%start_time
146 self%loop_times(self%number_loops) = self%internal_end_time -self%internal_start_time
149 self%internal_start_time = self%time()
151 end subroutine timer_loop
155 function timer_average( self )
159 class( timer ) :: self
160 real ( kind=8 ) :: timer_average
162 integer ( kind=4 ) :: ind
165 timer_average = 0.0d+0
167 do ind=1, self%number_loops
168 timer_average = timer_average +self%loop_times(ind)
171 timer_average = timer_average/
REAL(self%number_loops)
173 end function timer_average
177 function timer_variance( self )
181 class( timer ) :: self
182 real ( kind=8 ) :: timer_variance
184 real ( kind=8 ) :: average_time
185 integer ( kind=4 ) :: ind
188 timer_variance = 0.0d+0
190 if ( self%number_loops>1 )
then 191 average_time = self%average()
192 do ind=1, self%number_loops
193 timer_variance = timer_variance +( self%loop_times(ind) -average_time )**2
195 timer_variance = sqrt( timer_variance/
REAL(self%number_loops-1) )
198 end function timer_variance
202 function timer_elapsed( self )
207 real ( kind=8 ) :: timer_elapsed
209 timer_elapsed = self%end_time -self%start_time
211 end function timer_elapsed
215 subroutine timer_reset( self )
221 self%start_time = 0.0d+0
222 self%end_time = 0.0d+0
224 self%number_loops = 0
226 self%internal_start_time = 0.0d+0
227 self%internal_end_time = 0.0d+0
229 if (
allocated( self%loop_times ) )
deallocate( self%loop_times )
231 end subroutine timer_reset
235 subroutine timer_wait( self, time )
239 class( timer ) :: self
240 real ( kind=8 ),
intent(in) :: time
242 real( kind=8 ) :: start_time, elapsed_time
244 start_time = self%time()
246 elapsed_time = self%time() -start_time
247 if ( elapsed_time > time )
return 250 end subroutine timer_wait
254 function timer_time( self )
259 real ( kind=8 ) :: timer_time
261 call cpu_time(timer_time)
263 end function timer_time
This module contains a quality timer class to benchmark applications.