[英]Performance analysis of a functionality with different approaches Linux
我知道这个问题更多是与编译器和OS相关的内容,但是如果有人可以对它有所了解,它可以帮助我进行一些优化。
我的目标是在文件夹y中创建文件X
(可能有数百万个数字,x和y也是每次调用的变体和更改。)我正在Linux上工作。
为此,我有两种方法:
首先对所需目录“ y”执行chdir,然后创建文件“ x”。
C代码:
char *dir = "/root/";
FILE *fd;
chdir(dir);
fd = fopen("geneliatestingN","a+");
fprintf(fd,"ansh");
fclose(fd);
strace的:
1329039557.874631 chdir("/root/") = 0
1329039557.874704 brk(0) = 0x9ad6000
1329039557.874726 brk(0x9af7000) = 0x9af7000
1329039557.874757 open("geneliatestingN", O_RDWR|O_CREAT|O_APPEND, 0666) = 3
1329039557.874817 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1329039557.874869 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fcb000
1329039557.874899 write(3, "ansh", 4) = 4
1329039557.874940 close(3) = 0
第二种方法是只提供文件的绝对路径并创建它。
C代码:
sprintf(filepath, "%s/geneliatestingS",dir);
fd = fopen(filepath,"a+");
fprintf(fd,"ansh Testing again");
fclose(fd);
strace的:
1329039557.875000 open("/root//geneliatestingS", O_RDWR|O_CREAT|O_APPEND, 0666) = 3
1329039557.875046 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1329039557.875096 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fcb000
1329039557.875123 write(3, "ansh Testing again", 18) = 18
1329039557.875160 close(3) = 0
因此,从根本上来说,哪种更好的方法可以完成此功能,而这两者将消耗更少的指令周期,在CPU和执行时间上都更加高效。
您将受I / O约束,而不受CPU约束。
您可能在错误的级别进行了优化-不管您使用这种设计做什么,CPU都将在驱动器磨削的同时等待着。
在我的头顶上,我肯定会研究:
获得良好答案的唯一方法是尝试使用您的特定系统并进行评估。
但是,我认为减少系统调用次数应该会更好。
实际上,您可能正在考虑在同一目录中写入大量文件。 最近的文件系统已经建立了索引目录,但是一些较旧的文件系统却没有索引(因此,对于这样的旧文件系统,文件创建或查找操作在每个目录中的条目数上都是线性的)。
考虑在某个目录/foo
写入数千个文件时,一个老技巧是创建几十个子目录(如/foo/1/
/foo/2/
并在每个这样的子目录中填充几百个条目。
这样做的另一个原因是因为交互式shell(带有文件完成功能)在包含成千上万个条目的目录中不太满意。
和往常一样,您的里程可能会有所不同。
如果您想拥有成千上万个小文件,则可以考虑其他解决方案,例如数据库(例如,带有MySQL或PostGresQL客户端库和服务器)或GDBM索引文件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.