我试图比较2个大向量(整数),即在每个条目,看看两个向量是否具有相同的元素。我尝试了一些东西,使用迭代器进行比较和一个简单的for循环。两者都有效,但我需要一些可以加速的东西,因为我必须比较很多向量。在C ++中最好的方法是什么?非常感谢提前!
typedef vector<int> fingerprint;
double aakernel(fingerprint a,fingerprint b, double h){
double diff = 0;
vector<int>::iterator dd = a.begin();
vector<int>::iterator ee = b.begin();
for(; dd != a.end() && ee != b.end() ;++dd, ++ee){ /*option one*/
if (*dd!=*ee){
diff++;
}
}
for (int dd=0;dd<int(a.size());dd++){ /*option two*/
if (a[dd]!=b[dd]){
diff++;
}
}
double due = (h/(1-h));
double q = -log(due)*diff;
double K = exp(q);
return (K);
}
答案 0 :(得分:3)
如果向量是任意的,那么就不能渐渐地比顺序比较所有元素,就像现在这样做。因此,您将继续进行微优化,这可能会或可能不会提高性能(取决于编译器的优化器如何处理它们)。
我唯一能想到的就是将不变的评估从循环中取出。 (也许还没有在类型++
上使用double
,但我相信编译器无论如何都会以最优的方式处理它:)
double diff = 0;
for (
auto itA = a.begin(), itB = b.begin(), endA = a.end();
itA != endA;
++itA, ++itB
) {
if (*itA != *itB) {
diff += 1.0;
}
}
答案 1 :(得分:2)
1)你可以通过将它分成碎片并为每个碎片使用不同的线程来提高速度。
2)您还可以探索并行处理机器操作码,例如MMX,以查看它们是否适用。
3)根据您的编译器,其优化器,CPU等,您可能会或可能不会从消除分支中找到显着的性能优势:而不是......
if (*dd != *ee){
diff++;
}
...也许尝试......
diff += bool(*dd - *ee);
首先检查if ()
版本的汇编语言是否值得查看优化器是否已经在执行此操作。如果bool(*dd - *ee)
仍有分支,您可以尝试其他一些事情,如有必要,请回到内联汇编。
4)假设您最终将相同的向量与其他向量进行比较,您可以在数据中存储范围的校验和/哈希值,这样当相同的向量与不同的备选方案进行比较时,只考虑具有不同哈希值的区域:这可能会遗漏一些差异 - 大约1比2的比特用于良好的哈希 - 但如果这是指纹,我认为无论如何它都是概率性的,这将是无关紧要的。
5)如果你为NSA做这件事,我建议你在VBA中重新编码。
答案 2 :(得分:1)
如果两个fingerprint
值通常相同,如果您第一次执行此操作可能会有所帮助
memcmp(&a[0], &b[0], a.size() * sizeof(int))
测试两个阵列之间是否存在任何差异。只有当你有任何不同之处时,你才会看到有多少差异。
答案 3 :(得分:0)
答案 4 :(得分:0)
非常感谢所有不同的解决方案!非常感激。我使用diff作为double,因为在计算结束时需要将它放在内核函数中并且来自Python背景我认为最好先将它分配为double但我可能在这里错了但是谢谢评论!
另外,详细说明指纹(我本来应该做的,我的道歉)或者bittring是一个更好的词,在我的情况下每个位包含1或0我需要在每个比较索引两个位串是否相同。非常感谢我将尝试的解决方案,看看哪一个有助于加快速度!非常感谢!