Chinaunix

标题: C++内存操作速度问题 [打印本页]

作者: lssliu    时间: 2010-07-02 19:50
标题: C++内存操作速度问题
今天作一个大文件(50M~500M)处理的程序,我用strstr()遍历一边内存得到每一行的开始指针。50M的文件用时30秒。无法忍受了。后来换成这种方式
while(*pbuffer ++ != NULL)
{
           if(*pbuffer ++  == '\n')
           {
             iLine++;            
           }
}发现速度更慢。将近1分钟。


问一下各位有什么好方法能够较快速,遍历一块较大内存区域。
作者: lssliu    时间: 2010-07-02 19:51
strtok我也试了,速度也不是很快。将近40秒。
作者: lssliu    时间: 2010-07-02 20:02
各位有什么好方法提供一下啊,我实在是不知道该如何处理了。
作者: cugb_cat    时间: 2010-07-02 20:23
升级硬件!
作者: lssliu    时间: 2010-07-02 20:24
升级硬件!
cugb_cat 发表于 2010-07-02 20:23



   好主意......
作者: lssliu    时间: 2010-07-02 20:32
其实我就是想统计下文件行数、记录下每一行开始地址(涉及到数组付值,这部分时间比较大)。文件较大准备分批导入显示,所以需要行开始地址,进行现实内容的取得。
作者: 没本    时间: 2010-07-02 20:59
用gcc的话,用最新的版本,编译开关加上-march=core2 -mssse3 -msse4.1可以生成针对core2优化的str系列函数。不过strstr没优化版本,你可以试试strtok。

glibc-2.11.2.tar.gz里的文件供参考:
./sysdeps/x86_64/strspn.S
./sysdeps/x86_64/strrchr.S
./sysdeps/x86_64/strcat.S
./sysdeps/x86_64/strcpy.S
./sysdeps/x86_64/strtok_r.S
./sysdeps/x86_64/strcspn.S
./sysdeps/x86_64/strcpy_chk.S
./sysdeps/x86_64/rtld-strlen.S
./sysdeps/x86_64/rtld-strchr.S
./sysdeps/x86_64/multiarch/strcmp-ssse3.S
./sysdeps/x86_64/multiarch/strspn.S
./sysdeps/x86_64/multiarch/strrchr.S
./sysdeps/x86_64/multiarch/strcpy.S
./sysdeps/x86_64/multiarch/strncpy.S
./sysdeps/x86_64/multiarch/strcspn.S
./sysdeps/x86_64/multiarch/rtld-strlen.S
./sysdeps/x86_64/multiarch/strncmp-ssse3.S
./sysdeps/x86_64/multiarch/strpbrk.S
./sysdeps/x86_64/multiarch/strcmp.S
./sysdeps/x86_64/multiarch/strlen.S
./sysdeps/x86_64/multiarch/strncmp.S
./sysdeps/x86_64/multiarch/strend-sse4.S
./sysdeps/x86_64/multiarch/strchr.S
./sysdeps/x86_64/strpbrk.S
./sysdeps/x86_64/strcmp.S
./sysdeps/x86_64/strlen.S
./sysdeps/x86_64/strncmp.S
./sysdeps/x86_64/strchr.S
./sysdeps/x86_64/strtok.S
./sysdeps/x86_64/strchrnul.S

./sysdeps/i386/i686/strtok_r.S
./sysdeps/i386/i686/multiarch/strspn.S
./sysdeps/i386/i686/multiarch/strcspn.S
./sysdeps/i386/i686/multiarch/strpbrk.S
./sysdeps/i386/i686/multiarch/strlen.S
./sysdeps/i386/i686/strcmp.S
./sysdeps/i386/i686/strtok.S
./sysdeps/i386/i586/strcpy.S
./sysdeps/i386/i586/strlen.S
./sysdeps/i386/i586/strchr.S
./sysdeps/i386/strtok_r.S
./sysdeps/i386/strcspn.S
./sysdeps/i386/strpbrk.S
./sysdeps/i386/i486/strcat.S
./sysdeps/i386/i486/strlen.S
./sysdeps/i386/strchr.S
./sysdeps/i386/strtok.S
./sysdeps/i386/strchrnul.S
作者: xinglp    时间: 2010-07-02 21:11
回复 7# 没本


   你是说编译程序的时候用 gcc  -march=core2 -mssse3 -msse4.1 xxx.c   还是编译gcc4.5的时候用-march=core2 -mssse3 -msse4.1
   有哪个发行版会用这么新的glibc的版本呢?
作者: cugb_cat    时间: 2010-07-02 21:38
你先用wc跑一下看需要多久
作者: ah13k    时间: 2010-07-02 22:05
是的wc,已经是一个不错的成品了,如果你觉得wc不错,那么去下载gnu的coreutils然后挖他的代码。
作者: 没本    时间: 2010-07-02 22:06
回复 8# xinglp


    编译GCC你基本改不了什么选项的。我说的是编译你的源程序加开关。用新的glibc库的发行版不少嘛,而且ssse3的优化已经很早就有支持了。Arch和Gentoo都用最新的C库,Ubuntu的库也较新。生成静态链接的版本,可以放到别的Linux发行版下运行,只要内核版本差别不是太大。
作者: songvar    时间: 2010-07-02 22:10
我用楼主的代码,VC++下编译,340MB的文件几秒钟就完成了统计,wc命令更快一点。
作者: bruceteen    时间: 2010-07-03 01:50
为什么用strstr呢?即使你不用memchr,也会用strchr呀




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2