Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不同方法Linux下功能的性能分析_C_Linux - Fatal编程技术网

C 不同方法Linux下功能的性能分析

C 不同方法Linux下功能的性能分析,c,linux,C,Linux,我知道这个问题更多的是编译器和操作系统相关的东西,但如果有人能对它有所了解,它可以帮助我进行一些优化 我的目标是在文件夹y中创建一个文件X (可能有数百万个,而且x和y是每个呼叫的变体和更改。) 我在Linux上工作 要做到这一点,我有两种方法: 首先对所需的目录“y”执行chdir,然后创建文件“x” C代码: char *dir = "/root/"; FILE *fd; chdir(dir); fd = fopen("geneliatestingN","a+"); fprintf(fd,

我知道这个问题更多的是编译器和操作系统相关的东西,但如果有人能对它有所了解,它可以帮助我进行一些优化

我的目标是在文件夹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);
战略:

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
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
第二种方法是 只需提供文件的绝对路径并创建它

C代码:

sprintf(filepath, "%s/geneliatestingS",dir);
fd = fopen(filepath,"a+");
fprintf(fd,"ansh Testing again");
fclose(fd);
战略:

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
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和执行时间效率更高。

获得好答案的唯一方法是在特定的系统上进行测试

然而,我相信尽量减少系统调用的数量应该更好

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

当考虑在某个目录
/foo
中写入数千个文件时,一个老把戏是创建几十个子目录,如
/foo/1/
/foo/2/
,并用几百个条目填充每个子目录

这样做的另一个原因是,在包含数以万计条目的目录中,交互式shell(带有文件完成)不是很令人满意

一如既往,您的里程数可能会有所不同


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

<强>您将被I/O绑定,而不是CPU绑定。< /强>

您可能在错误的级别上进行了优化-无论您对这种设计做什么,您的CPU都将在等待,而您的驱动器将被磨碎

在我脑海中,我肯定会研究:

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

什么文件系统?也许一些背景会让答案更有趣。你打算在不同的目录下创建大量的文件吗?嗨,Johan,这是CentOS 5.4版(最终版)。Linux 2.6.18-164.el5PAE 2009 i686 i686 i386 GNU/Linux。是的,Johan,我有一组大约1000万个根目录,这些文件被随机写入这些目录中的任何一个,或者可能写入其子目录。请遵循下面的建议。如果您确实需要坚持您的方法,请尝试各种文件系统和文件系统选项(例如man tune2fs)。看看ReiserFS(或Reiser4),谢谢大家的评论。。但是文件夹实际上是散列路径,所以不必担心,读取和写入都是O(1)操作。