CPU绑定应用程序与IO绑定

Mat*_*ley 4 language-agnostic data-processing

对于使用大量数据的"数字运算"风格的应用程序(读取:"数百MB,但不是GB",即它可以很好地适应操作系统旁边的内存),将所有数据读入内存是否有意义首先在开始处理之前避免在读取大型相关数据集时可能使程序IO绑定,而是从RAM中加载它们?

这个答案在使用不同的数据支持之间是否有所改变 也就是说,无论你使用的是XML文件,平面文件,完整的DBMS等,答案都是一样的吗?

cle*_*tus 8

你的程序和它的瓶颈一样快.如果可以提高整体性能,那么将数据存储在内存中是很有意义的.没有严格的规则表明它会提高性能.当你修复一个瓶颈时,新的东西就成了瓶颈.因此,解决一个问题可能会使性能提高1%或1000%,具体取决于下一个瓶颈.你正在改进的东西可能仍然是瓶颈.

我认为这些东西通常适合三个层次之一:

  1. 急于.当您需要来自磁盘或网络的东西或计算结果时,您可以去做或做.这是最简单的编程,最容易测试和调试,但性能最差.只要这方面不是瓶颈,这就没问题;
  2. 懒.一旦你完成了特定的读取或计算,就不要再做一段时间,可能是从几毫秒到永远.这会给您的程序增加很多复杂性,但如果读取或计算费用昂贵,可以获得巨大的收益; 和
  3. 过于急切.这很像前两者的组合.结果是缓存的,但不是进行读取或计算或请求,而是有一定数量的抢先活动来预测您可能需要的内容.就像你从一个文件中读取10K一样,你很可能以后想要下一个10K块.而不是延迟执行,你得到它,以防万一它的请求.

从中得出的教训是唐纳德·克努特(Donald Knuth)引用的"有些过度使用且经常引用错误"的说法,"过早的优化是所有邪恶的根源".渴望和过度渴望的解决方案增加了大量的复杂性,因此没有必要为那些不会产生有用益处的东西做这些.

程序员经常犯错误,在确定是否需要以及是否有用之前创建一些高度(据称)优化版本的东西.

我自己拿的是这样的:直到你不解决问题一个问题.