我尝试的任何整数分配(改变数组的大小),结果时间仍然是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循环中,但问题是,由于堆空间的原因,我还必须重新分配它,导致还测量“删除”操作的时间。
真的有可能这么小吗?如果是的话,还有其他方法可以测量吗?
1条答案
按热度按时间kxeu7u2r1#
根据您的CPU速度,实际时间分辨率和其他一些平台的具体情况,分配可以那么快-比您的高分辨率计时器分辨率更快。
正如这里提到的,它不是物理存储的分配。在调用
new[]
之后,内存实际上并没有立即为您的进程保留。它只是在你的进程虚拟内存空间中分配。这就是为什么它很快。根据您的平台,您可以使用CPU硬件时钟来更精确地测量时间。在x86体系结构上,有RDTSC命令,它提供对CPU滴答计数器的访问。它的问题是现代CPU会根据负载改变其时钟速度。无论如何,这是你能用的最精确的东西。在C++代码中,可以通过ASM块或
__rdtsc()
等内部函数访问它。下面是Visual Studio的代码。下面是我的机器的结果: