我知道这个问题更多的是编译器&操作系统相关的东西,但如果有人可以对它有所启发,它可以帮助我做一些优化。
我的目标是在文件夹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和执行时间更有效。
答案 0 :(得分:3)
您将受I / O限制,而不受CPU限制。
您可能在错误的级别进行优化 - 无论您使用此设计做什么,您的CPU都会在您的驱动器磨损时等待。
在我的头顶,我肯定会调查:
答案 1 :(得分:2)
获得良好答案的唯一方法是尝试使用您的特定系统并进行衡量。
但是,我认为最大限度地减少系统调用次数应该更好。
实际上,您可能正在考虑在同一目录中编写大量文件。最近的文件系统有索引目录,但是一些较旧的文件系统没有它们(因此对于这样的旧文件系统,文件创建或搜索操作在每个目录中的条目数是线性的。)
当考虑在某个目录/foo
中编写数千个文件时,一个老技巧是创建几个子目录,如/foo/1/
/foo/2/
,并填充每个这样的子目录只有几百个条目。
这样做的另一个原因是因为交互式shell(文件完成)在包含数万个条目的目录中不是很开心。
与往常一样,您的里程可能会有所不同。
如果您想拥有数千个小文件,可以考虑其他解决方案,例如数据库(例如,带有MySQL或PostGresQL客户端库和服务器)或GDBM索引文件