如何在C++中测量内存分配的持续时间?

icnyk63a  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(131)

我尝试的任何整数分配(改变数组的大小),结果时间仍然是0纳秒。
代码如下:

#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

int* memory_allocation()
{
  int *allocated_ints = new int[1000000];
  return allocated_ints;
}

int main()
{
   high_resolution_clock::time_point t0 = high_resolution_clock::now();

   int *p = memory_allocation();

   high_resolution_clock::time_point t1 = high_resolution_clock::now();
   
   nanoseconds ns = duration_cast<nanoseconds>(t1 - t0);
   std::cout << ns.count() << "ns\n";

   delete[] p;

   return 0;
}

此外,我尝试将内存分配封装在1000000百万for循环中,但问题是,由于堆空间的原因,我还必须重新分配它,导致还测量“删除”操作的时间。
真的有可能这么小吗?如果是的话,还有其他方法可以测量吗?

kxeu7u2r

kxeu7u2r1#

根据您的CPU速度,实际时间分辨率和其他一些平台的具体情况,分配可以那么快-比您的高分辨率计时器分辨率更快。
正如这里提到的,它不是物理存储的分配。在调用new[]之后,内存实际上并没有立即为您的进程保留。它只是在你的进程虚拟内存空间中分配。这就是为什么它很快。
根据您的平台,您可以使用CPU硬件时钟来更精确地测量时间。在x86体系结构上,有RDTSC命令,它提供对CPU滴答计数器的访问。它的问题是现代CPU会根据负载改变其时钟速度。无论如何,这是你能用的最精确的东西。在C++代码中,可以通过ASM块或__rdtsc()等内部函数访问它。下面是Visual Studio的代码。

#include <iostream>
#include <chrono>
#include <limits>
#include <algorithm>
#include <intrin.h> // Platform specific, gives __rdtsc()

using namespace std;
using namespace chrono;

auto memory_allocation(size_t n) -> auto
{
    auto memory = new byte[n];
    return memory;
}

int main()
{
    // Estimate the best time clock resolution
    auto t0 = high_resolution_clock::now();
    decltype(t0) t1;
    do
    {
        t1 = high_resolution_clock::now();
    } while (t1 == t0);

    auto resolution = duration_cast<nanoseconds>(t1 - t0);
    cout << "Time clock resolution: " << resolution << endl;

    for (size_t n = 0; n <= 1'000'000'000; n = n ? n * 10 : 1)
    {
        auto best_dx = numeric_limits<decltype(__rdtsc())>::max(); // the type is uint64
        auto best_ns = high_resolution_clock::duration::max();

        for (int i = 0; i != 1000; ++i)
        {
            auto t0 = high_resolution_clock::now();
            auto x = __rdtsc();

            auto p = memory_allocation(n);

            auto dx = __rdtsc() - x;
            auto t1 = high_resolution_clock::now();

            delete[] p;

            auto ns = duration_cast<nanoseconds>(t1 - t0);
            best_dx = min(best_dx, dx);
            best_ns = min(best_ns, ns);
        }

        cout << n << ", " << best_dx << ", " << best_ns << endl;
    }

    return 0;
}

下面是我的机器的结果:

Time resolution: 100ns
0, 72, 0ns
1, 72, 0ns
10, 90, 0ns
100, 290, 100ns
1000, 306, 100ns
10000, 306, 100ns
100000, 264, 100ns
1000000, 234, 100ns
10000000, 9242, 3200ns
100000000, 10462, 3600ns
1000000000, 22240, 7600ns

相关问题