
笔者最近在做LC时,发现用多维vector比用多维数组在运行时间和运行空间上都大了许多,举个栗子
double dp[101][25][25] ={0.0};
vector<vector<vector<double>>> dp_v(101, vector<vector<double>>(25, vector<double>(25, 0.0)));
两者运行时间相差百余ms
通过阅读资料调研发现
慢的原因是数据在内存上存储的方式不同(data locality):
举个栗子,
1)使用二维数组int dp[25][25]的时候,所有数据在内存中是连续存放的。访问内存时,内存访问的局部性较强,Cache命中的概率较大。L1 Cache访问延迟只有几个指令周期,而内存访问延迟则达到几百个指令周期。
2)vector中的数据是连续存放的,但是vector本身只保存指向数据块的指针。vector建立在栈上,保存数据的数据块在堆上。因此二维数组vector<vector<int>>中,指向行的所有指针是连续存放的。每一行的数据是连续存放的,但是行与行之间是不连续存放的。因此跨行访问时局部性降低,Cache命中率下降。所以用时间更多。
本文探讨了在LC项目中,使用二维数组与多维vector在运行时间和空间上的显著差异。重点分析了数据在内存中的存储方式如何影响缓存命中率和性能瓶颈,揭示了vector中行间数据连续性降低的影响。
521

被折叠的 条评论
为什么被折叠?



