Re: How to programmatically test for LINEAR TIME (as opposed to qudratic)?
On 17.10.2013 00:49, Ian Collins wrote:
This is really a question about operating system timers. On my
platforms (Solaris and its derivatives) I would use per-process high
resolution timers (which use a hardware source) for this kind of test.
Does windows have those?
Apparently with about 2.5 million ticks per second:
[code header]
#pragma once
// Copyright (c) 2013 Alf P. Steinbach
#include <stdint.h> // uint_least64_t
namespace cppx{ namespace instrumentation{
class System_timer
{
public:
enum Time: uint_least64_t {};
enum Duration: uint_least64_t {};
private:
Time start_;
Time end_;
bool is_running_;
static auto current_ticks() -> Time; // System-specific.
static auto ticks_per_second() -> double; // System-specific.
static auto nano() -> double { return 1e-9; }
public:
auto duration() const
-> Duration
{ return static_cast<Duration>( end_ - start_ ); }
auto nano_seconds() const
-> uint_least64_t
{ return static_cast<uint_least64_t>( seconds()/nano() ); }
auto seconds() const
-> double
{ return duration()/ticks_per_second(); }
void stop()
{
end_ = current_ticks();
is_running_ = false;
}
void carry_on() // A.k.a. "continue", which however is a
C++ keyword.
{
start_ = static_cast<Time>( current_ticks() - duration() );
is_running_ = true;
}
System_timer()
: start_( current_ticks() )
, end_()
, is_running_( true )
{}
};
} } // namespace cppx::instrumentation
[/code]
[code impl]
// Coppyright (c) 2013 Alf P. Steinbach.
#ifndef _WIN32
# error This implementation file is for Windows OS only.
#endif
#include <rfc/cppx/instrumentation/System_timer.h>
#include <rfc/cppx/core/throwing.h> // cppx::fail
#include <rfc/winapi_wrappers/windows_h.h>
namespace cppx{ namespace instrumentation{
auto System_timer::current_ticks()
-> System_timer::Time
{
LARGE_INTEGER result = {0};
::QueryPerformanceCounter( &result )
|| fail( "QueryPerformanceCounter", ::GetLastError() );
return static_cast<Time>( result.QuadPart );
}
auto System_timer::ticks_per_second()
-> double
{
LARGE_INTEGER result = {0};
::QueryPerformanceFrequency( &result )
|| fail( "QueryPerformanceFrequency", ::GetLastError() );
return static_cast<double>( result.QuadPart );
}
} } // namespace cppx::instrumentation
[/code]
Cheers,
- Alf