作为一个有趣的项目,我以为我会编写一个程序来制作iso文件。据我所知它有效,但它每30秒仅读取4KB。我使用eject -x 11将我的cdrom驱动器减速到合理的速度。如果没有它,驱动器将全速运行并迅速杀死该过程。任何提高这个速度/更好的建议都将非常感激。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFFSIZE 4092
int main(int argc, char **argv)
{
FILE *fp = fopen("/dev/cdrom", "r");
FILE *file = fopen(strcat(argv[1], ".iso"), "w");
printf("Copying...\n");
while(!feof(fp))
{
char *line=(char *)malloc(sizeof(char) * BUFFSIZE);
fgets(line, BUFFSIZE, fp);
fprintf(file, "%s",line);
free(line);
}//end while
fclose(fp);
fclose(file);
printf("Done!\n");
return 0;
}//end main
答案 0 :(得分:3)
fgets()
处理文本并且是面向行的,浪费时间寻找换行符。此外,它和fprintf()
不处理NUL
字节,并且可能会被它们弄得很困惑。您想使用二进制IO,即fread()
和fwrite()
。也没有必要继续free()
并重新分配您的缓冲区。
如果要使用Unix IO原语而不是C包装器,可以改用read()
和write()
或mmap()
。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不是C大师,但听起来你需要实现某种形式的缓冲读者和数据编写者才能看到性能提升。
答案 3 :(得分:0)
首先,我不会使用格式化输入(fgets
&amp; text mode),而是使用带有fopen
标志的原始二进制输入(b
{{1}和fread
写作)。这样stdio就不需要执行文本模式所需的替换(如果您的平台需要),并且您有一系列固定大小的读取,其性能应优于fwrite
'等待{{ 1}}。
然后,我将摆脱动态内存分配;连续分配/解除分配可能会破坏您的应用程序的性能。只需为堆栈上的所有静态缓冲区分配一次(例如8192字节)并一直使用它。
答案 4 :(得分:-1)
将malloc
和free
移到循环外。