|  | // Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "base/test/perf_log.h" | 
|  | #include "mojo/edk/system/ref_counted.h" | 
|  | #include "mojo/edk/system/test_utils.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace mojo { | 
|  | namespace system { | 
|  | namespace { | 
|  |  | 
|  | class MyClass : public RefCountedThreadSafe<MyClass> { | 
|  | public: | 
|  | static RefPtr<MyClass> Create() { | 
|  | return RefPtr<MyClass>(AdoptRef(new MyClass())); | 
|  | } | 
|  |  | 
|  | private: | 
|  | friend class RefCountedThreadSafe<MyClass>; | 
|  |  | 
|  | MyClass() {} | 
|  | ~MyClass() {} | 
|  | }; | 
|  |  | 
|  | TEST(RefCountedPerfTest, OneThreadCreateAdoptDestroy) { | 
|  | uint64_t iterations = 0; | 
|  | test::Stopwatch stopwatch; | 
|  | stopwatch.Start(); | 
|  | do { | 
|  | for (size_t i = 0; i < 1000; i++, iterations++) { | 
|  | RefPtr<MyClass> x = MyClass::Create(); | 
|  | x = nullptr; | 
|  | } | 
|  | iterations++; | 
|  | } while (stopwatch.Elapsed() < test::DeadlineFromMilliseconds(1000)); | 
|  | double elapsed = stopwatch.Elapsed() / 1000000.0; | 
|  |  | 
|  | base::LogPerfResult("OneThreadCreateAdoptDestroy", iterations / elapsed, | 
|  | "iterations/s"); | 
|  | } | 
|  |  | 
|  | TEST(RefCountedPerfTest, OneThreadAssignRefPtr) { | 
|  | RefPtr<MyClass> x = MyClass::Create(); | 
|  | uint64_t iterations = 0; | 
|  | test::Stopwatch stopwatch; | 
|  | stopwatch.Start(); | 
|  | do { | 
|  | for (size_t i = 0; i < 1000; i++, iterations++) { | 
|  | RefPtr<MyClass> y = x; | 
|  | } | 
|  | iterations++; | 
|  | } while (stopwatch.Elapsed() < test::DeadlineFromMilliseconds(1000)); | 
|  | double elapsed = stopwatch.Elapsed() / 1000000.0; | 
|  |  | 
|  | base::LogPerfResult("OneThreadAssignRefPtr", iterations / elapsed, | 
|  | "iterations/s"); | 
|  | } | 
|  |  | 
|  | // TODO(vtl): Add threaded perf tests. | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace system | 
|  | }  // namespace mojo |