底层调用一定比上层快吗?

在我的印象中有一种误区:总是认为底层比上层快,如汇编编的程序比Basic快,操作系统底层调用比上层调用速度快,甚至认为底层开发比上层开发有前途,没想到今天被一段程序推翻。

这是一段Linux上的C代码,请把复制缓冲区大小SIZE分别改为1和1024编译运行此程序,复制的文件1.mp3大约为5M,上代码:

ContractedBlock.gif ExpandedBlockStart.gif 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则每次都需要调用系统内核,故需要多次传递,另外估计应该和多次写磁盘也有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值