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

时间:2011-03-29 21:36:05

标签: c iso9660

作为一个有趣的项目,我以为我会编写一个程序来制作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

5 个答案:

答案 0 :(得分:3)

fgets()处理文本并且是面向行的,浪费时间寻找换行符。此外,它和fprintf()不处理NUL字节,并且可能会被它们弄得很困惑。您想使用二进制IO,即fread()fwrite()。也没有必要继续free()并重新分配您的缓冲区。

如果要使用Unix IO原语而不是C包装器,可以改用read()write()mmap()

答案 1 :(得分:1)

  • 缓冲IO几乎不合适 这种情况,fgets也不是 扫描输入以获取换行符。看 进入mmap
  • 连续缓冲 de / re-allocation让你失望。
  • Fprintf不适合编写二进制数据。它也很慢。

答案 2 :(得分:0)

我不是C大师,但听起来你需要实现某种形式的缓冲读者和数据编写者才能看到性能提升。

答案 3 :(得分:0)

首先,我不会使用格式化输入(fgets&amp; text mode),而是使用带有fopen标志的原始二进制输入(b {{1}和fread写作)。这样stdio就不需要执行文本模式所需的替换(如果您的平台需要),并且您有一系列固定大小的读取,其性能应优于fwrite'等待{{ 1}}。

然后,我将摆脱动态内存分配;连续分配/解除分配可能会破坏您的应用程序的性能。只需为堆栈上的所有静态缓冲区分配一次(例如8192字节)并一直使用它。

答案 4 :(得分:-1)

mallocfree移到循环外。