- 论坛徽章:
- 0
|
原帖由 r2007 于 2007-1-7 12:07 发表
wc -c <&5
这句又扫描了一遍原文件,影响效率,值得商榷。
用大小为10bytes和3GB的文件分别测试了一下,使用的real_time几乎没区别
strace一下它
- $strace wc -c <FC-6-i386-DVD.iso 2>&1|tail -12
- fstat64(0, {st_mode=S_IFREG|0755, st_size=3525195776, ...}) = 0
- _llseek(0, 0, [0], SEEK_CUR) = 0
- _llseek(0, 0, [3525195776], SEEK_END) = 0
- fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
- mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c24000
- close(0) = 0
- write(1, "3525195776\n", 113525195776
- ) = 11
- close(1) = 0
- munmap(0xb7c24000, 4096) = 0
- exit_group(0) = ?
- Process 6560 detached
复制代码
发现wc -c只读取了文件的前4096字节(见mmap那行调用),又与stat命令的strace信息相对照,wc -c应该只是通过fd指向的文件表项和v节点表来获得字节数(参见APUE图3-2及相关内容)
因此,文件的大小对wc -c的效率几乎没有影响(但wc -l、wc -w都会循环调用read(2),因此它们的效率是会受到文件大小影响的)
但r2007兄的提醒让我想到了head,它恐怕是要直接调用read(2)的,果不其然,strace信息证明了:无论是-c还是-n选项,都循环调用了read(2)。
所以,可能随文件大小或文件定位影响我代码效率的,除了中间那句明显的dd读写外,就是这句head了。
这样,也说明了从效率上考虑,我第二段代码比第一段代码稍优一些(因为少用了一次head)。 |
|