|
|
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:
|
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 1 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 1 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 1 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |