首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java IO性能问题

Java IO性能问题
EN

Stack Overflow用户
提问于 2012-04-13 23:12:36
回答 6查看 1.2K关注 0票数 3

我正在使用:

代码语言:javascript
复制
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("test.txt"),1024*1024*500))

要写入一个大文件(大约2 2GB)。它需要26秒来写。但是,当我将500替换为10/20时,需要19秒。

here中,我所理解的是缓冲提供了更好的性能。如果是这样,那么为什么会发生这种情况呢?我通过每次运行5次来检查它,所以系统/IO负载不是问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-13 23:16:23

正如我在上一个问题中所说的,存在一个最佳的缓冲区大小(通常约为32KB),并且当您将缓冲区设置得更大时,它将变得更慢而不是更快。默认缓冲区大小为8 KB。

顺便说一下:您的L2/L3 CPU缓存有多大?(我怀疑大约10MB)你的主L1缓存大约是32KB?

通过使用适合最快缓存的缓冲区,您可以使用最快的内存。通过使用只能放入主内存的缓冲区,您使用的是最慢的内存(低达10倍)

回答你的问题。

我所做的是假设ISO-8859-1编码,即(byte) ch,并且一次向ByteBuffer写入一个字节,可能是内存映射。

我有一些方法可以在不创建任何垃圾的情况下从ByteBuffer中写入/读取longdouble

https://github.com/peter-lawrey/Java-Chronicle/blob/master/src/main/java/vanilla/java/chronicle/impl/AbstractExcerpt.java

使用这种方法,您每秒可以将大约500万行记录到磁盘。

票数 2
EN

Stack Overflow用户

发布于 2012-04-13 23:17:27

缓冲区过大会降低性能。坚持32-64 kb的IMO

票数 2
EN

Stack Overflow用户

发布于 2012-04-13 23:17:11

1024*1024*500是500兆字节,或多或少。您基本上是在强制JVM分配一个500mb的连续内存块,JVM可能必须执行一个GC周期才能做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10143501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档