0

作为一个有趣的项目,我想我会编写一个程序来制作 iso 文件。据我所知,它可以工作,但它每 30 秒只能读取 4KB。我使用弹出 -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
4

5 回答 5

3

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

如果您想使用 Unix IO 原语而不是 C 包装器,您可以使用read()andwrite()mmap()代替。

于 2011-03-29T21:40:54.727 回答
1
  • 在这种情况下,缓冲 IO 几乎不合适,扫描输入以查找换行符的 fgets 也不合适。查看mmap
  • 连续的缓冲区取消/重新分配会减慢您的速度。
  • Fprintf 不适合写入二进制数据。它也很慢。
于 2011-03-29T21:38:25.243 回答
0

我不是 C 大师,但听起来您需要实现某种形式的缓冲数据读取器和写入器才能看到性能改进。

于 2011-03-29T21:38:46.163 回答
0

首先,我不会使用格式化输入(fgets& 文本模式),而是使用原始二进制输入(fopen使用b标志freadfwrite用于写入)。这样 stdio 不需要执行文本模式所需的替换(如果在您的平台上需要),并且您有一系列固定大小的读取,其性能应该比fgets' 等待\n.

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

于 2011-03-29T21:42:37.983 回答
-1

mallocandfree移到循环之外。

于 2011-03-29T21:39:50.250 回答