论坛首页 Java企业应用论坛

淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和

浏览 94261 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-07-13  
性能不好, 用了同步。 可以分割同步。
0 请登录后投票
   发表时间:2010-07-13  
lubber 写道
个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.

和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。
0 请登录后投票
   发表时间:2010-07-13  
高手啊!没看懂
0 请登录后投票
   发表时间:2010-07-13  
云中苍月 写道
lubber 写道
个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.

和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。


wow 这个更妙
0 请登录后投票
   发表时间:2010-07-13   最后修改:2010-07-13
将大的list分块1-n,n-2n,......,取决于线程数,都是计算型任务,线程数最好使用cpu 核心数。

主线程用CountDownLatch等待结果,结果放在CopyOnWrite list 里面。



0 请登录后投票
   发表时间:2010-07-13  
云中苍月 写道
lubber 写道
个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.

和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。




能写出来让在家学习学习吗?
0 请登录后投票
   发表时间:2010-07-13  
wgy_superpower 写道
xifo 写道
思路是对的,可惜算法有问题,大多数情况下计算结果不正确。

不信的话,试试把这一行
for (int i = 1; i <= 1000000; i++)

换成
for (int i = 0; i <= 1000000; i++)


如果计算正确,两个计算结果应该一样,实际上计算结果会少一百万,原因是分割那里没有考虑尾数。


你好细心哦,这都被你看出来了,确实,在分割的时候,分割的最后一组应该考虑一下不能整除情况下的余数,呵呵


多谢以上各位,现在已经修正,加了一句
if(list.size()%threadCounts!=0){//不整除,增加一个线程
			threadCounts=threadCounts+1;
		}


谢谢以上各位的指正,这里就不一一贴名字了。。
0 请登录后投票
   发表时间:2010-07-13  
赞一个。

问题是我用你的例子比较直接加
        long noCurrentSum=0L;  
        for(Integer i:list){  
            noCurrentSum+=i;  
        } 
发现时间差不多。而且有时候直接加更快。纠结了。。我的是双核。
0 请登录后投票
   发表时间:2010-07-13   最后修改:2010-07-13
ExecutorService + FutureTask
不需要countdownlatch
0 请登录后投票
   发表时间:2010-07-13  
呵呵,该贴很有意义,赞。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics