z***e 发帖数: 5393 | 1 也可能是我太白痴哈。
很简单一个东西,我用maven的junit跑几个unit test,就是比较一下linear遍历和
threadpool并发处理,看时间的差异,也就大概是这样的东西:
public void test() {
int N=10000;
List data = new LinkedList();
// 先initialize
data.add(new Long[N]);
data.add(new Long[N]);
data.add(new Long[N]);
data.add(new Long[N]);
for(Long[] array :data) {
... //往里面填点数字
}
// 1. linear process
for(Long[] array : data) {
for(int i=0; i
if (array[i]%2 == 0) {
// 做一些简单计算
}
}
}
// 2. parallel
ExecutorService executor = Executors.newFixedThreadPool(4);
Collection> threads = new LinkedList>();
List> executionResult = new LinkedList>();
for(Long[] array : data) {
// TestThread是一个简单的Callable class
threads.add(new TestThread(locations, result));
}
executionResult = executor.invokeAll(threads);
...
}
我主要是对比1和2的运行速度,结果发现先运行1还是先运行2,结果不同(先运行的
要慢些,后运行的要快些)。分成两个junit method跑也不行,还是有个先后关系。唯
一可靠点的就是分成两次跑,每次只跑一个(1或者2)---这样太愚蠢的感觉... |
r*****l 发帖数: 2859 | 2 如果N比较小,那Java和Maven启动时间等等带来的误差会影响结果。把N弄大点,让程
序可以运行10分钟,再比较一下。
【在 z***e 的大作中提到】 : 也可能是我太白痴哈。 : 很简单一个东西,我用maven的junit跑几个unit test,就是比较一下linear遍历和 : threadpool并发处理,看时间的差异,也就大概是这样的东西: : public void test() { : int N=10000; : List data = new LinkedList(); : // 先initialize : data.add(new Long[N]); : data.add(new Long[N]); : data.add(new Long[N]);
|
m****r 发帖数: 6639 | 3 try try forkMode=always
【在 r*****l 的大作中提到】 : 如果N比较小,那Java和Maven启动时间等等带来的误差会影响结果。把N弄大点,让程 : 序可以运行10分钟,再比较一下。
|
z***e 发帖数: 5393 | 4 把N设大有另一个问题,超过2G好像就不行了,比如:
long[2000000]
前面我说两个运行顺序有影响结果,我怀疑是jvm的garbage collection的干扰,如果数组变大,可能garbage在内存快耗尽的情况下影响更大...
我没仔细调,因为还有其他Memory allocation跟这个N有关。我主要是比较大数据量简
单运算(就是比较比较大小然后对另一个map写一下flag)下multi-threads和Linear的
差别。
【在 r*****l 的大作中提到】 : 如果N比较小,那Java和Maven启动时间等等带来的误差会影响结果。把N弄大点,让程 : 序可以运行10分钟,再比较一下。
|
g**e 发帖数: 6127 | 5 did you set up max heap size?
果数组变大,可能garbage在内存快耗尽的情况下影响更大...
【在 z***e 的大作中提到】 : 把N设大有另一个问题,超过2G好像就不行了,比如: : long[2000000] : 前面我说两个运行顺序有影响结果,我怀疑是jvm的garbage collection的干扰,如果数组变大,可能garbage在内存快耗尽的情况下影响更大... : 我没仔细调,因为还有其他Memory allocation跟这个N有关。我主要是比较大数据量简 : 单运算(就是比较比较大小然后对另一个map写一下flag)下multi-threads和Linear的 : 差别。
|
g*****g 发帖数: 34805 | 6 你既然要比运行速度,前面初始化的那部分不应该计时。
【在 z***e 的大作中提到】 : 也可能是我太白痴哈。 : 很简单一个东西,我用maven的junit跑几个unit test,就是比较一下linear遍历和 : threadpool并发处理,看时间的差异,也就大概是这样的东西: : public void test() { : int N=10000; : List data = new LinkedList(); : // 先initialize : data.add(new Long[N]); : data.add(new Long[N]); : data.add(new Long[N]);
|
z***e 发帖数: 5393 | 7 我设了
set MAVEN_OPTS=-Xmx4096m
(windows下)
然后在maven里面跑了这么一个test程序:
int N = 100000000;
try {
LinkedList buffer = new LinkedList ();
for(int i=0;i
buffer.add((long)i);
if (i % 1000000 == 0) {
System.out.println("added " + i);
}
}
catch(Exception e)
{...}
然后就不行了,exception也不throw就fail掉,插入6000000个之后。
这没道理啊,才6M个Long,一个Long 8 byte,算reference本身8 bytes的话,还有其它
object本身的东西,加起来最多几百M了不起了,怎么就fail掉了?
【在 g**e 的大作中提到】 : did you set up max heap size? : : 果数组变大,可能garbage在内存快耗尽的情况下影响更大...
|
i**w 发帖数: 883 | |
F****n 发帖数: 3271 | 9 Obviously it's due to the overhead of initialization.
果数组变大,可能garbage在内存快耗尽的情况下影响更大...
【在 z***e 的大作中提到】 : 把N设大有另一个问题,超过2G好像就不行了,比如: : long[2000000] : 前面我说两个运行顺序有影响结果,我怀疑是jvm的garbage collection的干扰,如果数组变大,可能garbage在内存快耗尽的情况下影响更大... : 我没仔细调,因为还有其他Memory allocation跟这个N有关。我主要是比较大数据量简 : 单运算(就是比较比较大小然后对另一个map写一下flag)下multi-threads和Linear的 : 差别。
|