数组大小和类型对运行时间的影响的探讨
气死偶勒
挖坑,以后再来填
该填下坑了,事情是这样的,就是说,因为一些不可抗力,我们来探讨一下下面两种写法对代码运行时间的影响。(假设两种情况都不会导致数组越界)。
int vis[10005][10005];
for(int i=1;i<=1000;i++)memset(vis,0,sizeof(vis));
bool vis[5005][5005];
for(int i=1;i<=1000;i++)memset(vis,0,sizeof(vis));
测试
下面是测试结果(未加任何优化):
可以看到第二种的优势十分明显,显然是在 memset
上面出了问题。
但这是为什么?
原理
众所周知, memset
的原理是擦字节,时间复杂度为 $O(n)$ , $n$ 为要擦的字节数量。
1个 int
4字节,但1个 bool
1字节。
再算上数组的大小,刚好是16倍。
这个故事告诉我们,如果不知道什么原因T了,好好检查一下你的 memset
。
附录
其实还可以根据上面的数据算出 memset
1秒可以擦多少字节。
略去计算过程,易得, memset
1秒可以擦约 $10^{10}$ 个字节,约 $2\times 10^9$ 个 int
。