Add performance tests for rtc::Event.

Bug: webrtc:8546
Change-Id: Ic069b213b5c0d83123a6506f10c597cf73396459
Reviewed-on: https://webrtc-review.googlesource.com/23960
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20797}
diff --git a/rtc_base/event_unittest.cc b/rtc_base/event_unittest.cc
index 5a2f844..a9324a0 100644
--- a/rtc_base/event_unittest.cc
+++ b/rtc_base/event_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "rtc_base/event.h"
 #include "rtc_base/gunit.h"
+#include "rtc_base/platform_thread.h"
 
 namespace rtc {
 
@@ -39,4 +40,55 @@
   ASSERT_FALSE(event.Wait(0));
 }
 
+class SignalerThread {
+public:
+  SignalerThread() : thread_(&ThreadFn, this, "EventPerf") {}
+  void Start(Event* writer, Event* reader) {
+    writer_ = writer;
+    reader_ = reader;
+    thread_.Start();
+  }
+  void Stop() {
+    stop_event_.Set();
+    thread_.Stop();
+  }
+  static void ThreadFn(void *param) {
+    auto* me = static_cast<SignalerThread*>(param);
+    while(!me->stop_event_.Wait(0)) {
+      me->writer_->Set();
+      me->reader_->Wait(Event::kForever);
+    }
+  }
+  Event stop_event_{false, false};
+  Event* writer_;
+  Event* reader_;
+  PlatformThread thread_;
+};
+
+// These tests are disabled by default and only intended to be run manually.
+TEST(EventTest, PerformanceSingleThread) {
+  static const int kNumIterations = 10000000;
+  Event event(false, false);
+  for (int i = 0; i < kNumIterations; ++i) {
+    event.Set();
+    event.Wait(0);
+  }
+}
+
+TEST(EventTest, PerformanceMultiThread) {
+  static const int kNumIterations = 10000;
+  Event read(false, false);
+  Event write(false, false);
+  SignalerThread thread;
+  thread.Start(&read, &write);
+
+  for (int i = 0; i < kNumIterations; ++i) {
+    write.Set();
+    read.Wait(Event::kForever);
+  }
+  write.Set();
+
+  thread.Stop();
+}
+
 }  // namespace rtc