我有一个执行I / O的库。有几个外部旋钮用于调整内部使用的内存缓冲区的大小。当我运行一些测试时,我发现缓冲区的大小会显着影响性能。
但最佳尺寸似乎取决于一堆东西 - PC上的可用内存,正在处理的文件的大小(从非常小到大),文件数量,输出速度流相对于输入流,我不知道还有什么。
在库中构建自适应内存策略是否有意义?或者它是否更好地发挥作用,并让图书馆的用户弄清楚要使用什么?
有没有人这样做过 - 这有多难?它有效吗?
考虑到不同的缓冲区大小,我认为库可以跟踪各种操作所需的时间,然后它可以做出关于哪个大小最佳的一些决定。我可以想象让库在初始I / O轮次中通过各种缓冲区大小进行旋转......然后它最终将根据结果进行计算并在未来轮次中调整缓冲区大小。但那么,多久重新检查一次?多久调整一次?
答案 0 :(得分:2)
自适应方法有时被称为“自主”,使用人类自主神经系统的类比:你不会有意识地控制你的心率和呼吸,你的自主神经系统会这样做。
你可以阅读其中一些here和here(对插头道歉,但我想表明这个概念正在被认真对待,并在真实产品中体现出来。)< / p>
我使用试图做到这一点的产品的经验是,它们确实能够正常工作,但却会让我感到不快:那是因为他们倾向于采取“父亲最了解”的方法。你做了一些(你相信)你的应用程序的小变化,或环境和未预料到的事情发生。你不知道为什么,你不知道它是否好。所以我的自治规则是:
告诉我你在做什么,为什么
现在有时基础数学非常复杂 - 考虑到一些自主系统正在发展趋势并因此做出预测性变化(这种类型的请求数量增加,让我们提供更多资源X),因此数学模型非常重要。因此,并不总是能够提供简单的解释。然而,对观看人类的某种程度的反馈可以让人放心。