首页
社区
课程
招聘
[讨论]使用C语言,如何以最快的速度在一段buf中搜索一个DWORD值。
发表于: 2007-12-18 10:00 5698

[讨论]使用C语言,如何以最快的速度在一段buf中搜索一个DWORD值。

2007-12-18 10:00
5698
这个是我写的,不知道有没有更快的写法?

DWORD k=0x12345678;
BYTE buf[ MAXLEN +4];
BYTE *p=buf;
.......... // read data to buf

*(DWORD*)(p+MAXLEN) = k;
while(*(DWORD *)p != 0x12345678 ) p++;

if( p-buf <= MAXLEN-4 ) { // FOUND }
else {// NOTFOUND }

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
应该没有。。。(我也不是100%确定
2007-12-22 11:42
0
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
算法上可能没有,在程序上可能还是可以优化一下吧:
你把代码改成这样可能要快一点!

DWORD k=0x12345678;
BYTE *p;
BYTE buf[ MAXLEN +4];
p=buf;


.......... // read data to buf

*(DWORD*)(p+MAXLEN) = k;
while(*(DWORD *)p != k ) p++;

if( p-buf <= MAXLEN-4 ) { // FOUND }
else {// NOTFOUND }
2007-12-22 11:46
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
4
模式匹配    ~
2007-12-22 12:22
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
5
如果你要找的数据确定是4边界对齐的
可以用
mov eax, k
mov ecx, MAXLEN
inc ecx
lea edi, buf
repne scas dword ptr es:[edi]
2007-12-22 12:36
0
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=shoooo;394619]如果你要找的数据确定是4边界对齐的
可以用
mov eax, k
mov ecx, MAXLEN
inc ecx
lea edi, buf
repne scas dword ptr es:[edi][/QUOTE]

强!知识相当深厚!
2007-12-22 12:53
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=shoooo;394619]如果你要找的数据确定是4边界对齐的
可以用
mov eax, k
mov ecx, MAXLEN
inc ecx
lea edi, buf
repne scas dword ptr es:[edi][/QUOTE]

问题:
1、如用汇编肯定是这样写最快,我现在用的是C,不知道内嵌ASM怎么写,哪些寄存器需要保存?

2、这个DWORD可能出现在buf的任意字节开始的位置上,怎样最快?
2007-12-22 13:17
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
另外不知道编译器是否能自动优化代码,将上述代码用这个汇编代码来实现?
2007-12-22 13:22
0
雪    币: 214
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
要是你在生成数据的时候能派个序的话,查找效率会更高。要是你需要查找的范围小的话可以直接在插入的时候使用静态表。
2007-12-22 16:16
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
10
你那样写很好,要相信C编译器
自己写汇编未必效率高
2007-12-22 21:37
0
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
嘿嘿,有一个地方编译器是不会帮你优化的,那就是尽量要把频繁使用的局部变量放到 128 字节范围内,这样寻址会比较快```比如,把 k 放到数组前面声明。
2007-12-22 21:46
0
雪    币: 324
活跃值: (91)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
上面说错了,应该是把 p 放到数组前面,另外,编译器也有可能优化你的代码!不过我觉得这种可能性很小```编译器无法确定数组中的存的变量是否是你想赋予其更快访问速度的。
2007-12-22 21:49
0
游客
登录 | 注册 方可回帖
返回
//