使用不同方法Linux的功能性能分析

时间:2012-02-12 09:53:46

标签: c linux

我知道这个问题更多的是编译器&操作系统相关的东西,但如果有人可以对它有所启发,它可以帮助我做一些优化。

我的目标是在文件夹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和执行时间更有效。

2 个答案:

答案 0 :(得分:3)

您将受I / O限制,而不受CPU限制。

您可能在错误的级别进行优化 - 无论您使用此设计做什么,您的CPU都会在您的驱动器磨损时等待。

在我的头顶,我肯定会调查:

  • 您的硬盘驱动器头需要多长时间。我敢打赌,通过在写入磁盘之前对这些目录进行排序,为了最大程度地减少磁头搜索,您可以优先考虑减少CPU周期。
  • 从顶部完全重新设计您的系统:除了编写1000万个目录外,还要考虑其他模型。你能写一个较少数量的文件,也许使用mmap()代替吗?请注意,问题不仅仅是将此数据写入磁盘 - 您的设计选择彻底会影响用户在需要访问时将此数据读回内存的速度。例如,如果您有十个用户需要来自文件系统所有不同部分的文件,那么您的硬盘将成为您的瓶颈。
  • 根据您的应用程序,Nosql数据库可能更适合您。

答案 1 :(得分:2)

获得良好答案的唯一方法是尝试使用您的特定系统并进行衡量。

但是,我认为最大限度地减少系统调用次数应该更好。

实际上,您可能正在考虑在同一目录中编写大量文件。最近的文件系统有索引目录,但是一些较旧的文件系统没有它们(因此对于这样的旧文件系统,文件创建或搜索操作在每个目录中的条目数是线性的。)

当考虑在某个目录/foo中编写数千个文件时,一个老技巧是创建几个子目录,如/foo/1/ /foo/2/,并填充每个这样的子目录只有几百个条目。

这样做的另一个原因是因为交互式shell(文件完成)在包含数万个条目的目录中不是很开心。

与往常一样,您的里程可能会有所不同。

如果您想拥有数千个小文件,可以考虑其他解决方案,例如数据库(例如,带有MySQL或PostGresQL客户端库和服务器)或GDBM索引文件