如何以毫秒为单位获取当前时间?

Posted

技术标签:

【中文标题】如何以毫秒为单位获取当前时间?【英文标题】:How to get current time in milliseconds? 【发布时间】:2017-04-25 22:23:51 【问题描述】:

我是 C++ 新手,对它的库了解不多。我需要对不同的排序算法进行时间分析,为此我需要以 毫秒 为单位获取当前时间。有什么办法吗?

【问题讨论】:

查看 std::chorno 对于排序算法的分析,毫秒的分辨率可能不够低,而且“当前时间”并不是你真正需要的。您需要执行任务所需的相对时间。 std::chrono::high_resolution_clock 可能就是你想要的。 感谢 gsamaras 的解决方案,只是有点怀疑,因为上面的 cmets 中有人提到当前时间是相对时间,在 java 中当前时间是从 1970 年 1 月 1 日午夜开始计算的,所以 high_resolution_clock::now () 函数返回相对于哪个时间的时间? @YasirMustafa 欢迎您!你的问题很好。至于现在提出的问题,请参阅我的编辑,c++ 中的纪元(εποχή)也相同:Thu Jan 01 01:00:01 1970 How to print current time (with milliseconds) using C++ / C++11的可能重复 【参考方案1】:

只需使用std::chrono。下面的一般示例将任务“打印 1000 颗星”乘以:

#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
 
int main ()

  using namespace std::chrono;
 
  high_resolution_clock::time_point t1 = high_resolution_clock::now();
 
  std::cout << "printing out 1000 stars...\n";
  for (int i=0; i<1000; ++i) std::cout << "*";
  std::cout << std::endl;
 
  high_resolution_clock::time_point t2 = high_resolution_clock::now();
 
  duration<double, std::milli> time_span = t2 - t1;
 
  std::cout << "It took me " << time_span.count() << " milliseconds.";
  std::cout << std::endl;
 
  return 0;

您无需打印星星,而是将排序算法放在那里并进行时间测量。


如果您打算进行一些基准测试,例如,请不要忘记为您的编译器启用优化标志。对于g++,您需要-O3。这很严重,请检查我没有这样做时发生了什么:Why emplace_back is faster than push_back?


Ps:如果您的编译器不支持c++11,那么您可以在我的Time Measurements (C++) 中查看其他方法。


使用我的Quicksort (C++) 的特定(玩具)示例是:

#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

void quickSort(int a[], int first, int last);
int pivot(int a[], int first, int last);
void swap(int& a, int& b);
void swapNoTemp(int& a, int& b);

using namespace std;
using namespace std::chrono;

int main()

    int test[] =  7, -13, 1, 3, 10, 5, 2, 4 ;
    int N = sizeof(test)/sizeof(int);

    cout << "Size of test array :"  << N << endl;

    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    // I want to measure quicksort
    quickSort(test, 0, N-1);

    high_resolution_clock::time_point t2 = high_resolution_clock::now();

    duration<double> time_span = t2 - t1;

    std::cout << "It took me " << time_span.count() << " seconds.";
    std::cout << std::endl;

    return 0;

现在的输出是:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++11 -O3 main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Size of test array :8
It took me 3.58e-07 seconds.

就这么简单。基准测试快乐! =)


编辑:

high_resolution_clock::now()函数返回相对于哪个时间的时间?

来自std::chrono:

时间点

对特定时间点的引用,例如一个 生日,今天的黎明,或者下一班火车经过的时候。在这个 库,time_point 类模板的对象通过 使用相对于 epoch 的持续时间(这是一个固定的时间点 对所有使用相同时钟的 time_point 对象通用)。

哪里可以检查这个epoch and time_point example,它会输出:

time_point tp is: Thu Jan 01 01:00:01 1970

【讨论】:

您可以通过分配到基于双精度的毫秒而不显式转换来简化您的第一个代码块:duration&lt;double, std::milli&gt; time_span = t2 - t1;。然后您可以打印出来,无需手动转换为毫秒:&lt;&lt; time_span.count() &lt;&lt; " milliseconds."。您还可以在第二个示例中删除显式 duration_cast。编写更可靠的chrono 代码的其他技巧在这里:youtube.com/watch?v=P32hvk8b13M【参考方案2】:

简单的工作示例

#include<iostream>
#include<chrono>
using namespace std;
using namespace std::chrono;

void longTask()
    for(auto i = 0; i < INT_MAX; i++)
        //do something;
    

int main()
    auto startTime = high_resolution_clock().now();
    longTask();
    auto stopTime = high_resolution_clock().now();

    //Warning: can't print startTime or stopTime to cout withoutcasting
    //microseconds and milliseconds allowed types in duration_cast

    auto duration = duration_cast<milliseconds>(stopTime - startTime); 
    cout << "Time take to run longTask() in milliseconds: " << duration.count();
    return 0;

输出

以毫秒为单位运行 longTask() 的时间:5274

尽情享受吧!

【讨论】:

【参考方案3】:

您只是要求一种获取当前时间的方法,只需使用以下函数:

#include <chrono>

long double curtime() 
  return std::chrono::duration_cast<std::chrono::milliseconds>(
    std::chrono::system_clock::now().time_since_epoch()
  ).count();

像这样使用它:

int main() 
  long double begin = curtime();
  // do some crazy stuff
  long double end = curtime();
  std::cout << "Executed in " << end - begin << " milliseconds" << std::endl;
  return 0; 

【讨论】:

以上是关于如何以毫秒为单位获取当前时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中以毫秒为单位获取当前时间?

如何以毫秒为单位获取firebase服务器的当前时间戳?

获取Java中的当前时间(以毫秒为单位)(只是时间,而不是日期)

XQuery 中是不是有任何方法可以获取自某个 Epoch 以来的当前时间(以毫秒为单位)?

自Javascript中的unix时代以来,如何以毫秒为单位获取时间? [复制]

Lua - 当前时间(以毫秒为单位)