【发布时间】:2011-06-08 21:51:21
【问题描述】:
我编写了一个程序来处理一些以大端格式写入磁盘的数据,因此该程序需要交换字节才能执行其他操作。在分析代码后,我发现我的字节交换函数占用了 30% 的执行时间。所以我想自己,我怎样才能加快速度呢? 所以我决定写一个小块内联汇编。
我会替换这个:
void swapTwoByte(char* array, int numChunks)
{
for(int i= (2*numChunks-1); i>=0; i-=2)
{
char temp=array[i];
array[i]=array[i-1];
array[i-1]=temp;
}
}
用这个:
void swapTwoByte(int16* array, int numChunks)
{
for(int i= (numChunks-1); i>=0; --i)
{
asm("movw %1, %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"rorw %%ax;"
"movw %%ax, %0;"
: "=r" ( array[i] )
: "r" (array[i])
:"%ax"
);
}
}
这是预期的工作,但这是很多旋转操作。
所以这是我的问题: 根据this source rorw 可以采用两个操作数,在气体语法中,源操作数应该是要旋转的位数,但是每次我尝试用类似的东西替换 8 个旋转权限的列表时
".set rotate, 0x0008"
"rorw rotate, %%ax"
我收到一个汇编程序错误说明:
"Error: number of operands mismatch for `ror'"
这是为什么?我错过了什么?
【问题讨论】:
-
您是否尝试过更简单的优化,例如通过数组迭代 forwards 以进行字节交换?
-
你可能想试试 bswap 顺便说一句..
-
据我了解,向前迭代可能会更慢。通过在零处停止,我使前瞻逻辑更容易工作。至少我被告知是这样的。
-
你在做什么处理?整个事情真的慢到足以证明认真的优化工作是合理的吗?在我看来,这已经足够快了,你真正被告知的是“嘿,你实际上并没有做那么多处理”......
-
处理数百个 GRETINA 输出的数据。代码需要 3 个小时才能执行,所以我正在寻找任何可以让它更快的方法。
标签: c++ assembly inline-assembly