【问题标题】:Read/Write efficiency读/写效率
【发布时间】:2013-11-09 19:21:08
【问题描述】:

我有一个以特定速率读写的 SCALA(+ JAVA) 代码。分析告诉我代码中的每个方法执行了多少时间。我如何衡量我的程序是否达到了最大效率?优化我的代码,使其以给定配置可能的最大速度读取。我知道这是硬件特定的,并且因机器而异。如果有短路的方法来衡量这个过程。如果我的程序正在以硬件可能的最快速度读写。 (我将 FileWriter 与 BufferWriter 一起使用。)

【问题讨论】:

  • 您使用哪种操作系统? (Windows、Linux、Mac OS X、...)
  • 红帽企业 Linux 服务器 6.4

标签: java performance scala io profiling


【解决方案1】:

在给出描述后,您的最佳选择可能是在试验。您可以测量的内容:

  • 更改缓冲区大小(当我尝试这样做时,这对我没有帮助)
  • 切换到 NIO(可能对大文件有帮助)
  • 缓存您读取的数据(可能对小文件有帮助),如果其中有很多文件,则缓存目录内容。当文件夹中的文件数量增加时,打开文件的速度会降低。

确保代码分析中的代码没有问题的一种可能技术是获取方法的 CPU 时间分布树,并扩展大部分时间的执行路径。如果所有这些路径都指向 Java 标准库,那么您可能已经达到了最佳性能。

更新

您提供的 hrof 提供的其他一些东西和技术。

  • 使用分析器或其他一些技术(我更喜欢秒表,因为它们可以提供更稳定、更真实的结果),您需要找出您的瓶颈所在。
  • 大部分 IO 都可以优化为使用单个缓冲区 - 使用 Guava 或 Apache Commons IO 时,这会更轻松。
  • 但是,如果您在序列化链中使用 Jackson(如果这是您的瓶颈),那么您无能为力。更改算法?
  • 有些人很慢(与本机文件系统 IO 相比) - 即 Formatters、String.format 非常慢、Jackson 等。
  • IO 存在典型的缓慢操作 - 即缓冲区分配、字符串连接、分配的过多 char[] 缓冲区是 IO 优化的一种味道。

【讨论】:

  • 很好,缓存目录数据到底是什么意思?有关该方法的任何示例。这是我记忆的一个示例。 pastebin.com/PEH8yR3v
  • 很遗憾,你最后给出的标准并没有真正起作用……即使 OP 发现 95% 的时间都花在等待 I/O 上,他可能还差得远最佳性能...
  • 将小文件读入内存,如果这样可以提高速度。您能否向我们展示您的代码,从 hrof 转储中我看到您正在使用 Jackson、Formatters 和正则表达式,其中任何一个都可能成为瓶颈。在这种情况下,优化 IO 意义不大。您还可以使用 JDK 的 JVisualVM,它具有不错的 UI 进行分析。如果有,请附上截图。
  • 非常感谢大家,事实上,我很乐意与你们分享它以供审查。 pastebin.com/q2g8kf2U 。这是我的代码块。
猜你喜欢
  • 2020-01-21
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多