我有一个perf测试函数的.NET和C++实现,它使用来自6838个键池的字符串键在字典中执行854,750个查找.我编写了这些函数来调查真实应用程序中的性能瓶颈.
.NET实现是用F#编写的,使用Dictionary并为.NET 4.0编译
C++实现使用std :: unordered_map,并在发布模式下使用VS2010构建.
在我的机器上,.NET代码平均运行240毫秒,C++代码运行630毫秒.你能帮我理解速度这个巨大差异的原因是什么?
如果我将C++实现中的密钥长度缩短并使用"key_"前缀而不是"key_prefix_",它将在140毫秒内运行.
我尝试的另一个技巧是用一个自定义的不可变字符串实现替换std :: string,该实现具有指向源的const char*指针和一次性计算的哈希.使用此字符串可以将C++实现的性能降低到190毫秒.
C++代码:
struct SomeData
{
public:
float Value;
};
typedef std::string KeyString;
typedef std::unordered_map<KeyString, SomeData> DictionaryT;
const int MaxNumberOfRuns = 125;
const int MaxNumberOfKeys = 6838;
DictionaryT dictionary;
dictionary.rehash(MaxNumberOfKeys);
auto timer = Stopwatch::StartNew();
int lookupCount = 0;
char keyBuffer[100] = "key_prefix_";
size_t keyPrefixLen = std::strlen(keyBuffer);
/// run MaxNumberOfRuns * MaxNumberOfKeys iterations
for(int runId = 0; runId < MaxNumberOfRuns; runId++)
{
for(int keyId = 0; keyId < MaxNumberOfKeys; keyId++)
{ …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个通用的倒排索引的快速内存实现.我需要的是存储具有几百万个实体的权重的特征,并使用反向索引来计算使用各种距离函数的实体之间的相似性.
我可以在一些快速键值存储中存储实体的所有其他属性.
我希望我可以将Lucene用作倒置索引,但是无法看到我如何将文档与我自己的具有预先计算权重的自定义特征向量相关联.任何建议将不胜感激!
谢谢.