首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在c或c++中提高多维数组比较性能

如何在c或c++中提高多维数组比较性能
EN

Stack Overflow用户
提问于 2012-01-26 19:58:00
回答 1查看 486关注 0票数 0

我有以下三维位数组(用于bloom filter):

代码语言:javascript
运行
复制
unsigned char  P_bit_table_[P_ROWS][ROWS][COLUMNS];

P_ROWS的维数表示独立的二维位数组(即P_ROWS、P_ROWS1、P_ROWS2是独立的位数组),可以大到100MB,并且包含独立填充的数据。我要查找的数据可能在这些P_ROWS中的任何一个中,现在我正在独立地搜索它,它是P_ROWS,然后是P_ROWS1,依此类推,直到我得到肯定或直到它结束(P_ROWSn-1)。这意味着如果n是100,我必须进行这种搜索(比特比较) 100次(并且这种搜索是经常进行的)。有人建议,如果我可以进行位分组(在行-主顺序数组上使用列-主顺序--我不知道怎么做),我就可以提高搜索性能。

我真的需要提高搜索的性能,因为程序做了很多事情。

如果需要,我很乐意给出我的位表实现的更多细节。

抱歉,我的语言太差了。

谢谢你的帮助。

编辑:位分组可以按以下格式完成:假设数组为:

代码语言:javascript
运行
复制
unsigned char P_bit_table_[P_ROWS][ROWS][COLUMNS]={{(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))},
                                                  {(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))},   
                                                  {(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))}};

如您所见,所有行--在第三个维度上--都有相似的数据。分组后我想要的是这样的:所有的a1都在一个组中(作为一个实体,以便我可以将它们与另一个比特进行比较,以检查它们是开还是关),并且所有的b1都在另一个组中,依此类推。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-27 00:44:26

重用别人的算法

有大量的bit-calculation optimizations out there,包括许多不明显的,例如Hamming Weights和用于查找下一个真或假位的专门算法,它们相当独立于您的数据结构。

重用其他人编写的算法确实可以加快计算和查找速度,更不用说开发时间了。有些算法是如此专门化,它们使用的计算魔法会让你抓狂:在这种情况下,你可以相信作者的话(在你用单元测试确认它们的正确性之后)。

利用CPU缓存和多线程

我个人将我的多维位数组减少到一维,针对预期的遍历进行了优化。

这样,命中CPU缓存的可能性就更大了。

在您的情况下,我还会深入考虑数据的可变性,以及您是否希望在位块上设置锁。有了100MB的数据,你就有可能使用多个线程并行运行你的算法,如果你能组织你的数据和算法来避免争用的话。

如果您按线程划分数据块的所有权,那么您甚至可以拥有一个无锁模型,这样就没有两个线程可以对同一个块进行读写。这完全取决于您的需求。

现在是思考这些问题的好时机。但由于没有人比您更了解您的数据和使用情况,因此您必须在您的数据和使用模式的上下文中考虑设计选项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9017804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档