这是我过去两天优化和分析的一段代码,因为它花费了太多时间:
{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(TokensDB, tokensArray );
_dbConnection.done();
}
{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(IdxDB, postingsArray);
_dbConnection.done();
}
这postingsArray
是std::vector<BSON (int64_t, int64_t, int64_t, int)>
20 000 个元素。这个插入总是只需要几毫秒。tokensArray
是std::vector<BSON (int64_t, std::string)>
, 5000 个元素。这是奇怪的插入。
如果我完全按照上面的代码片段进行操作,则需要 45-50 毫秒。但是,如果我像最初那样切换两个块(插入IdxDB
第一个和TokensDB
第二个),则需要 400-500 毫秒。这里发生了什么?为什么顺序很重要?为什么插入 5000 个 2-field 记录比插入 20k 4-field 对象花费更长的时间?
我最初的想法是因为std::string
字段(它包含单个英文单词,所以平均大约 5-7 个符号)。我已将其替换为随机int64_t
数 - 插入完成时间没有明显变化。
所有的分析都是在一个干净的数据库上完成的,并且每次都使用完全相同的数据,我不相信这是我组织测量的错误。