【 在 xieyf (绿蚁新醅酒,红泥小火炉) 的大作中提到: 】
: 标 题: std::vector中初始化与否导致性能差异巨大
: 发信站: 水木社区 (Sun Feb 27 00:58:26 2022), 站内
:
: 最近碰到一个奇怪的问题, 一个简单的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() = default;
看不会影响优化结果?
:
: 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;
: }
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 120.244.224.*]
--
FROM 73.223.52.*