int main() {
std::vector<std::list<double>> _vector;
for (int i = 0; i < 100000000; i++)
{
std::list<double> _list;
_list.push_back(1.0);
_list.push_back(2.0);
_list.push_back(3.0);
_list.push_back(4.0);
_list.push_back(5.0);
std::cout << "插入第" << i << "个值" << std::endl;
_vector.push_back(_list);
}
}
用 java 重写。
?????
@禅元天道: java 是世界上最好的语言,用 java 重写,你不亏啊。[手动狗头]
int main() {
std::vector<std::list<double>> _vector;
for (int i = 0; i < 100000000; i++)
{
std::list<double> _list;
for(double j=1.0;j<=5.0;j++){
_list.push_back(1.0);
}
std::cout << "插入第" << i << "个值" << std::endl;
_vector.push_back(_list);
}
}
除了五个push_back可以写成循环感觉没什么可优化的了
5个push_back只是一个示例,没抓住重点
int main() {
std::vector<std::list<double>> _vector;
for (int i = 0; i < 100000000; i++)
{
std::list<double> _list;
_list.push_back(i%5+1,0);
std::cout << "插入第" << i << "个值" << std::endl;
_vector.push_back(_list);
}
}
这样可行?
if __name__ =="__main__":
for i in range(1,10000000):
print(i%5+1)
结果:
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1
很明显你被楼上误导了,没抓住重点
@禅元天道: 哥,你这里就是数据追加吧,
我要看看 后面的大佬咋优化
这个跟 net 类似吧
初始化 一个 list,然后填充十万次
list<user> userlist=new list<user>(){};
for(int i =0,i++, i<10000000){
user u=new (){
id =i
}
userlist.appent(u)
}
这样的问题我也想问咋优化 呜呜呜
std::vector<std::list<double>> _vector;
_vector.reserve(100000000);
for (int i = 0; i < 100000000; ++i) {
_vector.emplace_back(std::list<double>{1.0, 2.0, 3.0, 4.0, 5.0});
}
C++11的话可以写成这样
还可以再优化 你的list 每次循环都构造析构,可以在循环外面创建好,这样只是每次循环copy构造一次。
如果只考虑尾部插入元素的话, std::vector
或许不是一个好的选择,我们如果选择 std::list
的话,性能将是质的改变。同时也应该考虑减少内存的开辟和销毁操作。代码如下:
std::list<double> _cache; // Reduce memory operations.
std::list<std::list<double>> _list;
clock_t start_time = clock(); // Timer to quantify performance.
while(_list.size() < 10000000)
{
_cache.clear();
while(_cache.size() < 5)
{
// Example behavior, this statement will cause partial performance waste.
_cache.push_back(_cache.size() + 1.0);
}
// It is not recommended to output debugging information here, which will cause huge performance pressure
// std::cout << "插入第" << _list.size() + 1 << "个值" << std::endl;
_list.push_back(_cache);
}
std::cout << "t-list time: " << clock() - start_time << std::endl;
我尝试将测试量减少到 1000000
,测试得到的结果相差很大,std::list
明显优异于 std::vector
,其实不难理解,std::list
是开辟一份新的数据节点介入到尾部,而 std::vector
在内部开辟的空间不足时,会从开辟一份新的,更大的空间来存放数据,并且会将以前的数据拷贝到新的内存空间,然后将旧的空间析构,这无疑是一份巨大的负担。
以下测试结果是在测试量为 1000000
,且在 Debug
模式下的结果。
作者原始代码消耗时间: 18121
我提交的代码消耗时间: 7693
以下测试结果是在测试量为 1000000
,且在 Release
模式下的结果。
作者原始代码消耗时间: 1420
我提交的代码消耗时间: 571