![]() |
1
6
您的查阅表格可以放置在
如果您能够提供4KB的ROM空间,那么唯一的问题就是在
您必须进行概要分析,以确保从ROM到目标阵列的拷贝实际上比计算进入目标阵列所需的速度要快-如果有以下情况,我不会感到惊讶:
最终会更快。我希望该函数的优化构建将所有内容都保存在寄存器中或编码到指令中,除了每个输入字节的一次读取和每个输出字的一次写入。或者差不多。 您可以通过一次处理多个输入字节来进一步优化,但是接下来必须处理对齐问题,以及如何处理不是所处理块大小的倍数的输入缓冲区。这些问题并不难处理,但它们确实会使事情复杂化,而且不清楚您可能期望得到什么样的改进。 |
![]() |
2
2
我想你不能用平行论? 这只是一个猜测——你真的需要一个分析器来指导——但我认为查找表可以工作。 如果我理解正确,输入数组中的每个字节在输出中产生16个字节。所以一个为一个单字节输入提供16字节输出的查找表应该取4kib——这比您需要的空间要大。 您可以将每个字节拆分为4位的两部分,这将使所需表的大小减少到256字节:
此外,如果发现循环开销过大,可以使用 Duff's Device . |
![]() |
3
2
第一次尝试:
第二次尝试,无耻地从 Michael Burr (谁已经从我这里得到了+1):
|
![]() |
4
1
假设
这将允许编译器执行优化,否则是不允许的。请注意,编译器可能使用不同的关键字;我认为有些用法
如果该关键字不可用,则可以进行其他优化:
对我来说,上面的轻微重写更容易遵循,因为它明确地说明了CPU所采用的路径,但我希望优化是显而易见的:将值存储在
另一个不太明显的优化将利用大多数CPU上日益常见的矢量硬件(包括ARM的Neon和Intel的SSE)一次合成16个字节的结果。我建议调查一下这个选择。 |
![]() |
5
1
如果您打算使用原始速度,那么使用查找表(以避免使用位移位的内部循环)可能是最好的方法。
存在的问题是,查找表本身是4KB(256*16),比您现有的要大。这可以用两种方法中的一种来解决。最简单和最小的解决方案如下:
更复杂但可能更快的方法是使用 De Bruijn sequence 对所有可能的查找值进行编码。这会将查找表从4KB减少到512+14,但需要额外的间接级别和另一个索引表(256字节),总共782字节。这将删除memcpy()调用中的一个,以及shift和bitswise和,而代价是再多一个索引。在你的案例中可能不需要,但还是很有趣。 |
![]() |
6
0
我打算为每个人推荐一个Boost::,因为它将分解循环,但最终还不知道。我认为你能得到的最好的办法就是解开内环。我会想办法的。Boost::for_each over an MPL::range may be an option there. |
![]() |
7
0
你可以提取
|
![]() |
8
0
我可能建议创建一个8个可能的单位掩码(即0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80)的查找表,然后使用它们与循环中的位字段进行比较。伪代码(上面调用的位掩码
|
![]() |
9
0
首先,因为你有点烦躁,所以把所有东西都改成无符号。这就消除了因延长标志或其他与标志相关的操作而产生的任何不良影响。 您可以使用修改过的Duff设备:
|
![]() |
10
0
如果您不介意在内存中有256个pw_bufout,您可以尝试生成所有可能的输出,并通过将其更改为pw_bufout[i]=perm[pc_bufin[i];(perm是具有所有排列的数组) |
![]() |
11
0
立即想到的是:
最好的办法是看看为目标平台生成了什么样的汇编程序,看看编译器在做什么。 编辑:我不会使用查阅表格。额外缓存未命中的成本可能会超过简单计算的成本。 伊迪丝2:让我去另一台电脑,启动编译器,我看看我能做些什么。 |
![]() |
12
0
首先,你这样做是为了8段显示,是吗? 你可能想
它包含
在这段代码中,我将第二个循环的顺序改为倒数而不是向上。如果您的下限是0或-1,这通常更有效。而且,你似乎从最重要的一点到最不重要的一点。
或者,您可以展开内部循环,生成更快的代码,并去掉
对于外部循环,我将其更改为只增加一个指针,而不是使用
另一件你可能想尝试的事情是使用比字节大的块作为你的输入。您将不得不担心endian问题和非字大小的输入数组。
您可能还需要考虑的一件事是,不要一次对整个可变长度字符串执行此操作。你可以做一个
输入
每次调用一个字节或一个字,然后传递
|
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |