diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-11-24 22:26:57 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-11-24 22:26:57 +0000 |
commit | e9ea9255d80f5f3886b007ec2d2f606214b36177 (patch) | |
tree | e8e9328a68e4d0733fa30a51ab3e62eacaee661a /staging_vespalib/src | |
parent | 704cc4595c0ddeba4eebfd4264c4ac61f1ca9ba7 (diff) |
Add tests for various atomic variants.
Diffstat (limited to 'staging_vespalib/src')
-rw-r--r-- | staging_vespalib/src/tests/clock/clock_benchmark.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/staging_vespalib/src/tests/clock/clock_benchmark.cpp b/staging_vespalib/src/tests/clock/clock_benchmark.cpp index 4456c9dbb5c..2718cee6a9d 100644 --- a/staging_vespalib/src/tests/clock/clock_benchmark.cpp +++ b/staging_vespalib/src/tests/clock/clock_benchmark.cpp @@ -3,6 +3,7 @@ #include <vespa/vespalib/util/clock.h> #include <cassert> #include <vector> +#include <atomic> using vespalib::Clock; using fastos::TimeStamp; @@ -17,10 +18,14 @@ struct NSValue : public UpdateClock { int64_t _value; }; -struct NSVolatileValue : public UpdateClock { +struct NSVolatile : public UpdateClock { void update() override { _value = std::chrono::steady_clock::now().time_since_epoch().count(); } volatile int64_t _value; }; +struct NSAtomic : public UpdateClock { + void update() override { _value.store(std::chrono::steady_clock::now().time_since_epoch().count()); } + std::atomic<int64_t> _value; +}; class TestClock : public FastOS_Runnable { @@ -103,19 +108,32 @@ main(int , char *argv[]) uint64_t samples = atoll(argv[3]); FastOS_ThreadPool pool(0x10000); NSValue nsValue; - NSVolatileValue nsVolatileValue; + NSVolatile nsVolatile; + NSAtomic nsAtomic; Clock clock(1.0/frequency); TestClock nsClock(nsValue, 1.0/frequency); - TestClock nsVolatileClock(nsVolatileValue, 1.0/frequency); + TestClock nsVolatileClock(nsVolatile, 1.0/frequency); + TestClock nsAtomicClock(nsAtomic, 1.0/frequency); assert(pool.NewThread(&clock, nullptr) != nullptr); assert(pool.NewThread(&nsClock, nullptr) != nullptr); assert(pool.NewThread(&nsVolatileClock, nullptr) != nullptr); + assert(pool.NewThread(&nsAtomicClock, nullptr) != nullptr); fastos::SteadyTimeStamp now = clock.getTimeNSAssumeRunning(); FastOS_Thread::Sleep(100); benchmark(pool, samples, numThreads, [&clock, &now](int64_t i){ return (now+i < clock.getTimeNSAssumeRunning());}); + now = clock.getTimeNSAssumeRunning(); benchmark(pool, samples, numThreads, [&nsValue, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsValue._value));}); - benchmark(pool, samples, numThreads, [&nsVolatileValue, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsVolatileValue._value));}); + now = clock.getTimeNSAssumeRunning(); + benchmark(pool, samples, numThreads, [&nsVolatile, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsVolatile._value));}); + now = clock.getTimeNSAssumeRunning(); + benchmark(pool, samples, numThreads, [&nsAtomic, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsAtomic._value.load(std::memory_order_relaxed)));}); + now = clock.getTimeNSAssumeRunning(); + benchmark(pool, samples, numThreads, [&nsAtomic, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsAtomic._value.load(std::memory_order_consume)));}); + now = clock.getTimeNSAssumeRunning(); + benchmark(pool, samples, numThreads, [&nsAtomic, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsAtomic._value.load(std::memory_order_acquire)));}); + now = clock.getTimeNSAssumeRunning(); + benchmark(pool, samples, numThreads, [&nsAtomic, &now](int64_t i){ return (now+i < fastos::SteadyTimeStamp(nsAtomic._value.load(std::memory_order_seq_cst)));}); benchmark(pool, samples, numThreads, [&now](uint64_t i){ return (now+i < fastos::ClockSteady::now());}); |