+ -
当前位置:首页 → 问答吧 → C++内存操作速度问题

C++内存操作速度问题

时间:2010-07-02

来源:互联网

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


问一下各位有什么好方法能够较快速,遍历一块较大内存区域。

作者: lssliu   发布时间: 2010-07-02

strtok我也试了,速度也不是很快。将近40秒。

作者: lssliu   发布时间: 2010-07-02

各位有什么好方法提供一下啊,我实在是不知道该如何处理了。

作者: lssliu   发布时间: 2010-07-02

升级硬件!

作者: cugb_cat   发布时间: 2010-07-02



QUOTE:
升级硬件!
cugb_cat 发表于 2010-07-02 20:23




   好主意......

作者: lssliu   发布时间: 2010-07-02

其实我就是想统计下文件行数、记录下每一行开始地址(涉及到数组付值,这部分时间比较大)。文件较大准备分批导入显示,所以需要行开始地址,进行现实内容的取得。

作者: lssliu   发布时间: 2010-07-02

用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

作者: 没本   发布时间: 2010-07-02

回复 没本


   你是说编译程序的时候用 gcc  -march=core2 -mssse3 -msse4.1 xxx.c   还是编译gcc4.5的时候用-march=core2 -mssse3 -msse4.1
   有哪个发行版会用这么新的glibc的版本呢?

作者: xinglp   发布时间: 2010-07-02

你先用wc跑一下看需要多久

作者: cugb_cat   发布时间: 2010-07-02

是的wc,已经是一个不错的成品了,如果你觉得wc不错,那么去下载gnu的coreutils然后挖他的代码。

作者: ah13k   发布时间: 2010-07-02

回复 xinglp


    编译GCC你基本改不了什么选项的。我说的是编译你的源程序加开关。用新的glibc库的发行版不少嘛,而且ssse3的优化已经很早就有支持了。Arch和Gentoo都用最新的C库,Ubuntu的库也较新。生成静态链接的版本,可以放到别的Linux发行版下运行,只要内核版本差别不是太大。

作者: 没本   发布时间: 2010-07-02

我用楼主的代码,VC++下编译,340MB的文件几秒钟就完成了统计,wc命令更快一点。

作者: songvar   发布时间: 2010-07-02

为什么用strstr呢?即使你不用memchr,也会用strchr呀

作者: bruceteen   发布时间: 2010-07-03

中国福利彩票 www.567958.com/
3D之家www.991266.com/

作者: dsd   发布时间: 2010-07-03