14 #ifndef STXXL_IOSTATS_HEADER
15 #define STXXL_IOSTATS_HEADER
17 #ifndef STXXL_IO_STATS
18 #define STXXL_IO_STATS 1
24 #include <stxxl/bits/namespace.h>
25 #include <stxxl/bits/common/mutex.h>
26 #include <stxxl/bits/common/types.h>
27 #include <stxxl/bits/common/utils.h>
28 #include <stxxl/bits/singleton.h>
31 __STXXL_BEGIN_NAMESPACE
39 class stats :
public singleton<stats>
41 friend class singleton<stats>;
43 unsigned reads, writes;
44 int64 volume_read, volume_written;
45 double t_reads, t_writes;
46 double p_reads, p_writes;
47 double p_begin_read, p_begin_write;
50 double t_waits, p_waits;
52 int acc_reads, acc_writes;
56 mutex read_mutex, write_mutex, io_mutex, wait_mutex;
61 class scoped_write_timer
63 typedef unsigned_type size_type;
70 scoped_write_timer(size_type size)
83 void start(size_type size)
88 stats::get_instance()->write_started(size);
99 stats::get_instance()->write_finished();
106 class scoped_read_timer
108 typedef unsigned_type size_type;
115 scoped_read_timer(size_type size)
128 void start(size_type size)
133 stats::get_instance()->read_started(size);
144 stats::get_instance()->read_finished();
151 class scoped_wait_timer
153 #ifdef COUNT_WAIT_TIME
159 #ifdef COUNT_WAIT_TIME
173 #ifdef COUNT_WAIT_TIME
176 stats::get_instance()->wait_started();
183 #ifdef COUNT_WAIT_TIME
185 stats::get_instance()->wait_finished();
218 return volume_written;
280 void write_started(
unsigned size_);
281 void write_finished();
282 void read_started(
unsigned size_);
283 void read_finished();
285 void wait_finished();
289 inline void stats::write_started(
unsigned size_)
293 inline void stats::write_finished() { }
294 inline void stats::read_started(
unsigned size_)
298 inline void stats::read_finished() { }
300 #ifndef COUNT_WAIT_TIME
301 inline void stats::wait_started() { }
302 inline void stats::wait_finished() { }
308 unsigned reads, writes;
309 int64 volume_read, volume_written;
310 double t_reads, t_writes;
311 double p_reads, p_writes;
331 stats_data(
const stats & s) :
332 reads(s.get_reads()),
333 writes(s.get_writes()),
334 volume_read(s.get_read_volume()),
335 volume_written(s.get_written_volume()),
336 t_reads(s.get_read_time()),
337 t_writes(s.get_write_time()),
338 p_reads(s.get_pread_time()),
339 p_writes(s.get_pwrite_time()),
340 p_ios(s.get_pio_time()),
341 t_wait(s.get_io_wait_time()),
342 elapsed(timestamp() - s.get_last_reset_time())
345 stats_data operator + (
const stats_data & a)
const
348 s.reads = reads + a.reads;
349 s.writes = writes + a.writes;
350 s.volume_read = volume_read + a.volume_read;
351 s.volume_written = volume_written + a.volume_written;
352 s.t_reads = t_reads + a.t_reads;
353 s.t_writes = t_writes + a.t_writes;
354 s.p_reads = p_reads + a.p_reads;
355 s.p_writes = p_writes + a.p_writes;
356 s.p_ios = p_ios + a.p_ios;
357 s.t_wait = t_wait + a.t_wait;
358 s.elapsed = elapsed + a.elapsed;
362 stats_data operator - (
const stats_data & a)
const
365 s.reads = reads - a.reads;
366 s.writes = writes - a.writes;
367 s.volume_read = volume_read - a.volume_read;
368 s.volume_written = volume_written - a.volume_written;
369 s.t_reads = t_reads - a.t_reads;
370 s.t_writes = t_writes - a.t_writes;
371 s.p_reads = p_reads - a.p_reads;
372 s.p_writes = p_writes - a.p_writes;
373 s.p_ios = p_ios - a.p_ios;
374 s.t_wait = t_wait - a.t_wait;
375 s.elapsed = elapsed - a.elapsed;
379 unsigned get_reads()
const
384 unsigned get_writes()
const
389 int64 get_read_volume()
const
394 int64 get_written_volume()
const
396 return volume_written;
399 double get_read_time()
const
404 double get_write_time()
const
409 double get_pread_time()
const
414 double get_pwrite_time()
const
419 double get_pio_time()
const
424 double get_elapsed_time()
const
429 double get_io_wait_time()
const
435 std::ostream & operator << (std::ostream & o,
const stats_data & s);
437 inline std::ostream & operator << (std::ostream & o,
const stats & s)
439 o << stxxl::stats_data(s);
445 __STXXL_END_NAMESPACE
447 #endif // !STXXL_IOSTATS_HEADER