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