在我的印象中有一种误区:总是认为底层比上层快,如汇编编的程序比Basic快,操作系统底层调用比上层调用速度快,甚至认为底层开发比上层开发有前途,没想到今天被一段程序推翻。
这是一段Linux上的C代码,请把复制缓冲区大小SIZE分别改为1和1024编译运行此程序,复制的文件1.mp3大约为5M,上代码:

Code
#include <fcntl.h>
#include <stdio.h>
#define SIZE 1024
//系统要求三个参数:源文件,目标文件,标识,标识1表示使用系统文件调用,2表示库
//函数调用
main(int argc, char *argv[])
{
char buf[1024];
if (argv[3][0] == '1')
{
//系统调用
int fd1, fd2;
fd1 = open(argv[1], O_RDONLY);
creat(argv[2],0660);
fd2 = open(argv[2], O_WRONLY);
int n;
while(n = read(fd1, buf, SIZE))
{
write(fd2, buf, n);
}
close(fd1);
close(fd2);
}
else
{
//库文件调用
FILE *f1, *f2;
f1 = fopen(argv[1], "r");
f2 = fopen(argv[2], "w");
int n;
while(n = fread(buf, 1, SIZE, f1))
{
fwrite(buf, 1, n, f2);
}
fclose(f1);
fclose(f2);
}
}
下面是运行结果(Ubutun8.10):

说明:
库函数当前比系统函数要高级,但此处在SIZE=1时,效率相差非常巨大。合理的解释是:指令从外部(库函数)到操作系统内核函数需要时间,库文件函数在fwrite到一定数量后才调用系统函数write,而如果直接使用系统函数write则每次都需要调用系统内核,故需要多次传递,另外估计应该和多次写磁盘也有关系。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本