#include <stdio.h> #include <string.h> #include <fstream.h> void main() { int len=2048; char filename[20];//文件名 char buff[10000];//文件缓冲区 char hit[5]; int i,j,flag=0; int max; int count=0;//最后的结果 strcpy(&filename[0] , "d:\\access.log_"); strcpy(&hit[0] , "HIT"); buff[0]=0x0; buff[1]=0x0; //用输入流打开文件: ifstream input(&filename[0]); //读取文件内容 while(input) { input.getline(&buff[2] , len); max = strlen(&buff[2]); for(i=0;i<max;i++) { for(j=0;j<3;j++) { if(hit[j] != buff[i+j]) { flag=0;//一旦有一个不相同就退出并且标志为0 break; } else { flag=1;//一个相同为1,如果连续都相同最后结果定是1 } } if(flag==1) { count++; i+=j-1; } else { if(j==0) { i+=(j); } else { i+=(j-1); } } } } printf("count:%d\n",count); } 这段C++程序在测试平台上用了最快4分25秒95 到最慢5分40秒68的时间完成1500万行的文本检索,并在2G的文件中检索出10951968个"HIT"字符串。这结果是正确的。
第四个选手:汇编 本以为汇编程序能够达到前所未有的高速,把前面的选手远远抛在身后而笑傲江湖。这一想法支撑我完成了艰涩的代码。可事实上测试的结果缺让我大失所望,完全用机器指令书写的程序,去掉缓冲区才几百字节,算法和前面的C程序一模一样,扫描1500万行文本竟然最快也要2分14秒56!这甚至还比不过C语言的最快纪录。而平均下来,汇编程序的速度竟然和前面的C程序在伯仲之间。恐怕这样的结果也出乎大部分人的意外。因为我们从入行的那一天起,就被告知汇编是你所能够掌握的最快的语言!尽管代码坚涩难懂,但性能的代价是值得的。而从这里的测试看,你觉得向下面这样的代码,实现和C语言一样的速度和功能值得吗? ;堆栈段 STSG SEGMENT STACK 'S' DW 64 DUP(?) STSG ENDS ;数据段 DATA SEGMENT rlength EQU 2048 fname DB 'access.log_',0 hit DB 'HIT$' fd DW ? ;文件句柄 resault DB 'count : $' ;结果提示 count DD 0 ;存放结果 disflag DB 0 ;显示标志 buff DB 5000 dup(0) ;缓冲区 DATA ENDS ;代码段 CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STSG,ES:NOTHING MOV AX,DATA MOV DS,AX ;我的代码开始: mov ah,3dh ;打开文件 lea dx,fname mov al,00h ;文件打开方式 int 21h ;开始操作 ;这里就不作错误处理了,偷懒喽! ;CF=0表示正确,CF=1表示错误,AX是文件句柄或者是错误代码 mov fd,ax ;保存文件句柄 READ: mov ah,3fh ;读文件 mov bx,fd ;文件句柄 mov cx,rlength ;要读length字节 lea dx,buff ;给出读缓冲区指针 add dx,2 ;缓冲区指针向后错两个(目的是解决边界问题:有一个HIT正好横跨rlength界限) int 21h ;开始读 ;AX里面是实际读出的字节数 ;读完了以后,扫描缓冲区 push ax ;保存AX字节数 cmp ax,0 jz ALLEND ;文件读完了就退出 sub dx,2 ;指针向前错2个, mov si,dx add dx,2 ;把指针回到原来的位置 add dx,ax ;计算结尾 LOD3: cmp si,dx ;到头了就重新读一次文件 jz OVR lods buff lea bx,HIT cmp al,[bx] jnz LOD3 ;读第一个字节不相等就重新读一个 cmp si,dx jz OVR lods buff cmp al,[bx+1] jnz LOD3 ;如果第一个字节相等,就读第2个字节,不行等就从第一个字节再重比较。 cmp si,dx ;如果第二个字节也相等的话,就比较第三个字节。
复制本页网址和标题,发送给你QQ/Msn的好友一起分享
上一篇:四种网络游戏外挂的设计方法
下一篇:软件也要时尚漂亮 软件包装周边制作一览