c - 最佳缓冲区大小

标签 c performance memory-management buffer

我想这是一道性能计算题。我正在用 C 编写一个程序,它会产生大量输出,远远超过通常可以全部存储在 RAM 中的输出量。我打算简单地将输出写入 stdout;所以它可能只是进入屏幕,或者可能被重定向到一个文件中。我的问题是如何为将存储在 RAM 中的数据选择最佳缓冲区大小?

输出数据本身并不是特别重要,所以我们假设它正在生成大量随机整数列表。

我打算有 2 个线程:一个生成数据并将其写入缓冲区,另一个将该缓冲区写入 stdout。这样,我就可以开始生成下一个输出缓冲区,而前一个缓冲区仍在写入 stdout

明确地说,我的问题不是关于如何使用 malloc()pthread_create() 等函数。我的问题纯粹是关于如何选择一个最佳缓冲区大小的字节数(512、1024、1048576)将提供最佳性能?

理想情况下,我想找到一种可以动态选择最佳缓冲区大小的方法,这样我的程序就可以根据当时运行的任何硬件进行调整。我曾尝试寻找这个问题的答案,虽然我发现了一些关于缓冲区大小的话题,但我找不到与这个问题特别相关的任何内容。因此,我只是想将它作为一个问题发布,希望我能得到一些不同的观点,并提出比我自己能做的更好的东西。

最佳答案

混合设计和优化是一种浪费时间的行为。这被认为是 top canonical mistakes. 之一它可能会损坏您的设计,并且实际上不会优化太多。

让您的程序正常运行,如果有性能问题的迹象,则对其进行概要分析并考虑分析真正导致问题的部分。

我认为这尤其适用于复杂的架构优化,例如应用程序的多线程。对单个图像进行多线程处理是您永远不想做的事情:它无法测试,容易出现不可重现的错误,在不同的执行环境中会以不同的方式失败,并且还有其他问题。但是,对于某些程序,多线程并行执行是功能所必需的,或者是获得必要性能的一种方式。它得到广泛支持,从本质上讲,它有时是一种必要的邪恶。

如果没有确凿证据证明像您这样的程序需要它,您就不会在初始设计中想要它。

几乎任何其他并行方法(消息传递?)都将更易于实现和调试,并且无论如何您都会在操作系统的 I/O 系统中获得大量并行方法。

关于c - 最佳缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405727/

相关文章:

c++ - std::unique_ptr 和 reset() 或您的类的 Reset 方法?

C - if 语句可以更改变量的值

ios - Swift 并发操作慢 2 倍

c++ - 比较 vector 中的元素时花费的时间呈指数增长

python - 在python中将数据库表写入文件的最快方法

c# - WCF - 使用 "DataSet"通过 NetTcpBinding 传输数据好吗

iphone - 这是保留对象还是自动释放对象?

c - 位数组的问题

c - 如何使用宏将宏字符串化?

c - 如何从 C 中的字符串中只取回一个字符?