I/O函数式编程和java编程

use*_*592 0 java functional-programming scala

嗨:我们正在将Java用于多线程应用程序.我们发现了Java I/O的瓶颈.功能编程,例如scala,有更好的I/O吞吐量吗?我们将拥有许多内核cpu,从这个意义上讲,业务逻辑可以非常快速地处理,但I/O将成为瓶颈.有什么好的解决方案吗?

mer*_*ike 11

由于Scala在Java虚拟机上运行,​​并且(在引擎盖下)使用Java API进行I/O,因此切换到scala不太可能提供比编写良好的Java代码更好的性能.

至于解决方案,您对问题的描述过于粗略,无法推荐特定的解决方案.


jav*_*use 8

您使用或尝试过Java nio(非阻塞)吗?开发人员报告性能提升高达300%.

Java NIO FileChannel与FileOutputstream性能/实用性 (请参阅此内容)


Pet*_*rey 7

通常当人们抱怨Java IO很慢时,他们正在使用IO做的事情很慢,而不是IO本身.例如,BufferedReader读取文本行(相对较慢)可以读取90 MB/s的CPU/HDD.使用内存映射文件可以使速度更快,但除非您的磁盘驱动器能够处理它,否则它不会产生太大的不同.

您可以采取一些措施来提高IO性能,但很快就会发现获得更快IO的方法是改进硬件.

如果您使用的硬盘驱动器可以保持100 MB/s的读取速度和120 IOPS,那么您将受到这些因素的限制,并使用500 MB/s和80,000 IOPS的SSD替换驱动器将更快.

同样,如果你使用100 Mb/s网络,你可能只能获得12 MB/s,在1 Gb/s网络上你可能获得110 MB/s,在10 Gig-E网络上你可能会很幸运1 GB/s.


Rex*_*err 5

如果您正在执行许多微小的I/O操作,那么将它们合并为一个大型I/O操作可以大大加快您的代码速度.函数式编程技术倾向于使数据收集和转换操作更容易编写(例如,您可以在列表中存储待处理输出的项目,并使用map将项目到文本或项目到二进制转换器应用于它们).否则,不,功能编程技术不能克服固有的慢速通道.如果原始I/O速度有限,在Java和其他地方,并且您有足够的硬件线程可用,则每个独立I/O通道应该有一个最高优先级线程,并且只执行I/O(无数据转换,没有).这将最大化您的I/O速率,然后您可以使用其他线程来执行转换和业务逻辑等.