我正在尝试理解为什么我自己构建的grep比系统自带的要慢得多,并试图找出系统自带的grep使用了哪些编译器选项。
操作系统版本:CentOS release 5.3 (Final) 系统自带的grep:
版本:grep (GNU grep) 2.5.1 大小:88896字节 ldd输出: libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003991800000) libc.so.6 => /lib64/libc.so.6 (0x0000003985a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003984a00000)
我构建的grep:
版本:2.5.1 大小:256437字节 ldd输出: libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003991800000) libc.so.6 => /lib64/libc.so.6 (0x0000003985a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003984a00000)
当在一个大型文本文件中运行正则表达式搜索时,系统grep(330毫秒)的性能比我构建的grep(22430毫秒)要快得多。
以下是我用来计时的命令:
%time src/grep ".*asa.*" large_list.txt > /dev/null real 0m22.430s user 0m22.291s sys 0m0.080s
或者
%time bin/grep ".*asa.*" large_list.txt > /dev/null real 0m0.331s user 0m0.236s sys 0m0.081s
系统grep显然使用了一些优化选项,这导致了巨大的性能差异。
有人可以帮我看看系统grep可能使用了哪些选项吗?
以下是我构建时一个源文件的编译选项:
gcc -DLIBDIR=\"/usr/local/lib\" -DHAVE_CONFIG_H -I. -I.. -I.. -I. -I../intl -g -O2 -MT xstrtol.o -MD -MP -MF .deps/xstrtol.Tpo -c -o xstrtol.o xstrtol.c
./configure的输出:
检查是否有一个兼容BSD的安装程序... /usr/bin/install -c 检查构建环境是否健康... 是 检查是否有线程安全的mkdir -p... /bin/mkdir -p 检查gawk是否存在... gawk 检查make是否设置了$(MAKE)... 是 检查构建系统类型... x86_64-unknown-linux-gnu 检查主机系统类型... x86_64-unknown-linux-gnu 检查gawk是否存在... (已缓存) gawk 检查gcc是否存在... gcc 检查C编译器默认输出文件名... a.out 检查C编译器是否工作... 是 检查是否进行交叉编译... 否 检查可执行文件的后缀名... 检查目标文件的后缀名... o 检查是否使用GNU C编译器... 是 检查gcc是否接受-g选项... 是 检查是否需要ISO C89的选项接受... 不需要 检查makefile文件中包含的头文件风格... GNU 检查gcc的依赖关系风格... gcc3 检查是否有一个兼容BSD的安装程序... /usr/bin/install -c 检查是否有ranlib... ranlib 检查是否有getconf... getconf 检查CFLAGS值是否请求大文件支持... 检查LDFLAGS值是否请求大文件支持... 检查LIBS值是否请求大文件支持... 检查_FILE_OFFSET_BITS是否存在... 否 检查_LARGEFILE_SOURCE是否存在... 否 检查_LARGE_FILES是否存在... 否 检查函数原型... 是 检查如何运行C预处理器... gcc -E 检查能否处理长行和-e的grep... /bin/grep 检查egrep的存在... /bin/grep -E 检查ANSI C头文件的存在... 是 检查sys/types.h的存在... 是 检查sys/stat.h的存在... 是 检查stdlib.h的存在... 是 检查string.h的存在... 是 检查memory.h的存在... 是 检查strings.h的存在... 是 检查inttypes.h的存在... 是 检查stdint.h的存在... 是 检查unistd.h的存在... 是 检查string.h的存在... (已缓存) 是 检查size_t的存在... 是 检查ssize_t的存在... 是 检查是否符合ANSI C标准的const... 是 检查inttypes.h的存在... 是 检查unsigned long long的存在... 是 检查ANSI C头文件的存在... (已缓存) 是 检查string.h的存在... (已缓存) 是 检查stdlib.h的存在... (已缓存) 是 检查sys/param.h是否可用... 是 检查sys/param.h是否存在... 是 检查memory.h的存在... (已缓存) 是 检查unistd.h的存在... (已缓存) 是 检查libintl.h是否可用... 是 检查libintl.h是否存在... 是 检查wctype.h是否可用... 是 检查wctype.h是否存在... 是 检查wchar.h是否可用... 是 检查wchar.h是否存在... 是 检查定义DIR的dirent.h是否存在... 是 检查包含opendir的库是否存在... 不需要 检查stat文件模式宏是否损坏... 否 检查是否具有工作的alloca.h... 是 检查是否具有alloca函数... 是 检查closedir是否返回void... 否 检查stdlib.h的存在... (已缓存) 是 检查unistd.h的存在... (已缓存) 是 检查是否具有getpagesize... 是 检查是否具有工作的mmap... 是 检查btowc是否存在... 是 检查isascii是否存在... 是 检查iswctype是否存在... 是 检查mbrlen是否存在... 是 检查memmove是否存在... 是 检查setmode是否存在... 否 检查strerror是否存在... 是 检查wcrtomb是否存在... 是 检查wcscoll是否存在... 是 检查wctype是否存在... 是 检
谢谢,Kumar。
操作系统版本:CentOS release 5.3 (Final) 系统自带的grep:
版本:grep (GNU grep) 2.5.1 大小:88896字节 ldd输出: libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003991800000) libc.so.6 => /lib64/libc.so.6 (0x0000003985a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003984a00000)
我构建的grep:
版本:2.5.1 大小:256437字节 ldd输出: libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003991800000) libc.so.6 => /lib64/libc.so.6 (0x0000003985a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003984a00000)
当在一个大型文本文件中运行正则表达式搜索时,系统grep(330毫秒)的性能比我构建的grep(22430毫秒)要快得多。
以下是我用来计时的命令:
%time src/grep ".*asa.*" large_list.txt > /dev/null real 0m22.430s user 0m22.291s sys 0m0.080s
或者
%time bin/grep ".*asa.*" large_list.txt > /dev/null real 0m0.331s user 0m0.236s sys 0m0.081s
系统grep显然使用了一些优化选项,这导致了巨大的性能差异。
有人可以帮我看看系统grep可能使用了哪些选项吗?
以下是我构建时一个源文件的编译选项:
gcc -DLIBDIR=\"/usr/local/lib\" -DHAVE_CONFIG_H -I. -I.. -I.. -I. -I../intl -g -O2 -MT xstrtol.o -MD -MP -MF .deps/xstrtol.Tpo -c -o xstrtol.o xstrtol.c
./configure的输出:
检查是否有一个兼容BSD的安装程序... /usr/bin/install -c 检查构建环境是否健康... 是 检查是否有线程安全的mkdir -p... /bin/mkdir -p 检查gawk是否存在... gawk 检查make是否设置了$(MAKE)... 是 检查构建系统类型... x86_64-unknown-linux-gnu 检查主机系统类型... x86_64-unknown-linux-gnu 检查gawk是否存在... (已缓存) gawk 检查gcc是否存在... gcc 检查C编译器默认输出文件名... a.out 检查C编译器是否工作... 是 检查是否进行交叉编译... 否 检查可执行文件的后缀名... 检查目标文件的后缀名... o 检查是否使用GNU C编译器... 是 检查gcc是否接受-g选项... 是 检查是否需要ISO C89的选项接受... 不需要 检查makefile文件中包含的头文件风格... GNU 检查gcc的依赖关系风格... gcc3 检查是否有一个兼容BSD的安装程序... /usr/bin/install -c 检查是否有ranlib... ranlib 检查是否有getconf... getconf 检查CFLAGS值是否请求大文件支持... 检查LDFLAGS值是否请求大文件支持... 检查LIBS值是否请求大文件支持... 检查_FILE_OFFSET_BITS是否存在... 否 检查_LARGEFILE_SOURCE是否存在... 否 检查_LARGE_FILES是否存在... 否 检查函数原型... 是 检查如何运行C预处理器... gcc -E 检查能否处理长行和-e的grep... /bin/grep 检查egrep的存在... /bin/grep -E 检查ANSI C头文件的存在... 是 检查sys/types.h的存在... 是 检查sys/stat.h的存在... 是 检查stdlib.h的存在... 是 检查string.h的存在... 是 检查memory.h的存在... 是 检查strings.h的存在... 是 检查inttypes.h的存在... 是 检查stdint.h的存在... 是 检查unistd.h的存在... 是 检查string.h的存在... (已缓存) 是 检查size_t的存在... 是 检查ssize_t的存在... 是 检查是否符合ANSI C标准的const... 是 检查inttypes.h的存在... 是 检查unsigned long long的存在... 是 检查ANSI C头文件的存在... (已缓存) 是 检查string.h的存在... (已缓存) 是 检查stdlib.h的存在... (已缓存) 是 检查sys/param.h是否可用... 是 检查sys/param.h是否存在... 是 检查memory.h的存在... (已缓存) 是 检查unistd.h的存在... (已缓存) 是 检查libintl.h是否可用... 是 检查libintl.h是否存在... 是 检查wctype.h是否可用... 是 检查wctype.h是否存在... 是 检查wchar.h是否可用... 是 检查wchar.h是否存在... 是 检查定义DIR的dirent.h是否存在... 是 检查包含opendir的库是否存在... 不需要 检查stat文件模式宏是否损坏... 否 检查是否具有工作的alloca.h... 是 检查是否具有alloca函数... 是 检查closedir是否返回void... 否 检查stdlib.h的存在... (已缓存) 是 检查unistd.h的存在... (已缓存) 是 检查是否具有getpagesize... 是 检查是否具有工作的mmap... 是 检查btowc是否存在... 是 检查isascii是否存在... 是 检查iswctype是否存在... 是 检查mbrlen是否存在... 是 检查memmove是否存在... 是 检查setmode是否存在... 否 检查strerror是否存在... 是 检查wcrtomb是否存在... 是 检查wcscoll是否存在... 是 检查wctype是否存在... 是 检
谢谢,Kumar。