gpt4 book ai didi

c - 为什么我的 "cat"系统调用函数比 Linux 的 "cat"慢?

转载 作者:IT王子 更新时间:2023-10-28 23:52:42 25 4
gpt4 key购买 nike

我已经在 C 中使用系统调用(打开、读取和写入)来模拟 Linux 系统中的“猫”功能,并且它比真实的慢...

我正在使用与真正的“cat”相同的缓冲区大小,并使用“strace”我认为它进行相同数量的系统调用。但是我的“猫”的输出比真正的“猫”慢一点。

这是我的代码:

#define BUFSIZ 32768

int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;

while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}

return 0;
}

int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;

do {
readBytes = read(fdin, buffer, BUFSIZ);

if(readBytes == -1) {
return -1;
}

if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);

return 0;
}

我正在从一个文件中读取(我将其作为参数传递给 main,我认为此处不需要代码),然后我使用该文件描述符调用 catPrint() 函数,并为输出描述符调用 1,因此它打印到标准输出。

我不明白为什么它变慢了,因为我使用同一个文件进行测试,并且两者(真正的“猫”和我的)都只有一个 read() 和一个 write() 用于整个文本。整个文本不应该只显示在屏幕上吗?

P.S:我已将其标记为家庭作业,尽管我在这里的问题(为什么速度较慢)不是家庭作业的一部分。我只需要使用系统调用来创建一个“cat”类型的函数,这就完成了。我只是对我的代码比较慢感到好奇。

我的愚蠢解决了问题:
我只是决定在同一个文件上调用 linux 的原始 cat 几次,一个接一个,我才意识到它在我调用它的某些时候也很慢,就像我自己的一样慢。我想一切都很好...

很抱歉像这些人一样浪费你的时间。

最佳答案

啊,根据您的编辑,您被预读缓冲区咬伤了。您不能通过运行一次来​​测试两个并排读取文件的程序。第一个总是较慢,因为文件在磁盘上,一旦文件在内存中,第二个将运行得更快,您必须为每个创建新数据或运行一个然后运行两者,以便它们都获得预读缓冲区的好处。

关于c - 为什么我的 "cat"系统调用函数比 Linux 的 "cat"慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com