POSIX 中的 fopen 与 open(在 C 中)
fopen vs open (in C) in POSIX
经过这个question,一个疑问出现了:
一旦 fopen() 比 open() 快(至少对于顺序 writing/ready 操作),前者是库,后者是系统调用,fopen() 在 POSIX compilant OS?
中执行什么系统调用
它调用open
。
fopen
本身并不比open
快;不可能,它是 open
加上一些额外的工作。链接问题中描述的性能优势来自 FILE
对象在其整个生命周期中完成的“缓冲”。实际的优化是调用write
原语更少的次数,每次提供更多的数据。
这里有一个简单的方法来演示效果:编译这个程序。
#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 3) return 1;
long count = atol(argv[1]);
long chunk = atol(argv[2]);
if (count < 1 || chunk < 0) return 1;
FILE *sink = fopen("/dev/null", "wb");
if (!sink) return 1;
if (chunk) {
char *buf = malloc(chunk);
if (!buf) return 1;
if (setvbuf(sink, buf, _IOFBF, chunk)) return 1;
} else {
if (setvbuf(sink, 0, _IONBF, 0)) return 1;
}
while (count--) putc_unlocked('.', sink);
return 0;
}
它有两个参数:要写入的字节总数和输出缓冲区的大小,按顺序排列。 运行 它具有各种参数值和时间性能;你应该看到,例如
./a.out $((1024*1024*128)) 1
比
慢很多
./a.out $((1024*1024*128)) 8192
第一个数字需要非常大才能测量差异。一旦你玩了一段时间,运行
strace ./a.out 50 1
和
strace ./a.out 50 50
了解系统调用级别的差异。 (如果您使用 OS 而不是 Linux,请将 strace
替换为 OS 的任何等效命令。)
经过这个question,一个疑问出现了:
一旦 fopen() 比 open() 快(至少对于顺序 writing/ready 操作),前者是库,后者是系统调用,fopen() 在 POSIX compilant OS?
中执行什么系统调用它调用open
。
fopen
本身并不比open
快;不可能,它是 open
加上一些额外的工作。链接问题中描述的性能优势来自 FILE
对象在其整个生命周期中完成的“缓冲”。实际的优化是调用write
原语更少的次数,每次提供更多的数据。
这里有一个简单的方法来演示效果:编译这个程序。
#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 3) return 1;
long count = atol(argv[1]);
long chunk = atol(argv[2]);
if (count < 1 || chunk < 0) return 1;
FILE *sink = fopen("/dev/null", "wb");
if (!sink) return 1;
if (chunk) {
char *buf = malloc(chunk);
if (!buf) return 1;
if (setvbuf(sink, buf, _IOFBF, chunk)) return 1;
} else {
if (setvbuf(sink, 0, _IONBF, 0)) return 1;
}
while (count--) putc_unlocked('.', sink);
return 0;
}
它有两个参数:要写入的字节总数和输出缓冲区的大小,按顺序排列。 运行 它具有各种参数值和时间性能;你应该看到,例如
./a.out $((1024*1024*128)) 1
比
慢很多./a.out $((1024*1024*128)) 8192
第一个数字需要非常大才能测量差异。一旦你玩了一段时间,运行
strace ./a.out 50 1
和
strace ./a.out 50 50
了解系统调用级别的差异。 (如果您使用 OS 而不是 Linux,请将 strace
替换为 OS 的任何等效命令。)