同步与异步write的效率比较

本文通过一个简单的文件拷贝程序,展示了使用DMA(直接内存访问)与普通方向I/O方式在文件复制过程中的性能差异。实验结果显示,采用O_SYNC标志进行同步I/O操作时,耗时3秒;而关闭此标志后的方向I/O操作几乎瞬时完成。该实验证明了不同I/O操作方式对程序执行效率的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:

timewrite  <f1 f2         :表示输出文件f2不用O_SYNC 打开。
timewrite  f1  sync <f2   :表示输出文件f1用O_SYNC 打开。

#include<fcntl.h>
#include<stdio.h>
#include<time.h>
#include <errno.h> 
#define BUFFER_SIZE 1024

int main(char *argc,char *argv)
{
	int from_fd;
	int to_fd;
	int bytes_read, bytes_write;  
	char buffer[BUFFER_SIZE];  
	char *ptr;
	if((from_fd = open("../EMC/net_traffic.dat", O_RDONLY | O_SYNC))==-1)
	{
		printf("open error!\n");
		return 0;
	}
	  
	if((to_fd = open("destination.txt", O_RDONLY | O_WRONLY | O_CREAT ))==-1)
	{       
		        printf("destination file open error!\n");
			        return 0;
	}
	int seconds = time((time_t*)NULL);
	
	 /* 以下代码是一个经典的拷贝文件的代码 */  
    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) {  
            //printf("11");
		    /* 一个致命的错误发生了 */  
        if ((bytes_read == -1) && (errno != EINTR)) break;  
        else if (bytes_read > 0) {  
	            ptr = buffer;  
	                while (bytes_write = write(to_fd, ptr, bytes_read)) {  
		                    /* 一个致命错误发生了 */  
		                if ((bytes_write == -1) && (errno != EINTR))break;  
		                    /* 写完了所有读的字节 */  
		                else if (bytes_write == bytes_read) break;  
		                    /* 只写了一部分,继续写 */  
		                else if (bytes_write > 0) {  
			                    ptr += bytes_write;  
			                        bytes_read -= bytes_write;  
			                    }  
	            }  
            /* 写的时候发生的致命错误 */  
            if (bytes_write == -1)break;  
        }  
    }  
    int seconds1 = time((time_t*)NULL);
    printf("----------------------DMA %d\n",seconds1 - seconds);
    
    close(from_fd);
    close(to_fd);
if((from_fd = open("../EMC/net_traffic.dat", O_RDONLY ))==-1)
	{
		printf("open error!\n");
		return 0;
	}
seconds = time((time_t*)NULL);
	 /* 以下代码是一个经典的拷贝文件的代码 */  
    while (bytes_read = read(from_fd, buffer, BUFFER_SIZE)) {  
            //printf("11");
		    /* 一个致命的错误发生了 */  
        if ((bytes_read == -1) && (errno != EINTR)) break;  
        else if (bytes_read > 0) {  
	            ptr = buffer;  
	                while (bytes_write = write(to_fd, ptr, bytes_read)) {  
		                    /* 一个致命错误发生了 */  
		                if ((bytes_write == -1) && (errno != EINTR))break;  
		                    /* 写完了所有读的字节 */  
		                else if (bytes_write == bytes_read) break;  
		                    /* 只写了一部分,继续写 */  
		                else if (bytes_write > 0) {  
			                    ptr += bytes_write;  
			                        bytes_read -= bytes_write;  
			                    }  
	            }  
            /* 写的时候发生的致命错误 */  
            if (bytes_write == -1)break;  
        }  
    }  
    seconds1 = time((time_t*)NULL);
    printf("-------------------DIRECTION %d\n",seconds1 - seconds);
    close(from_fd);  
    close(to_fd);      
  return 1; 
}
<pre name="code" class="cpp">运行结果:
----------------------DMA 3
-------------------DIRECTION 0
note:文件名 net_traffic.dat 文件大小 2662423113
 
 



Reference:
vim快捷键:http://blog.youkuaiyun.com/donahue_ldz/article/details/17139361http://lveyo.iteye.com/blog/240578
linux下GCC编译C程序(一):http://lveyo.iteye.com/blog/240578
linux c学习笔记-文件的创建与读写(open,read,write):http://lobert.iteye.com/blog/1705861
C语言time()函数:获取当前时间(以秒数表示):http://c.biancheng.net/cpp/html/147.html

结果参考:http://www.cnblogs.com/suzhou/p/5381738.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值