差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
softwares:nestdaq:cplusplus [2024/01/24 16:25] – [型を調べる] kobayashsoftwares:nestdaq:cplusplus [2024/02/02 16:19] (現在) – [std::chrono ライブラリ] kobayash
行 35: 行 35:
   * 参考: Stack Overflow -- platform-specific std::chrono::high_resolution_clock::period::num https://stackoverflow.com/questions/47687645/platform-specific-stdchronohigh-resolution-clockperiodnum   * 参考: Stack Overflow -- platform-specific std::chrono::high_resolution_clock::period::num https://stackoverflow.com/questions/47687645/platform-specific-stdchronohigh-resolution-clockperiodnum
   * 参考: Stack Overflow -- Different behaviour of system_clock on windows and linux https://stackoverflow.com/questions/55120594/different-behaviour-of-system-clock-on-windows-and-linux   * 参考: Stack Overflow -- Different behaviour of system_clock on windows and linux https://stackoverflow.com/questions/55120594/different-behaviour-of-system-clock-on-windows-and-linux
 +=== std::chrono ライブラリクロックの違い ===
 +  * 以下のようなコードを書く<code>
 +#include <iostream>
 +#include <thread>
 +#include <chrono>
  
 +int main(int argc,char *argv[]){
 +  std::chrono::system_clock::time_point          system_clock_start = std::chrono::system_clock::now();
 +  std::chrono::steady_clock::time_point          steady_clock_start = std::chrono::steady_clock::now();
 +  std::chrono::high_resolution_clock::time_point h_reso_clock_start = std::chrono::high_resolution_clock::now();
 +  std::chrono::nanoseconds system_clock_start_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (system_clock_start.time_since_epoch());
 +  std::chrono::nanoseconds steady_clock_start_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (steady_clock_start.time_since_epoch());
 +  std::chrono::nanoseconds h_reso_clock_start_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (h_reso_clock_start.time_since_epoch());
 +
 +  for (int i = 0; i < 100; i++) {
 +    std::chrono::system_clock::time_point          system_clock_now = std::chrono::system_clock::now();
 +    std::chrono::steady_clock::time_point          steady_clock_now = std::chrono::steady_clock::now();
 +    std::chrono::high_resolution_clock::time_point h_reso_clock_now = std::chrono::high_resolution_clock::now();
 +    std::chrono::nanoseconds system_clock_now_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (system_clock_now.time_since_epoch());
 +    std::chrono::nanoseconds steady_clock_now_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (steady_clock_now.time_since_epoch());
 +    std::chrono::nanoseconds h_reso_clock_now_epoch = std::chrono::duration_cast<std::chrono::nanoseconds> (h_reso_clock_now.time_since_epoch());
 +    std::chrono::nanoseconds system_clock_duration  = std::chrono::duration_cast<std::chrono::nanoseconds> (system_clock_now - system_clock_start);
 +    std::chrono::nanoseconds steady_clock_duration  = std::chrono::duration_cast<std::chrono::nanoseconds> (steady_clock_now - steady_clock_start);
 +    std::chrono::nanoseconds h_reso_clock_duration  = std::chrono::duration_cast<std::chrono::nanoseconds> (h_reso_clock_now - h_reso_clock_start);
 +    
 +
 +    std::time_t now = std::chrono::system_clock::to_time_t(system_clock_now);
 +    std::string s(30, '\0');
 +    std::strftime(&s[0], s.size(), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
 +
 +    std::cout << "system_clock_now: " << s << std::endl;
 +    std::cout << "system_clock_now_epoch.count(): " << system_clock_now_epoch.count() << std::endl;
 +    std::cout << "steady_clock_now_epoch.count(): " << steady_clock_now_epoch.count() << std::endl;
 +    std::cout << "h_reso_clock_now_epoch.count(): " << h_reso_clock_now_epoch.count() << std::endl;
 +    std::cout << "system_clock_duration.count(): << system_clock_duration.count() << std::endl;
 +    std::cout << "steady_clock_duration.count(): << steady_clock_duration.count() << std::endl;
 +    std::cout << "h_reso_clock_duration.count(): << h_reso_clock_duration.count() << std::endl;
 +    std::cout << std::endl;
 +
 +    std::this_thread::sleep_for(std::chrono::seconds(1));
 +  }
 +  return 0;
 +}
 +</code>
 +  * macOS 12.3.1 でシステムの時計をずらせるように、network の時刻同期を切る。<code>
 +$ sudo systemsetup -setusingnetworktime off
 +2024-02-02 15:09:51.126 systemsetup[23124:12338196] ### Error:-99 File:/AppleInternal/Library/BuildRoots/66382bca-8bca-11ec-aade-6613bcf0e2ee/Library/Caches/com.apple.xbs/Sources/Admin/InternetServices.m Line:379
 +setUsingNetworkTime: Off
 +</code>
 +  * macOS 12.3.1 上でコードを実行する。<code>$ ./std_chrono_comp_clocks 
 +system_clock_now: 2024-02-02 15:56:02
 +system_clock_now_epoch.count(): 1706856962044809000
 +steady_clock_now_epoch.count(): 3446501139918415
 +h_reso_clock_now_epoch.count(): 3446501139918476
 +system_clock_duration.count(): 3000
 +steady_clock_duration.count(): 2728
 +h_reso_clock_duration.count(): 2706
 +
 +system_clock_now: 2024-02-02 15:56:03
 +system_clock_now_epoch.count(): 1706856963050483000
 +steady_clock_now_epoch.count(): 3446502145634015
 +h_reso_clock_now_epoch.count(): 3446502145634132
 +system_clock_duration.count(): 1005677000
 +steady_clock_duration.count(): 1005718328
 +h_reso_clock_duration.count(): 1005718362
 +
 +system_clock_now: 2024-02-02 15:56:04
 +system_clock_now_epoch.count(): 1706856964055087000
 +steady_clock_now_epoch.count(): 3446503150279622
 +h_reso_clock_now_epoch.count(): 3446503150279705
 +system_clock_duration.count(): 2010281000
 +steady_clock_duration.count(): 2010363935
 +h_reso_clock_duration.count(): 2010363935
 +</code>
 +  * コードを実行中に、別の端末で、コードの実行開始時間より前の時間にシステムの時刻を変更する。<code>
 +$ sudo systemsetup -settime 15:56:00
 +2024-02-02 15:56:00.000 systemsetup[24235:12388285] ### Error:-99 File:/AppleInternal/Library/BuildRoots/66382bca-8bca-11ec-aade-6613bcf0e2ee/Library/Caches/com.apple.xbs/Sources/Admin/InternetServices.m Line:379
 +Set Time: 15:56:00
 +</code>
 +  * その後、テストコードの出力を見ると、system_clock_duration.count()がマイナスの値になるが、steady_cklock と high_resolustion_clockは影響されない。<code>
 +system_clock_now: 2024-02-02 15:56:01
 +system_clock_now_epoch.count(): 1706856961000765000
 +steady_clock_now_epoch.count(): 3446504154296655
 +h_reso_clock_now_epoch.count(): 3446504154296770
 +system_clock_duration.count(): -1044041000
 +steady_clock_duration.count(): 3014380968
 +h_reso_clock_duration.count(): 3014381000
 +
 +system_clock_now: 2024-02-02 15:56:02
 +system_clock_now_epoch.count(): 1706856962003841000
 +steady_clock_now_epoch.count(): 3446505157415128
 +h_reso_clock_now_epoch.count(): 3446505157415217
 +system_clock_duration.count(): -40965000
 +steady_clock_duration.count(): 4017499441
 +h_reso_clock_duration.count(): 4017499447
 +
 +system_clock_now: 2024-02-02 15:56:03
 +system_clock_now_epoch.count(): 1706856963007809000
 +steady_clock_now_epoch.count(): 3446506161423906
 +h_reso_clock_now_epoch.count(): 3446506161423991
 +system_clock_duration.count(): 963003000
 +steady_clock_duration.count(): 5021508219
 +h_reso_clock_duration.count(): 5021508221
 +</code> これをみると、std::chrono::high_resolution_clock は std::chrono::steady_clock の別名のようだ。また、Ubuntu MATE 22.03.3 LTS で実行すると、以下のようになる。<code>
 +$ ./std_chrono_comp_clocks 
 +system_clock_now: 2024-02-02 16:18:15
 +system_clock_now_epoch.count(): 1706858295484039608
 +steady_clock_now_epoch.count(): 1109260620490710
 +h_reso_clock_now_epoch.count(): 1706858295484039845
 +system_clock_duration.count(): 1217
 +steady_clock_duration.count(): 958
 +h_reso_clock_duration.count(): 945
 +
 +system_clock_now: 2024-02-02 16:18:16
 +system_clock_now_epoch.count(): 1706858296484348873
 +steady_clock_now_epoch.count(): 1109261620800102
 +h_reso_clock_now_epoch.count(): 1706858296484349263
 +system_clock_duration.count(): 1000310482
 +steady_clock_duration.count(): 1000310350
 +h_reso_clock_duration.count(): 1000310363
 +
 +system_clock_now: 2024-02-02 16:18:17
 +system_clock_now_epoch.count(): 1706858297484600085
 +steady_clock_now_epoch.count(): 1109262621051266
 +h_reso_clock_now_epoch.count(): 1706858297484600429
 +system_clock_duration.count(): 2000561694
 +steady_clock_duration.count(): 2000561514
 +h_reso_clock_duration.count(): 2000561529
 +...
 +</code> これを見ると、std::chrono::high_resolution_clock は std::chrono::system_clock の別名のようだ。
 +
 +
 +==== Arrow operator (->) in the function declaration ====
 +  * nestdaq/plugins/TimeUtil.h と TimeUtil.cxx で以下の書き方を見た。<code>
 +auto update_date(const std::chrono::system_clock::time_point &s,
 +                 const std::chrono::steady_clock::time_point &t)
 +-> const std::pair<std::chrono::nanoseconds, std::chrono::system_clock::time_point>;
 +</code> この関数を宣言している部分の 矢印 (->) は、関数の戻り値の型を定義しているようだ。
 +    * 参考: https://stackoverflow.com/questions/22514855/arrow-operator-in-function-heading
 +    * 参考: https://stackoverflow.com/questions/4113365/what-does-mean-in-c/4113390#4113390
softwares/nestdaq/cplusplus.1706081155.txt.gz · 最終更新: 2024/01/24 16:25 by kobayash
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0