gpt4 book ai didi

c++ - 无法足够快地写入位集

转载 作者:行者123 更新时间:2023-11-30 03:15:17 25 4
gpt4 key购买 nike

我需要能够以每 10,000 个位集大约 1 毫秒的速度写下 12 位位集。基本上,我在 12 位包(在本例中为位集)中提供了数据,我需要能够将它们存储在一个非常小的时间跨度。

现在我已经设置了一个大小为 10,000 的位集数组示例(以模拟我实际得到的结果)并将它们全部写入一个文件

int main()
{

std::bitset<12> map[10000];

std::ofstream os("myfile.txt", std::ofstream::binary);
//From here
for (int i = 0; i < 10000; ++i)
{
os << map[i];
}
//to here takes slightly under 7 ms -- too slow
}

正如评论所说,它需要 7 毫秒。我对任何和所有速度改进持开放态度,并希望为该循环获得(最佳)1 毫秒。

编辑信息:这是用于串行外设接口(interface) (SPI) 的,数据将全部可用,如示例中所示,然后一次性全部转储,而不是作为位集流。有关更多技术规范,我使用的是 Arduino Atmega328p、ADS7816 和 SD 读卡器

最佳答案

两条建议:

  • 尽量减少访问操作系统的次数。一次写入多个字节。
  • 写入前打包。您当前的解决方案将这些位写为字符,即每个位一个字节。以二进制模式写入,这会更紧凑 8 倍(也更快)。
#include <bitset>
#include <fstream>
#include <vector>

int main()
{
std::bitset<12> map[10000];

// Initialize with demo values
for (int i = 0; i < 10000; ++i) {
map[i] = i + 1;
}

// Pack bits into a binary buffer
std::vector<uint8_t> buffer((10000 * 12 + 7) / 8);
for (int i = 0, j = 0, rem = 0; i < 10000; ++i) {
unsigned long b = map[i].to_ulong();
buffer[j++] |= static_cast<uint8_t>(b >> (4 + rem));
buffer[j] |= static_cast<uint8_t>(b << (4 - rem));
rem += 12 % 8;
if (rem >= 8) {
rem -= 8;
j++;
}
}

// Write the buffer in 1 go
std::ofstream os("myfile.bin", std::ofstream::binary);
os.write(reinterpret_cast<const char*>(buffer.data()), buffer.size());
os.close(); // don't forget to close() to flush the file
}

如果您希望保留文本文件格式,至少启用缓冲:

int main()
{
std::bitset<12> map[10000];

// Enable buffering
std::vector<char> buf(256 * 1024);
std::ofstream os("myfile.txt", std::ofstream::binary);
os.rdbuf()->pubsetbuf(buf.data(), buf.size());

for (int i = 0; i < 10000; ++i)
{
os << map[i];
}
os.close(); // to flush the buffer
}

关于c++ - 无法足够快地写入位集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57153665/

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