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ため、非常に混乱する可能性があります。fread()バイナリ IO、つまりandを使用したいfwrite()free()また、バッファを継続的に再割り当てする必要もありません。

C ラッパーではなく Unix IO プリミティブを使用する場合は、代わりにread()and write()orを使用できます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付き、および書き込み用) を使用します。この方法では、stdio はテキスト モードに必要な置換を実行する必要がなく (プラットフォームで必要な場合)、一連の固定サイズの読み取りは、.bfreadfwritefgets\n

次に、その動的メモリ割り当てを取り除きます。継続的な割り当て/割り当て解除により、アプリケーションのパフォーマンスが低下している可能性があります。スタック上のすべての静的バッファ (たとえば 8192 バイト) に対して 1 回だけ割り当て、それを常に使用します。

于 2011-03-29T21:42:37.983 に答える
-1

mallocと をfreeループの外に移動します。

于 2011-03-29T21:39:50.250 に答える