【发布时间】:2012-07-07 07:15:34
【问题描述】:
要了解最新的Fortran 的OO 功能,Delphi 的TStringList 的Fortran 版本在下面编写并链接(gist.github)。 Fortran 源模仿 Delphi 之一。
这个Fortran TStringList 按预期运行。然而,我的问题是,它读取/写入 30MB 文件的 LoadFromFile/SaveToFile 组合比 Delphi 的对应项慢 10 倍。文件越大,Fortran 版本看起来越差。我不会因为我的业余 Fortran 技能而感到惊讶。出于同样的原因,我无法理解性能下降发生在哪里,甚至从哪里开始。你能帮忙评论一下吗?非常感谢您的宝贵时间!
【问题讨论】:
-
也不完整。问题文本可能太多了。如果源在某处在线,则链接到它,如果不在某处在线。 (例如gist.github.com)
-
最重要的两个函数(可能是这里唯一重要的函数)- LoadFromFile 和 SaveToFile 已从您的问题中截断。如果没有看到它们,一种解释是 Delphi 使用缓冲 I/O 而 Fortran 版本没有。
-
@XichenLi - 看到你的代码后,我不认为缓冲 i/o 是解释,因为你在一次操作中将整个文件读入缓冲区。所以还有别的原因。我认为这就是分析的用武之地。了解代码在哪里花费时间的最好方法是分析它。从那里你可以看到你的 Fortran 版本是否一切都慢了 10 倍(即这是 Fortran 的错),或者你是否在你的实现中引入了瓶颈。
-
这将在紧要关头工作,但要四处搜索以查看是否有支持您的编译器实现的检测或采样分析器。
-
@XichenLi - 如果你找不到合适的分析器,你可以用费力的方式来做。有几种方法。一种是思考 Fortran 和 Delphi 之间的根本区别并对其进行测试。示例 - 打印比较两个平均长度字符串 100,000 次的时间,看看这是否是罪魁祸首。或者自上而下。测试将 100,000 个字符串插入列表的时间。如果 Fortran 和 Delphi 的时间差异很大,请分别测试 insert 的每个部分并进行比较。但是好的分析工具可以让您不必深入寻找答案。
标签: string performance delphi memory-management fortran