循环负载高的疑惑
最近公司 上级提了个需求,大体是从一个不断写入的日志中提取有用的信息(很多日志输出行都是无用的),工作一周左右用C语言写完成了,但跑起来CPU占用了100%(程序要不停跑),现在怀疑是不断的函数调用导致的,如果想减小负载,有什么可行的思路,要单开线程,分工处理么?求大家给个可行的思路,
[解决办法]
如果开线程还是不停循环,中间无任何停顿的话,CPU还是100%;关键问题是不能无停顿的循环,采用定时器、阻塞模式、异步回调等都可以解决。
[解决办法]
调用的时候时不时yeld就行了.
[解决办法]
干过这个,每个循环末尾usleep一下就可以了。
就是扫目录发现新文件就记录到内存里偏移量,每次再去check偏移量变了没,变了就读并修改内存里记录的偏移量。
还用sqlite存了偏移量,怕程序崩溃。
[解决办法]
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <conio.h>
int fh;
int c,r;
__int64 offset,offset1,i64,n64,l64,r64;
char ln[16000+1];
int main(int argc,char **argv) {
if (argc<2) {
fprintf(stderr,"Usage:%s filename.txt [10]\nto reverse lines of file [default the last 10 lines,-1 for all lines].\n",argv[0]);
return 1;
}
if (argc==2) n64=10i64;
if (argc>2) sscanf(argv[2],"%I64d",&n64);
fh=_sopen(argv[1],_O_BINARY
[解决办法]
_O_RDONLY
[解决办法]
_O_RANDOM,_SH_DENYNO);
if (-1==fh) {
fprintf(stderr,"Can not _sopen file %s!\n",argv[1]);
return 2;
}
l64=_filelengthi64(fh);if (l64==0i64) {_close(fh);return 0;}
offset=l64;
offset1=_lseeki64(fh,-1i64,SEEK_END);
if (offset1==-1i64) {_close(fh);return 3;}
i64=0i64;
while (1) {
if (_read(fh,&c,1)<1) break;//
if (('\n'==c && offset1<l64-1i64)
[解决办法]
offset1==0i64) {
if (offset1!=0i64) offset1++;
if (_lseeki64(fh,offset1,SEEK_SET)==-1i64) break;//
r64=offset-offset1;
if (r64<=16000i64) {
r=_read(fh,ln,(unsigned int)r64);
if (r<=0) break;//
} else {
r=16000;
while (1) {
if (r64>(__int64)r) {
r64-=(__int64)r;
if (1i64==r64
[解决办法]
2i64==r64) {
r=8000;
r64+=(__int64)r;
}
} else {
r=(int)r64;
r64=0i64;
}
r=_read(fh,ln,r);
if (r<=0) break;//
if (0i64==r64) break;//
ln[r]=0;
printf("%s",ln);
r=16000;
}
if (r<=0) break;//
}
ln[r]=0;
if (r>=2 && ln[r-1]=='\n' && ln[r-2]=='\r') {ln[r-2]='\n';ln[r-1]=0;r--;}//避免输出重定向到文件时行尾多出'\r'
if (i64==0I64) {
if ('\n'!=ln[r-1]) printf("%s\n",ln);
else printf("%s",ln);
} else {
printf("%s",ln);
}
i64++;
if ((i64%10000)==0) cprintf("\r%I64d/%I64d",offset1,l64);
if (n64>0i64 && i64>=n64) break;//
offset=offset1;
_lseeki64(fh,offset1-2i64,SEEK_SET);
offset1-=2i64;
} else {
_lseeki64(fh,-2i64,SEEK_CUR);
offset1--;
}
}
_close(fh);
return 0;
}