JAVA 8 forkjoin实际体验

JAVA8 函数编程

-都说java8 新的函数式编程特别是并行流式编程,但是并行流的性能并不一定就好

        long starttime1=System.currentTimeMillis();
        //cur,bank,eat均为list 
        cul.parallelStream()
                .forEach(tar->{
                    if(bank.parallelStream().
                            filter(poi->dwithin(poi.getLocation(),tar.getLocation(),500))
                            .collect(Collectors.toList()).size()>5 &&
                    eat.parallelStream().
                            filter(poi->dwithin(poi.getLocation(),tar.getLocation(),500))
                            .collect(Collectors.toList()).size()>5
                            )
                        res.add(tar);
                        }

        );
        System.out.println("并行计算耗时:"+String.valueOf(System.currentTimeMillis()-starttime1));
        System.out.println(res.size());
        System.out.println(res.get(0).getName());
        res.clear();
        long starttime=System.currentTimeMillis();
        for(Pois tar:cul){
            List ttmmpp1=new ArrayList();
            List ttmmpp2=new ArrayList();
            for(Pois poi:bank){
                if(dwithin(poi.getLocation(),tar.getLocation(),500))
                    ttmmpp1.add(poi);

            }
            for(Pois poi:eat){
                if(dwithin(poi.getLocation(),tar.getLocation(),500))
                    ttmmpp2.add(poi);

            }
            if(ttmmpp1.size()>5&&ttmmpp2.size()>5)
              res.add(tar);
        }
        System.out.println("顺序执行耗时:"+String.valueOf(System.currentTimeMillis()-starttime));
        System.out.println(res.size());
        System.out.println(res.get(0).getName());



private static boolean dwithin(String A,String B,int radius) {
        try {
            Point a = (Point) reader.read("POINT(" + A.replace(",", " ") + ")");
            Point b = (Point) reader.read("POINT(" + B.replace(",", " ") + ")");
            return a.within(b.buffer(radius));
        }catch(Exception e) {

        }
        return false;
    }

没有很复杂的深层循环,两层。结果可能让人有些失望。
将并行流改成顺序流,时间也少了50ms,这真的是让人有点迷啊。


并行和顺序执行对比测试

原因分析

首先我们看看并行流用了多少线程
System.out.println("ForkJoinPool.getCommonPoolParallelism() : " + ForkJoinPool.getCommonPoolParallelism());
输出:一个线程。
咦,这。。。那设置高一点看看。

 System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "" + 8);
 System.out.println("ForkJoinPool.getCommonPoolParallelism() : " + ForkJoinPool.getCommonPoolParallelism());

设置无效,参照如下博客修改了一番。
在run-edit configurations中设置JVM参数
-Djava.util.concurrent.ForkJoinPool.common.parallelism=64
其实这样在CPU核心数量达不到的情况下确实提升水平有限。
ps:https://blog.csdn.net/blueskybluesoul/article/details/82817007
按照这个教程修改后,再次测试

修改后如下

final Long starttime2=System.currentTimeMillis();
        ForkJoinPool myPool = new ForkJoinPool(8);
        myPool.submit(() ->cul.parallelStream()
                .forEach(tar->{
                            //System.out.println(tar.getName());
                            if(bank.stream().
                                    filter(poi->dwithin(poi.getLocation(),tar.getLocation(),300))
                                    .collect(Collectors.toList()).size()>5 &&
                                    eat.stream().
                                            filter(poi->dwithin(poi.getLocation(),tar.getLocation(),300))
                                            .collect(Collectors.toList()).size()>5
                                    )res.add(tar);
                        }

                )
        ).get();
        myPool.awaitTermination(3, TimeUnit.SECONDS);
        myPool.shutdown();

修改结果

  • 使用forkjoin指定线程数量,尽管CPU数量有限,依然获得提升。

  • 多次测试,平均顺序流耗时约34秒,并行流耗时约16秒。大概提升一倍的效率。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,093评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,870评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,133评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,638评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,652评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,173评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,560评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,512评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,048评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,088评论 3 344
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,232评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,856评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,548评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,020评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,152评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,729评论 3 380
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,255评论 2 363

推荐阅读更多精彩内容

  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,684评论 0 12
  • Java 8 数据流教程 原文:Java 8 Stream Tutorial 译者:飞龙 协议:CC BY-NC-...
    布客飞龙阅读 948评论 1 46
  • about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stre...
    jsondream阅读 25,310评论 8 47
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,117评论 1 32
  • 如今社会的飞速发展,交通便利,网络发达,此时各地区的户口迁移已是一件平常事,而我也因在深圳生活,为了方便也决定把户...
    竹安倩阅读 897评论 0 0