- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 C 或 C++ 中对位图执行 bool 表达式的最有效方法是什么?例如,假设我有一个 4 位位图 (a, b, c, d)
。现在,假设我有一个简单的 bool 表达式,如 (a AND b) OR (c AND d)
。我应该如何表示 bool 表达式,以便我可以有效地将它应用到我的位图中?我正在寻找一种可以应用于任何 bool 表达式的通用解决方案,而不仅仅是作为示例给出的那个。换句话说,我正在寻找某种方法将 bool 表达式“编译”为另一种数据结构,该数据结构可用于有效地将我的位图缩减为 bool 值。
位图结构是对数据库记录进行过滤操作的结果。每条记录都有自己的位图,位图中的每一位都是单独过滤规则的结果。 bool 表达式用于组合这些过滤规则来决定记录是否应该包含在数据库查询的结果中。 bool 运算可以组合多达 64 个单独的过滤规则,因此如果需要,位图可以表示为 unsigned long long int
。
解决方案在速度方面应该是高效的,并且不应该改变位图结构。 bool 表达式到另一个结构的转换不必是内存高效或快速的,因为它可以被缓存(至少在我当前的用例中)。使用转换后的 bool 表达式减少位图应该既快速又节省内存。
注意事项:
最佳答案
在位图上使用 AND 或 OR 操作的最有效方法是使用硬件辅助。许 multimap 形处理器可以对两个位图执行操作。对此没有 C++ 标准库操作。
您需要对位图中的每个位、字节、字或双字执行操作。
下一个提高速度的方法是展开循环。分支指令浪费执行周期(可用于数据指令)并且可能清除指令流水线,浪费时间重新加载它。
您还可以通过有效使用处理器的数据缓存来提高效率。加载一堆变量,执行操作,存储结果,重复。
您还应该使用处理器的字长来分组获取。 32 位处理器喜欢一次获取 32 位。因此,这将为您提供 8 组 4 位像素,这些像素通过一次提取加载。否则,您将不得不一次获取 8 位,这导致 4 次获取 8 位,而 1 次获取 32 位。
核心算法如下:
uint8_t * p_bitmap_a = &Bitmap_A[0];
uint8_t * p_bitmap_b = &Bitmap_B[0];
uint8_t * p_bitmap_c = &Bitmap_C[0];
// C = A AND B
for (unsigned int i = 0; i < bitmap_size / 4; ++i)
{
uint32_t a = *((uint32_t*) p_bitmap_a);
uinte2_t b = *((uint32_t*) p_bitmap_b);
uint32_t c = a & b;
*((uint32_t *) p_bitmap_c) = c;
p_bitmap_a += sizeof(uint32_t);
p_bitmap_b += sizeof(uint32_t);
p_bitmap_c += sizeof(uint32_t);
}
编辑 1:
您的处理器可能有可以协助操作的说明。例如,ARM7 处理器可以用一条指令从内存中加载多个寄存器。研究你的处理器指令集。您可能必须使用内联汇编语言才能利用处理器特定指令。
编辑 2:线程和并行处理。
除非您的位图很大,否则维护多个执行线程或并行执行的开销可能会超过 yield 。例如,如果与另一个 CPU 核心同步的开销是 200 毫秒,而无中断地处理位图是 1000 毫秒,那么您在单个位图上使用并行处理浪费了时间(1200 毫秒让另一个核心处理位图)。
如果您有很多位图,您可以通过使用并行处理或多线程来获得一些时间:
如果您从外部源(如数据库)获取位图,此 I/O 将成为您的瓶颈。这是您应该优化或假脱机的部分。
关于c++ - 在 C 或 C++ 中的位图上高效执行 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26194282/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!