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