最近碰到一个奇怪的问题, 一个简单的R3对象, 存放在std::vector中.
费解的一幕出现了, 如果vv定义的时候, 为每个元素指定初值, 那么后面对vv进行写操作就飞快.
而如果vv定义的时候, 不指定初值, 那么后面对vv写操作的时候, 就花费大约前一种3倍的时间.
大家知道这是什么原因引起的?
ps1. 后来我不用vector, 直接用new : R3* vv = new R3[POPULATION], 发现也有类似的情况. 如果new 了之后, 直接使用这个数组, 第一次访问的时候肯定慢, 第二次访问就快了. 太神奇了.
ps2. 我曾经怀疑, 是否是第一次使用这片内存后, 这片内存以某种机制被缓存了, 于是就在第一次访问和第二次访问之间, 插入了许多读写其他内存的代码, 可是发现第二次访问, 仍然非常块, 还是很神奇.
下面是代码
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <vector>
namespace {
struct R3
{
R3() {}
R3(double x, double y, double z)
{
m_data[0] = x; m_data[1] = y; m_data[2] = z;
}
double m_data[3];
};
static int const POPULATION = 10000000;
inline void time_report (const char* title, clock_t& latest_value)
{
clock_t now = clock();
printf("time elapsed for %s : %.8f(s)\n",
title, (double(now) - double(latest_value)) /CLOCKS_PER_SEC );
latest_value = now;
};
static const bool FILL_WITH_COMP = true;
}
void test_R3_performance()
{
clock_t latest_value = clock();
//std::vector<R3> vv(POPULATION); // <--- uninitialized vector
std::vector<R3> vv(POPULATION , R3{ 0, 0, 0 });
time_report("allocation finished", latest_value);
for (int i = 0; i<POPULATION; ++i)
{
vv[i] = {(double)i*2, (double)i + 4, (double)i + 6};
}
time_report("assignment finished", latest_value);
}
int main()
{
test_R3_performance();
return 0;
}
--
FROM 120.244.224.*