C语言 如果可以选择fwrite()100 1 bytes,或1 100 bytes,应该首选哪种方法?

g6ll5ycj  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(170)

我感兴趣的是,如果有一个理论上的速度差异

fwrite(str , 1 , 100 , fp );

fwrite(str , 100 , 1 , fp );

这取决于函数在glibc中的编写方式,以及它进行了多少次写调用,以及它是如何缓冲的(忽略gcc上的硬件差异)。

xyhw6mcr

xyhw6mcr1#

musl或glibc或FreeBSD libc没有区别,因为它们都使用size*nmemb调用底层函数:

musl

size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f)
{
    size_t k, l = size*nmemb;
    // ...
    k = __fwritex(src, l, f);

glibc

size_t
_IO_fwrite (const void *buf, size_t size, size_t count, FILE *fp)
{
  size_t request = size * count;
  // ...
  written = _IO_sputn (fp, (const char *) buf, request);

freebsd

n = count * size;
    // ...
    uio.uio_resid = iov.iov_len = n;
    // ...
    if (__sfvwrite(fp, &uio) != 0)
o8x7eapl

o8x7eapl2#

我写了两段代码来检查它们的性能之间的差异。
a.c

#include <stdlib.h>
#include <stdio.h>

int
main() {

        char* str = "Hello\n";
        FILE* fd = fopen("out.txt", "w");
        for (int i=0; i<1000; i++) 
                fwrite(str , 1 , 100 , fd);

        fclose(fd);
        return 0;

}

b.c

#include <stdlib.h>
#include <stdio.h>

int
main() {

        char* str = "Hello\n";
        FILE* fd = fopen("out.txt", "w");
        for (int i=0; i<1000; i++) 
                fwrite(str , 100 , 1 , fd);
        fclose(fd);
        return 0;
}

输出:

(a.riahi@asax.local@U-Riahi:cplay) > gcc a.c
(a.riahi@asax.local@U-Riahi:cplay) > time ./a.out 

real    0m0.001s
user    0m0.001s
sys 0m0.000s
(a.riahi@asax.local@U-Riahi:cplay) > gcc b.c
(a.riahi@asax.local@U-Riahi:cplay) > time ./a.out 

real    0m0.001s
user    0m0.000s
sys 0m0.001s

它们之间没有真实的的区别。

相关问题