论坛首页 Java企业应用论坛

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

浏览 94804 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-07-13  
sunwenran 写道
赞一个。

问题是我用你的例子比较直接加
        long noCurrentSum=0L;  
        for(Integer i:list){  
            noCurrentSum+=i;  
        } 
发现时间差不多。而且有时候直接加更快。纠结了。。我的是双核。


可能是你给的数据量还不够大
0 请登录后投票
   发表时间:2010-07-13  
Hypnusds 写道
以前写过类似这样的东西 但是没有CyclicBarrier类
ExecutorService 的 shutdown 方法应该在 barrier.await(); 前面

你的内部类实现 callable 接口 然后Call 会返回值
ExecutorService 的submit方法可以返回一个 Future 对象
Future 对象来实现同步很好用的 可以尝试下
用 Futrue 的 isDone 来判断线程是否工作结束


嗯。这也是一个思路,我前面的回帖中有个用Callable和Future写的,不过采用的是ExecutorService的invokeAll方法,不用受到控制等待了,返回的所有的Future的isDone都是ture。
0 请登录后投票
   发表时间:2010-07-13  
sdh5724 写道
性能不好, 用了同步。 可以分割同步。

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

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


wow 这个更妙


我感觉使用一个index范围和使用一个subList差不多,都是拆分成了小块,只不过一个用范围标记的,一个直接是一个List小块。。List的subList函数消耗也不大。下面是生成SubList的源代码,只是进行了一下索引以为,比for循环get(i)取值要好得多。
SubList(AbstractList<E> list, int fromIndex, int toIndex) {
        if (fromIndex < 0)
            throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
        if (toIndex > list.size())
            throw new IndexOutOfBoundsException("toIndex = " + toIndex);
        if (fromIndex > toIndex)
            throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                               ") > toIndex(" + toIndex + ")");
        l = list;
        offset = fromIndex;
        size = toIndex - fromIndex;
        expectedModCount = l.modCount;
    }
0 请登录后投票
   发表时间:2010-07-13  
xifo 写道
另外,个人感觉这里用CountDownLatch比用CyclicBarrier更合适点,这个案例只需要主线程等待子线程,各子线程间不需要相互等待,子线程求和完成后可以立即输出并结束。


嗯。说的不错,CountDownLatch这个更适合这个场景,只需要new CountDownLatch(threadCounts);然后在每个线程工作完成后调用countDown(),在main主线程上使用await()等待即可。这适用于子线程完成工作后就想马上看到该线程的成果的场景中。不过这里采用CyclicBarrier也不错。
0 请登录后投票
   发表时间:2010-07-13  
dilantaya 写道
很好的列子,后面大家补充的算法漏洞也很精彩

是啊。一个人写的时候难免有漏过的地方,测试数据也不一定周全。这里谢谢大家了,我都已经改正了。呵呵。
0 请登录后投票
   发表时间:2010-07-13  
有这么麻烦不?每一段的和加到一全局的变量上不就可以了?
0 请登录后投票
   发表时间:2010-07-13   最后修改:2010-07-13
可以用atomic来替代count的synchronized
0 请登录后投票
   发表时间:2010-07-13  
yuchujin 写道
有这么麻烦不?每一段的和加到一全局的变量上不就可以了?

目前就是把子线程的和添加到全局变量上的。
0 请登录后投票
   发表时间:2010-07-13  
夜枫舞影 写道
可以用atomic来替代count的synchronized

是的。可以使用原子类代替。
0 请登录后投票
论坛首页 Java企业应用版

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