c++ - 确定执行循环所需的 CPU 时间

标签 c++

我做了一些 SO 搜索并找到了 thisthat概述计时方法。

我的问题是我需要确定执行以下循环所需的 CPU 时间(以毫秒为单位):

for (int i = 0, temp = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}

我看过两种方法,clock()stead_clock::now() .根据 docs ,我知道 clock()返回“滴答声”,因此我可以通过使用 CLOCKS_PER_SEC 除以差值在几秒钟内得到它. docs还要提到 steady_clock专为间隔计时而设计,但您必须调用duration_cast<milliseconds>更改其单位。

我为两者计时所做的事情(因为在同一次运行中同时进行两者可能会导致一个花费更长的时间,因为另一个被首先调用)是单独运行它们:

clock_t t = clock();
for (int i = 0, temp = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}
t = clock() - t;
cout << (float(t)/CLOCKS_PER_SEC) * 1000 << "ms taken" << endl;

chrono::steady_clock::time_point p1 = chrono::steady_clock::now();
for (int i = 0, temp = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}
chrono::steady_clock::time_point p2 = chrono::steady_clock::now();
cout << chrono::duration_cast<milliseconds>(p2-p1).count() << "ms taken" << endl;

输出:

0ms taken
0ms taken

这两种方法都能降低结果吗?肯定发生了一些毫秒分形?

那么对于确定执行循环所需的 CPU 时间来说,哪个是理想的(或者更合适的)?乍一看,我会赞成 clock()因为文档明确告诉我它用于确定 CPU 时间。

对于上下文,我的 CLOCKS_PER_SEC持有值(value) 1000 .

编辑/更新:

尝试了以下方法:

clock_t t = clock();
for (int j = 0; j < 1000000; j++) {
    volatile int temp = 0;
    for (int i = 0; i < 10000; i++)
    {
        if (i % 2 == 0)
        {
            temp = (i / 2) + 1;
        }
        else
        {
            temp = 2 * i;
        }
    }
}
t = clock() - t;
cout << (float(t) * 1000.0f / CLOCKS_PER_SEC / 1000000.0f) << "ms taken" << endl;

输出:0.019953 毫秒

clock_t start = clock();
volatile int temp = 0;
for (int i = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}
clock_t end = clock();
cout << fixed << setprecision(2) << 1000.0 * (end - start) / CLOCKS_PER_SEC << "ms taken" << endl;

输出:0.00 毫秒

chrono::high_resolution_clock::time_point p1 = chrono::high_resolution_clock::now();
volatile int temp = 0;
for (int i = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}
chrono::high_resolution_clock::time_point p2 = chrono::high_resolution_clock::now();
cout << (chrono::duration_cast<chrono::microseconds>(p2 - p1).count()) / 1000.0 << "ms taken" << endl;

输出:耗时 0.072 毫秒

chrono::steady_clock::time_point p1 = chrono::steady_clock::now();
volatile int temp = 0;
for (int i = 0; i < 10000; i++)
{
    if (i % 2 == 0)
    {
        temp = (i / 2) + 1;
    }
    else
    {
        temp = 2 * i;
    }
}
chrono::steady_clock::time_point p2 = chrono::steady_clock::now();
cout << (chrono::duration_cast<chrono::microseconds>(p2 - p1).count()) / 1000.0f << "ms taken" << endl;

输出:0.044ms

那么问题就变成了,哪个有效?第二种方法对我来说似乎无效,因为我认为循环完成的速度超过一毫秒。

我理解第一种方法(只是执行时间更长),但后两种方法产生截然不同的结果。

我注意到的一件事是,在编译程序后,我第一次运行它时,一开始我可能会得到 0.073 毫秒(对于 high_resolution_clock )和 0.044 毫秒(对于 steady_clock ),但所有后续运行时间在 0.019 - 0.025 毫秒范围内。

最佳答案

你可以循环一百万次,然后除法。您还可以添加 volatile 关键字以避免某些编译器优化。

clock_t t = clock();
for (int j = 0, j < 1000000; j++) {
    volatile int temp = 0;
    for (int i = 0; i < 10000; i++)
    {
        if (i % 2 == 0)
        {
            temp = (i / 2) + 1;
        }
        else
        {
            temp = 2 * i;
        }
    }
}
t = clock() - t;
cout << (float(t) * 1000.0f / CLOCKS_PER_SEC / 1000000.0f) << "ms taken" << endl;

关于c++ - 确定执行循环所需的 CPU 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51267565/

相关文章:

c++ - 为什么数组模板迭代器声明需要指定数组大小?

c++ - C++ 中的长手乘法

c++ - 有没有像 bits_in_byte (8) 这样的常量?

c++ - winapi - 获取和/或更改我的钩子(Hook)的顺序和优先级

c++ - 用三元计算的重载函数

c++ - 将 BYTE 缓冲区的特定部分复制到结构+

c++ - C2143 : syntax error: missing ';' before '*' & C4430: missing type specifier - int assumed. 注意:C++ 不支持default-int

c++ - C 和 C++ : Freeing PART of an allocated pointer

c++ - 使用 find 搜索字符串中是否存在空格

c++ - 派生可变参数类模板的调用函数模板重载