在C语言中创建光盘映像(iso 9660)的速度非常慢

在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

作为一个有趣的项目,我想我应该写一个程序来制作iso文件。据我所知,它工作正常,但每30秒只能读取4KB。我使用eject-X11将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
#包括
#包括
#包括
#定义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不适合写入二进制数据。它也很慢

      我不是C专家,但听起来您需要实现某种形式的数据缓冲读写器来提高性能。

      我不是C专家,但是听起来您需要实现某种形式的缓冲数据读写器来提高性能。

      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使用字符串函数来读取/写入任意二进制数据…那样,使缓冲区(更)大,使缓冲区(更)大