- 主题:这个编译器会优化吗?如果不会,自己怎么优化?
简而言之,我从一个队列中取数据
while (!shutdown)
{
std::vector<std::string> dataArray;
dataArray.reverse(16);
int dataSize = q.dequeue_bulk(dataArray, dataArraySize);
}
每次循环都要对 vector revese,代价是不是很高?如果把 vector 定义在循环外面,那么每次取到数据后,怎么清空数据?用 clear 会导致 vector 里面的元素调用析构带来性能损失。用 resize (0) 是否能达到效果?
std::vector<std::string> dataArray;
dataArray.reverse(16);
while (!shutdown)
{
int dataSize = q.dequeue_bulk(dataArray, dataArraySize);
// process data
dataArray.resize(0); // 这样是否可行?
}
--
FROM 54.241.198.*
,?确定不是reserve?
--
FROM 111.181.1.*
啊,你没看清楚我的问题吧。。。
【 在 lwp 的大作中提到: 】
: ,?确定不是reserve?
--
FROM 218.76.62.*
你单词拼写错误,reserve不是reverse
reserve()提到循环外面是对的。
但析构都不要,这种优化确实有必要不?不要做没必要的优化。
如果这个循环是time-critical的,那你最好是自己预分配一块大的buffer,里面直接放各个字符串,外加一个偏移索引数组,不用std::string和std::vector。最好是和队列里的数据的存储一起考虑优化,不用频繁分配释放内存。
resize(0)也会把那个16个(或者少于16)std::string析构的
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
haha ,是的,写错了。
算了,那我就不调用 reverse 了。
【 在 z16166 的大作中提到: 】
: 你单词拼写错误,reserve不是reverse
: reserve()提到循环外面是对的。
: 但析构都不要,这种优化确实有必要不?不要做没必要的优化。
: ...................
--
FROM 218.76.62.*
dequeue_bulk里用了move来拷贝串就够了
--
FROM 175.188.167.*
vector存shared_ptr呢?
--
FROM 223.104.44.*
不考虑你是否写错了函数名字,单纯看这个代码,如果函数内部实现没有多大问题,性能的数量级就这样了。程序性能瓶颈通常不应该在这里。
--
FROM 183.192.237.*