我总是在分配一些内存时读取新内容很慢,但从来没有发现它有多慢。所以我开始进行一些研究和测试。
假设我有一个缓冲区,它是一个向量(例如用于以太网接收器)。
所以现在我的问题是哪个更快。在搜索网络时,我没有真正找到任何基准或其他东西。所以我开始做一些测试。
2个varint不是接收器!
复制变体
auto time = GetTickCount();
std::vector<int> vec;
std::vector<int> tmp(250);
for(int i=0; i<10000; i++) {
for(int i=0; i<1000; i++) {
vec.insert(vec.end(), tmp.begin(), tmp.end());
//std::copy(tmp.begin(), tmp.end(), std::back_inserter(vec1));
}
vec.clear();
}
std::cout << GetTickCount() - time << std::endl;
移动变体
auto time = GetTickCount();
std::vector<std::vector<int> > vec;
for(int i=0; i<10000; i++) {
for(int i=0; i<1000; i++) {
std::vector<int> tmp(250);
vec.push_back(std::move(tmp));
}
vec.clear();
}
std::cout << GetTickCount() - time << std::endl;
我知道分配内存取决于硬件,操作系统和内存管理,但平均时间我可以说创建一个新的并移动它比复制现有的更好吗?在我的测试中,我发现应对具有250个元素的向量需要与移动大约相同的时间,并且超过250个元素的复制变体比移动的要慢。确保在我的测试中,移动变量是向量的向量,并且迭代更加困难,但这在我(大多数情况下)的情况下无关紧要。测试也是使用int而不是某些结构或类会使问题复杂化。
我的测试也是(快速和脏)在Windows机器上。我的兴趣是平均时间(或在我的条件下,大小)为虚拟硬件和ussual系统(windows,linux,mac)。
我可以接受我的测试并说复制超过400个元素比创建一个新元素慢吗?
Neil Kirk建议我尝试随机大小分配,所以我做了。我还插入了一些其他的东西,在测试和平均大小之间进行分配(但没有删除),大约是 1000 元素。
我接受Mats Petersson的回答,特别是在阅读this(和子链接)和this之后(旁边是唯一一个)。但我有一个补充:你不知道它是否是过早优化没有任何估价。如果一个alloc会花费相同的时间来复制100000个元素我永远不会使用它,否则如果它需要相同的时间来复制10个元素,我会一直使用它。但是在网络场景中我有1000个元素的近似值,我将网络作为瓶颈,我可以说它是过早的优化。所以我决定使用ne分配变体,因为它在我的概念中更有用。
答案 0 :(得分:1)
这是“过早优化”的典型案例。找出代码的这一部分是否是性能方面的重要因素。如果不是,那就不要担心 - 从手头的实际任务做最有意义的事情。
一般来说,分配内存的速度相当快 - 除了基本类型(int
,char
等)以外的任何其他内容,主要因素可能是创建/复制/移动内存所需的时间。进入向量的对象,而不是基本分配。