笔者最近在做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命中率下降。所以用时间更多。