summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@oath.com>2018-08-28 13:16:00 +0200
committerGitHub <noreply@github.com>2018-08-28 13:16:00 +0200
commit663d49621866149e74258d38810d5df8d836f30f (patch)
treebb79d1168670c24d12b00566d885c36c2af24b4a
parent84c5b207a03c3ccad05591af83ba411d7275c631 (diff)
parent9f439eb4ad021e3d0186032a2c1784a89642675a (diff)
Merge pull request #6695 from vespa-engine/havardpe/benchmark-spinlock
added benchmark of spinlock
-rw-r--r--fnet/src/tests/locking/lockspeed.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/fnet/src/tests/locking/lockspeed.cpp b/fnet/src/tests/locking/lockspeed.cpp
index b85777f264c..aa4f6649fd9 100644
--- a/fnet/src/tests/locking/lockspeed.cpp
+++ b/fnet/src/tests/locking/lockspeed.cpp
@@ -3,14 +3,30 @@
#include <vespa/fnet/fnet.h>
#include "dummy.h"
+class SpinLock {
+private:
+ std::atomic_flag _lock;
+public:
+ SpinLock() : _lock(false) {}
+ void lock() {
+ while (_lock.test_and_set(std::memory_order_acquire)) {
+ // spin
+ }
+ }
+ void unlock() { _lock.clear(std::memory_order_release); }
+};
+
TEST("lock speed") {
FastOS_Time start;
FastOS_Time stop;
DummyLock dummy;
std::mutex lock;
+ SpinLock spin;
double dummyTime;
double actualTime;
double overhead;
+ double spin_overhead;
+ double spin_factor;
uint32_t i;
start.SetNow();
@@ -77,10 +93,53 @@ TEST("lock speed") {
overhead = (actualTime - dummyTime) / 10000.0;
+ start.SetNow();
+ for (i = 0; i < 1000000; i++) {
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ spin.lock();
+ spin.unlock();
+ }
+ stop.SetNow();
+ stop -= start;
+ actualTime = stop.MilliSecs();
+
+ fprintf(stderr,
+ "10M actual (spin) lock/unlock: %f ms (%1.2f/ms)\n",
+ stop.MilliSecs(), 10000000.0 / stop.MilliSecs());
+
+ spin_overhead = (actualTime - dummyTime) / 10000.0;
+
+ spin_factor = overhead / spin_overhead;
+
fprintf(stderr,
"approx overhead per lock/unlock: %f microseconds\n",
overhead);
+ fprintf(stderr,
+ "approx overhead per lock/unlock (spin): %f microseconds\n",
+ spin_overhead);
+
+ fprintf(stderr,
+ "spinlocks are %f times faster\n",
+ spin_factor);
+
//---------------------------------------------------------------------------
start.SetNow();