read
なぜより遅いのですかgetc
?
たとえば、次のようになります。
for (;;) {
chr++;
amr=read(file1, &wc1, 1);
amr2=read(file2, &wc2, 1);
if (wc1 == wc2) {
if (wc1 == '\n')
line++;
if (amr == 0) {
if (eflg)
return (1);
return (0);
}
continue;
}
それより遅い:
for (;;) {
chr++;
c1 = getc(file1);
c2 = getc(file2);
if (c1 == c2) {
if (c1 == '\n')
line++;
if (c1 == EOF) {
if (eflg)
return (1);
return (0);
}
continue;
}
getc
システムコールを使用すると、read
なぜ遅いのですか?
ベストアンサー1
getc()
getc() は読み込みデータを返す前にバッファリングするので 。への呼び出しは、カーネルで行うことが多いため、通常の関数呼び出しよりも完了するのに時間がかかるシステム呼び出しread()
です。read()
カーネル空間に入ったら、スタックを変更し、すべてのコンテキストを保存し、割り込みをマスクとして処理し、一方で完了したらコンテキストを復元し、割り込みを行い、ユーザー空間スタックを再配置します。これがすでに利用可能なバッファリングされたデータがある場合、多くのオーバーヘッドを節約するため、getc()が好ましい理由です。