gpt4 book ai didi

c - 如何用自定义字符串快速填充缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:53 25 4
gpt4 key购买 nike

我的要求是用一些给定的模式(3 个字节的 char)写一个文件。该文件可以是任何大小,例如如果文件大小为 10 字节,则内容将为 "abcabcabca" 如果给定模式为 "abc"

现在,memset 不适用于多个字符。我的问题是:

What is the quickest way to fill a buffer with such a string and then provide it to the write system call?

我可以想到以下步骤

  1. 打开文件。
  2. 使用 for 循环和写入模式填充缓冲区(如果未指定,则最少 1024 个字符)。
  3. 循环直到文件大小。

我不确定如何使用给定的模式快速填充缓冲区。

最佳答案

OP的算法很好,只是需要实现它。

写入缓冲区、使用循环、memcpy() 等的任何时间都被文件 I/O 时间淹没了。因此只需要适度优化缓冲区的形成。

真正是一个很好的机会来剖析您的代码。尝试计时 2 实现,例如下面的 2,看看时差结果如何。

int Fill_Basic(FILE *outf, size_t Length, char a, char b char c) {
while (Length > 0) {
if (Length > 0) {
Length--;
fputc(outf, a);
}
if (Length > 0) {
Length--;
fputc(outf, b);
}
if (Length > 0) {
Length--;
fputc(outf, c);
}
}
return ferror(outf);
}

int Fill_Faster(FILE *outf, size_t Length, char a, char b char c) {
// A trick is to provide fwrite() with a "nice" buffer size.
// This is often a power of 2 and is highly platform dependent, but a reasonable assertion.
// Profiling would help access this.
// Let's assume 1024
size_t bsize = min(Length, 1024);
char buf[bsize + 2]; // Allocate (3-1) extra.
for (char *p = buf; p < &buf[bsize]; ) {
*p++ = a;
*p++ = b;
*p++ = c;
}
// Optimization: each time through the loop, provide the buffer shifted as needed
// 1st time "abcabc..."
// 2nd time "bcabca..."
// 3rd time "cabcab..."
// 4th time "abcabc..."
size_t Offset = 0;
while (Length > 0) {
for (size_t i=0; i<3; i++) {
size_t t = min(Length, bsize);
if (t != fwrite(&buffer[Offset], 1, t, outf)) handle_error();
Length -= t;
Offset += t;
Offset %= 3;
}
}
return ferror(outf);
}

关于c - 如何用自定义字符串快速填充缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19137244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com