帮同学作一个作业,写了两个程序,完成的功能类似LINUX中的head和tail命令,可以获取一个文件中间的几行。这两个程序实现的是同一个功能,但是一个用的是一个类似LIBC中的fgetc的函数到文件里一个一个字符地取;而第二个程序则是用了行缓存,通过INIT_LINE_BUFFER和INC_LINE_BUFFER来控制,缓存大小和扩展大小。程序旨在说明问题,如果代码上有什么丑陋的,请包涵。

未做buffer的程序代码:
  1Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <stdio.h>
  2Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <stdlib.h>
  3Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <sys/types.h>
  4Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <sys/stat.h>
  5Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <string.h>
  6Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <unistd.h>
  7Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <fcntl.h>
  8Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
  9Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define CHAR_BUFFER 1
 10Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define BUFFER_SIZE 1024
 11Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define LINE_BUFFER 128
 12Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define MAX_FILE_LINE_NUM 1000000
 13Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 14Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int rw_ptr;  // read-write pointer
 15Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int lineNum;  // number of lines in the file
 16Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 17Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int position_rw_pntr(int fd, int num_lines);
 18Buffered I/O 与 Non-Buffered I/O性能差异的实例体验char* get_next_line(int fd);
 19Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int get_next_char(int fd);
 20Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 21Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int main(int argc, char *argv[]) 
 22


做了buffer的程序代码:
  1Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <stdio.h>
  2Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <stdlib.h>
  3Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <sys/types.h>
  4Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <sys/stat.h>
  5Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <string.h>
  6Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <unistd.h>
  7Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#include <fcntl.h>
  8Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
  9Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define BUFFER_SIZE 1024
 10Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define INIT_BUFF_SIZE 64
 11Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define INC_BUFF_SIZE 8
 12Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define LINE_BUFFER 128
 13Buffered I/O 与 Non-Buffered I/O性能差异的实例体验#define MAX_FILE_LINE_NUM 1000000
 14Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 15Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int rw_ptr;  // read-write pointer
 16Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int lineNum;  // number of lines in the file
 17Buffered I/O 与 Non-Buffered I/O性能差异的实例体验char lineBuf[INIT_BUFF_SIZE];
 18Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int linePtr;
 19Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int curBufSize;
 20Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 21Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int position_rw_pntr(int fd, int num_lines);
 22Buffered I/O 与 Non-Buffered I/O性能差异的实例体验char* get_next_line(int fd);
 23Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int get_next_char(int fd);
 24Buffered I/O 与 Non-Buffered I/O性能差异的实例体验
 25Buffered I/O 与 Non-Buffered I/O性能差异的实例体验int main(int argc, char *argv[]) 
 26

最后用了一个shell脚本来测试两个的运行时间,比较其优劣(其中的BigFile.txt是一个很大的文件):
#!/bin/bash

set `date`
echo start test part1 at $
4
../part1/lab2.exe 300000 BigFile.txt > part1.bt
set `date`
echo finish test part1 at $
4
set `date`
echo start test part2 at $
4
../part2/lab2.exe 300000 BigFile.txt > part2.bt
set `date`
echo finish test part2 at $
4

用个跑下来,前者要比后者慢一倍。可见buffer的好处。如果调高buffer的size,效果将更明显。

相关文章:

  • 2021-05-26
  • 2022-12-23
  • 2022-01-12
  • 2021-10-15
  • 2021-06-18
  • 2022-03-11
  • 2021-08-27
猜你喜欢
  • 2021-11-12
  • 2021-07-12
  • 2022-12-23
  • 2021-08-15
  • 2021-11-13
  • 2021-07-27
  • 2021-04-26
相关资源
相似解决方案