我将只关注您的示例之一,因为其余的事情应该是类比的:
我认为,在这种情况下可能重要的是预读(或与此有关的另一种技术)功能:
让我们考虑这样的例子:
我已经按照dd命令在“ 1”目录(名称1.xml到1000.xml)中创建了1000个xml文件,然后将原始目录1复制到目录2
$ mkdir 1$ cd 1$ for i in {1..1000}; do dd if=/dev/urandom of=$i.xml bs=1K count=10; done$ cd ..$ cp -r 1 2$ sync; sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'$ time strace -f -c -o trace.copy2c cp -r 2 2copy$ sync; sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'$ time strace -f -c -o trace.copy1c cp -r 1 1copy
在下一步中,我调试了cp命令(通过strace)以找出按什么顺序复制数据:
因此cp按以下顺序执行(仅前4个文件,因为我看到从原始目录中进行第二次读取比从复制目录中进行第二次读取更耗时)
100.xml 150.xml 58.xml 64.xml … *在我的示例中
现在,看看这些文件使用的文件系统块(debugfs输出-ext3 fs):
原始目录:
BLOCKS:(0-9):63038-63047 100.xml(0-9):64091-64100 150.xml(0-9):57926-57935 58.xml(0-9):60959-60968 64.xml....Copied directory:BLOCKS:(0-9):65791-65800 100.xml(0-9):65801-65810 150.xml(0-9):65811-65820 58.xml(0-9):65821-65830 64.xml
....
如您所见,在“复制的目录”中,该块相邻,因此这意味着在读取第一个文件100.xml期间,“预读”技术(控制器或系统设置)可以提高性能。
dd以1.xml到1000.xml的顺序创建文件,但是cp命令以另一顺序(100.xml,150.xml,58.xml,64.xml)复制它。因此,当您执行时:
cp -r 1 1copy
要将这个目录复制到另一个目录,复制的文件块是不相邻的,因此读取此类文件会花费更多时间。
当您复制由cp命令复制的dir(因此文件不是由dd命令创建的)时,文件是相邻的,因此创建:
cp -r 2 2copy
副本的副本速度更快。
摘要:因此,要测试python /
perl的性能,您应该使用相同的目录(或cp命令复制的两个目录),还可以使用选项O_DIRECT绕过所有内核缓冲区进行读取,并直接从磁盘读取数据。
请记住,在不同类型的内核,系统,磁盘控制器,系统设置,fs等上,结果可能会有所不同。
补充:
[debugfs] [root@dhcppc3 test]# debugfs /dev/sda1 debugfs 1.39 (29-May-2006)debugfs: cd testdebugfs: stat test.xmlInode: 24102 Type: regular Mode: 0644 Flags: 0x0 Generation: 3385884179User: 0 Group: 0 Size: 4File ACL: 0 Directory ACL: 0links: 1 Blockcount: 2Fragment: Address: 0 Number: 0 Size: 0ctime: 0x543274bf -- Mon Oct 6 06:53:51 2014atime: 0x543274be -- Mon Oct 6 06:53:50 2014mtime: 0x543274bf -- Mon Oct 6 06:53:51 2014BLOCKS:(0):29935TOTAL: 1debugfs:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)