![]() |
1
6
我个人验证了所花费的时间,似乎阅读所花费的时间不到10%,阅读加处理所花费的时间不到30%。 所以我把ParallelExchangerTest(代码中性能最好的)修改为 只要有2个线程,第一个线程进行读取和替换,第二个线程进行写入。 下面是要比较的数据(在我的机器上,英特尔双核(不是Core2)运行的Ubuntu1GB内存)
我知道字符串处理需要更长的时间,所以我替换了line.repalce 有了matcher.replaceall,我得到了这个数字
现在我向前迈了一步,我不是一次读一行,而是读 char[]不同大小的缓冲区,并对其进行计时(使用regexp search/replace,) 我有这些数字
看起来500字节是数据大小的最佳选择。 我在这里叉了一份零钱 |
![]() |
2
14
首先,这个过程只会和最慢的一段一样快。如果定时故障是:
通过多线程,您将完成 至多 5秒而不是7秒。
其次,与其使用您正在使用的队列,不如尝试复制您正在复制和使用的功能
编辑: 有几种用Java并发UTL处理相关任务的方法。把它分成线。首先创建一个公共基类:
这个接口所做的是表示处理输入并生成输出的任意作业。把这些绑在一起,你就有了管道。你也可以把样板抽走。为此,我们需要一门课:
例如
等等
我不确定你是否能做得更好,而且每个工作都有最少的代码可写。然后你的代码变成:
|
![]() |
3
3
你也可以在爪哇使用管道。它们被实现为流,请参见 PipedInputStream 和 PipedOutputStream 更多细节。 为了防止堵塞,我建议放置一个支撑管尺寸。 |
![]() |
4
3
考虑到你没有说你是如何测量经过的时间的,我假设你使用的是:
问题是你在这里测量两样东西:
您只能通过更改代码来更改第二个。使用你给出的数字:
如果我们假设jvm启动需要3秒,那么“程序运行时间”分别是3.7秒和1.9秒,这几乎是100%的加速。我强烈建议您使用更大的数据集进行测试,这样您就可以将jvm启动对计时结果的影响降到最低。
编辑
:根据您对这个问题的回答,您可能正遭受锁争用的困扰。在Java中解决这个问题的最好方法可能是使用管道阅读器和编写器,从管道中读取,一次一字节,并替换任何一个。
|
![]() |
5
0
减少读取和对象的数量可以使我的性能提高10%以上。 但是java.util.concurrent的性能仍然有点令人失望。 ConcurrentQueueTest:
|
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 2 年前 |
![]() |
Grant · goroutines有高空闲唤醒电话 2 年前 |
![]() |
hoaz · 如何安全地清理并发映射 6 年前 |
![]() |
Alanpatchi · int基元类型的volatile声明 6 年前 |