baidu_time_unittest.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Licensed to the Apache Software Foundation (ASF) under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. The ASF licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing,
  12. // software distributed under the License is distributed on an
  13. // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. // KIND, either express or implied. See the License for the
  15. // specific language governing permissions and limitations
  16. // under the License.
  17. #include <gtest/gtest.h>
  18. #include "butil/build_config.h"
  19. #if defined(OS_LINUX)
  20. #include <syscall.h> // SYS_clock_gettime
  21. #include <unistd.h> // syscall
  22. #endif
  23. #include "butil/time.h"
  24. #include "butil/macros.h"
  25. #include "butil/logging.h"
  26. namespace {
  27. TEST(BaiduTimeTest, diff_between_gettimeofday_and_REALTIME) {
  28. long t1 = butil::gettimeofday_us();
  29. timespec time;
  30. clock_gettime(CLOCK_REALTIME, &time);
  31. long t2 = butil::timespec_to_microseconds(time);
  32. LOG(INFO) << "t1=" << t1 << " t2=" << t2;
  33. }
  34. const char* clock_desc[] = {
  35. "CLOCK_REALTIME", //0
  36. "CLOCK_MONOTONIC", //1
  37. "CLOCK_PROCESS_CPUTIME_ID", //2
  38. "CLOCK_THREAD_CPUTIME_ID", //3
  39. "CLOCK_MONOTONIC_RAW", //4
  40. "CLOCK_REALTIME_COARSE", //5
  41. "CLOCK_MONOTONIC_COARSE", //6
  42. "CLOCK_BOOTTIME", //7
  43. "CLOCK_REALTIME_ALARM", //8
  44. "CLOCK_BOOTTIME_ALARM", //9
  45. "CLOCK_SGI_CYCLE", //10
  46. "CLOCK_TAI" //11
  47. };
  48. TEST(BaiduTimeTest, cost_of_timer) {
  49. printf("sizeof(time_t)=%lu\n", sizeof(time_t));
  50. butil::Timer t1, t2;
  51. timespec ts;
  52. const size_t N = 200000;
  53. t1.start();
  54. for (size_t i = 0; i < N; ++i) {
  55. t2.stop();
  56. }
  57. t1.stop();
  58. printf("Timer::stop() takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  59. t1.start();
  60. for (size_t i = 0; i < N; ++i) {
  61. clock();
  62. }
  63. t1.stop();
  64. printf("clock() takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  65. long s = 0;
  66. t1.start();
  67. for (size_t i = 0; i < N; ++i) {
  68. s += butil::cpuwide_time_ns();
  69. }
  70. t1.stop();
  71. printf("cpuwide_time() takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  72. t1.start();
  73. for (size_t i = 0; i < N; ++i) {
  74. s += butil::gettimeofday_us();
  75. }
  76. t1.stop();
  77. printf("gettimeofday_us takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  78. t1.start();
  79. for (size_t i = 0; i < N; ++i) {
  80. time(NULL);
  81. }
  82. t1.stop();
  83. printf("time(NULL) takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  84. t1.start();
  85. for (size_t i = 0; i < N; ++i) {
  86. s += butil::monotonic_time_ns();
  87. }
  88. t1.stop();
  89. printf("monotonic_time_ns takes %" PRId64 "ns\n", t1.n_elapsed() / N);
  90. for (size_t i = 0; i < arraysize(clock_desc); ++i) {
  91. #if defined(OS_LINUX)
  92. if (0 == syscall(SYS_clock_gettime, (clockid_t)i, &ts)) {
  93. t1.start();
  94. for (size_t j = 0; j < N; ++j) {
  95. syscall(SYS_clock_gettime, (clockid_t)i, &ts);
  96. }
  97. t1.stop();
  98. printf("sys clock_gettime(%s) takes %" PRId64 "ns\n",
  99. clock_desc[i], t1.n_elapsed() / N);
  100. }
  101. #endif
  102. if (0 == clock_gettime((clockid_t)i, &ts)) {
  103. t1.start();
  104. for (size_t j = 0; j < N; ++j) {
  105. clock_gettime((clockid_t)i, &ts);
  106. }
  107. t1.stop();
  108. printf("glibc clock_gettime(%s) takes %" PRId64 "ns\n",
  109. clock_desc[i], t1.n_elapsed() / N);
  110. }
  111. }
  112. }
  113. TEST(BaiduTimeTest, timespec) {
  114. timespec ts1 = { 0, -1 };
  115. butil::timespec_normalize(&ts1);
  116. ASSERT_EQ(999999999L, ts1.tv_nsec);
  117. ASSERT_EQ(-1, ts1.tv_sec);
  118. timespec ts2 = { 0, 1000000000L };
  119. butil::timespec_normalize(&ts2);
  120. ASSERT_EQ(0L, ts2.tv_nsec);
  121. ASSERT_EQ(1L, ts2.tv_sec);
  122. timespec ts3 = { 0, 999999999L };
  123. butil::timespec_normalize(&ts3);
  124. ASSERT_EQ(999999999L, ts3.tv_nsec);
  125. ASSERT_EQ(0, ts3.tv_sec);
  126. timespec ts4 = { 0, 1L };
  127. butil::timespec_add(&ts4, ts3);
  128. ASSERT_EQ(0, ts4.tv_nsec);
  129. ASSERT_EQ(1L, ts4.tv_sec);
  130. timespec ts5 = { 0, 999999999L };
  131. butil::timespec_minus(&ts5, ts3);
  132. ASSERT_EQ(0, ts5.tv_nsec);
  133. ASSERT_EQ(0, ts5.tv_sec);
  134. timespec ts6 = { 0, 999999998L };
  135. butil::timespec_minus(&ts6, ts3);
  136. ASSERT_EQ(999999999L, ts6.tv_nsec);
  137. ASSERT_EQ(-1L, ts6.tv_sec);
  138. timespec ts7 = butil::nanoseconds_from(ts3, 1L);
  139. ASSERT_EQ(0, ts7.tv_nsec);
  140. ASSERT_EQ(1L, ts7.tv_sec);
  141. timespec ts8 = butil::nanoseconds_from(ts3, -1000000000L);
  142. ASSERT_EQ(999999999L, ts8.tv_nsec);
  143. ASSERT_EQ(-1L, ts8.tv_sec);
  144. timespec ts9 = butil::microseconds_from(ts3, 1L);
  145. ASSERT_EQ(999L, ts9.tv_nsec);
  146. ASSERT_EQ(1L, ts9.tv_sec);
  147. timespec ts10 = butil::microseconds_from(ts3, -1000000L);
  148. ASSERT_EQ(999999999L, ts10.tv_nsec);
  149. ASSERT_EQ(-1L, ts10.tv_sec);
  150. timespec ts11 = butil::milliseconds_from(ts3, 1L);
  151. ASSERT_EQ(999999L, ts11.tv_nsec);
  152. ASSERT_EQ(1L, ts11.tv_sec);
  153. timespec ts12 = butil::milliseconds_from(ts3, -1000L);
  154. ASSERT_EQ(999999999L, ts12.tv_nsec);
  155. ASSERT_EQ(-1L, ts12.tv_sec);
  156. timespec ts13 = butil::seconds_from(ts3, 1L);
  157. ASSERT_EQ(999999999L, ts13.tv_nsec);
  158. ASSERT_EQ(1, ts13.tv_sec);
  159. timespec ts14 = butil::seconds_from(ts3, -1L);
  160. ASSERT_EQ(999999999L, ts14.tv_nsec);
  161. ASSERT_EQ(-1L, ts14.tv_sec);
  162. }
  163. TEST(BaiduTimeTest, every_many_us) {
  164. butil::EveryManyUS every_10ms(10000L);
  165. size_t i = 0;
  166. const long start_time = butil::gettimeofday_ms();
  167. while (1) {
  168. if (every_10ms) {
  169. printf("enter this branch at %" PRId64 "ms\n",
  170. butil::gettimeofday_ms() - start_time);
  171. if (++i >= 10) {
  172. break;
  173. }
  174. }
  175. }
  176. }
  177. TEST(BaiduTimeTest, timer_auto_start) {
  178. butil::Timer t(butil::Timer::STARTED);
  179. usleep(100);
  180. t.stop();
  181. printf("Cost %" PRId64 "us\n", t.u_elapsed());
  182. }
  183. } // namespace