在C语言中创建光盘映像(iso 9660)的速度非常慢
作为一个有趣的项目,我想我应该写一个程序来制作iso文件。据我所知,它工作正常,但每30秒只能读取4KB。我使用eject-X11将cdrom驱动器的速度降低到合理的速度。如果没有它,驱动器将全速运行,并很快终止进程。我们将非常感谢您提出的任何加快/更好的建议在C语言中创建光盘映像(iso 9660)的速度非常慢,c,iso9660,C,Iso9660,作为一个有趣的项目,我想我应该写一个程序来制作iso文件。据我所知,它工作正常,但每30秒只能读取4KB。我使用eject-X11将cdrom驱动器的速度降低到合理的速度。如果没有它,驱动器将全速运行,并很快终止进程。我们将非常感谢您提出的任何加快/更好的建议 #include<stdio.h> #include<stdlib.h> #include<string.h> #define BUFFSIZE 4092 int main(int argc, cha
#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
#包括
#包括
#包括
#定义BUFFSIZE 4092
int main(int argc,字符**argv)
{
文件*fp=fopen(“/dev/cdrom”,“r”);
FILE*FILE=fopen(strcat(argv[1],“.iso”),“w”);
printf(“复制…\n”);
而(!feof(fp))
{
char*line=(char*)malloc(sizeof(char)*BUFFSIZE);
FGET(线条、尺寸、fp);
fprintf(文件“%s”,行);
自由线;
}//结束时
fclose(fp);
fclose(文件);
printf(“完成!\n”);
返回0;
}//端干管
- 缓冲IO在应用程序中几乎不合适 这种情况下,fgets也不会 扫描输入以查找换行符。看 进入李>
- 连续缓冲区 取消/重新分配会降低您的速度
- Fprintf不适合写入二进制数据。它也很慢
- 缓冲IO在应用程序中几乎不合适 这种情况下,fgets也不会 扫描输入以查找换行符。看 进入李>
- 连续缓冲区 取消/重新分配会降低您的速度
- Fprintf不适合写入二进制数据。它也很慢
malloc
和free
移动到循环外。将malloc
和free
移动到循环外。fgets()
处理文本,并面向行,浪费时间寻找新线。此外,它和fprintf()
不处理NUL
字节,可能会被它们弄糊涂。您希望使用二进制IO,即fread()
和fwrite()
。也不需要不断地释放()
和重新分配缓冲区
如果您想使用Unix IO原语而不是C包装器,可以使用read()
和write()
或mmap()
。fgets()
处理文本并面向行,浪费时间寻找换行符。此外,它和fprintf()
不处理NUL
字节,可能会被它们弄糊涂。您希望使用二进制IO,即fread()
和fwrite()
。也不需要不断地释放()
和重新分配缓冲区
如果您想使用Unix IO原语而不是C包装器,可以使用
read()
和write()
或mmap()
。首先,我不会使用格式化输入(fgets
&text模式),而是使用原始二进制输入(fopen
带有b
标志,fread
和fwrite
用于写入)。这样,stdio就不需要执行文本模式所需的替换(如果平台上需要的话),并且您有一系列固定大小的读取,它们的性能应该比等待\n
的fgets
更好
然后,我将摆脱动态内存分配;连续分配/取消分配可能会降低应用程序的性能。只需在堆栈上为所有静态缓冲区分配一次(例如8192字节),并一直使用它。首先,我不会使用格式化输入(
fgets
&text模式),但使用原始二进制输入(fopen
,带有b
标志,fread
和fwrite
进行写入)。这样,stdio就不需要执行文本模式所需的替换(如果您的平台需要的话),并且您有一系列固定大小的读取,这些读取应该比等待\n
的fgets执行得更好
然后,我将消除这种动态内存分配;连续分配/取消分配可能会降低应用程序的性能。只需在堆栈上为所有静态缓冲区分配一次(例如8192字节)您可能希望以二进制模式打开文件;像这样覆盖
argv[1]
可能是个坏主意;摆脱castBold使用字符串函数来读取/写入任意二进制数据……您可能希望以二进制模式打开文件;覆盖argv[1]可能是个坏主意
像这样;摆脱castBold使用字符串函数来读取/写入任意二进制数据…那样,使缓冲区(更)大,使缓冲区(更)大