我们的构build令人烦恼地慢。 这是一个用Ant构build的Java系统,我正在Windows XP上运行。 视硬件而定,可能需要5到15分钟才能完成。
在机器上观察整体性能指标,并将硬件差异与构build时间相关联,表明该过程是I / O限制的。 这也表明,这个过程比写作要多得多。
但是,我还没有find一个很好的方法来确定哪些文件正在被读取或写入,以及多less次。 我的怀疑是,有了我们的许多子项目和随后的编译器调用,构build会多次重新读取相同的常用库。
什么是一些分析工具,会告诉我一个给定的过程是用什么文件做的? 免费是好的,但不是必需的。
正如Jon Skeet所build议的,使用Process Monitor,我能够证实我的怀疑:几乎所有的磁盘活动都是读取和重新读取库,而JDK的“rt.jar”和其他库的副本位于顶部列表。 我无法制作足够大的RAM磁盘来存放我使用的所有磁带库,但在RAM磁盘上安装“最热”磁带库的时间减less了大约40%。 显然,Windows文件系统caching工作并不够好,即使我已经告诉Windows为此做了优化。
我注意到的一件有趣的事情是,对JAR文件的典型“读取”操作只有几十个字节; 通常有两三个,然后在文件中跳过几千字节。 这似乎不适合大量阅读。
我将在闪存驱动器上对所有第三方库进行更多testing,并查看其效果。
如果你只需要它的Windows,SysInternals 进程监视器应该显示你需要知道的一切。 您可以选择进程,然后查看每个操作,并获取文件操作的摘要。
一个古老的,但好东西:创建一个RAM磁盘,并从那里编译你的文件。
当我还在使用Windows时,我曾经得到了很好的结果,通过将所有构建输出写入单独的分区(如果大小为3 GB),并通过计划任务定期格式化每周一次,每周一次。 这只是建立输出,所以它偶尔会被单方面压扁并不重要。
但说实话,自从转向Linux之后,磁盘碎片化是我再也不用担心的事了。
另一个尝试在Linux上构建的原因至少有一点,那就是你可以运行strace (grepped来调用打开 )来查看你的版本正在接触哪些文件。
我曾经在Windows上使用Ant构建一个庞大的Java Web应用程序(JSP前端),这将需要3分钟的时间。 我擦我的电脑,并安装了Linux,突然建立了18秒。 这些都是真实的数字,尽管大约3岁。 我只能假设Java更喜欢将Linux内存管理和线程模型转换为Windows等价物,因为在我的经验(特别是Eclipse)下,所有的Java程序在Linux下似乎都运行得更好。 当你对大量没有改变的文件(比如exectuables和libraries)进行读取的时候,Linux似乎更好地防止了对磁盘的额外读取。 这可能是磁盘缓存或文件系统的属性,我不知道是哪个。
Java的优点之一是它是跨平台的,所以建立一个基于Linux的构建服务器实际上是一个选择。 作为一名Linux传教士,我当然更愿意看到你将开发环境切换到Linux,但是我知道很多人不想这么做(或者出于实际的原因)。
如果你不愿意建立一个Linux构建服务器来查看它是否运行得更快,那么你至少可以尝试对Windows机器的硬盘进行碎片整理。 这对我的工作计算机上的C ++版本产生了巨大的影响。 尝试JkDefrag ,这比Windows自带的碎片整理程序好得多。
编辑 :我会认为我得到了一个downvote因为我的回答没有解决问的确切问题。 然而,这是在StackOverflow的传统,以帮助人们解决他们的真正问题,而不仅仅是治疗症状。 我不是那些对每个问题的答案都是“使用linux”的人之一。 然而,在这个例子中,我正是在OP所问的情况下获得了非常真实的衡量性能增益,所以我认为值得分享我的经验。
其实FileMon比ProcMon更直接。 通常,在运行磁盘I / O的性能分析时,请考虑以下两点:
一旦您根据上述评估系统的性能,就很容易识别瓶颈并采取纠正措施:获得更快的磁盘或更改您的代码(无论哪个更便宜)。