Java並行流注意事項

https://hacpai.com/article/1578380907025

 

實體類:

@ToString
@Data
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

    private BigDecimal age;

    private User user;

}

下面是性能對比的代碼:

public static void main(String[] args) {
        List<User> users = new ArrayList<>();

        User user = new User();
        user.setAge(new BigDecimal(1.5));
        users.add(user);

        user = new User();
        user.setAge(new BigDecimal(0.3));
        users.add(user);

        user = new User();
        user.setAge(new BigDecimal(0.7));
        users.add(user);

        user = new User();
        user.setAge(new BigDecimal(3.5));
        users.add(user);

        for(int i = 0 ; i < 10000000; i++) {
            user = new User();
            user.setAge(new BigDecimal(3.5));
            users.add(user);
        }



        System.out.println(users.size());
        List<User> synchronizedList = Collections.synchronizedList(users);

        //開始時間
        long startTime = System.currentTimeMillis();
        //Java Lambda 表達式 forEach方式
        users.stream().forEach(forEachUser-> forEachUser.getAge());

        //結束時間
        long endTime = System.currentTimeMillis();

        System.out.println("Lambda 表達式forEach方式遍歷的時間爲:"+(endTime - startTime));



        //迭代器方式遍歷
        long startTime1 = System.currentTimeMillis();

        Iterator<User> iterator = users.iterator();
        while (iterator.hasNext()) {
            User next = iterator.next();
            next.getAge();
        }
        long endTime1 = System.currentTimeMillis();

        System.out.println("迭代器方式遍歷的時間爲:"+(endTime1 - startTime1));


        //普通for循環
        long startTime2 = System.currentTimeMillis();

        for(int i = 0; i < users.size(); i++) {
            users.get(i).getAge();
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println("普通for循環遍歷的時間爲:"+(endTime2 - startTime2));

        //並行流方式
        long startTime4 = System.currentTimeMillis();

        users.parallelStream().forEach(forEachUser -> {
            forEachUser.getAge();
        });

        long endTime4 = System.currentTimeMillis();
        System.out.println("並行流的forEach的遍歷時間爲"+(endTime4 - startTime4));
    }

對比結果:

10000004
Lambda 表達式forEach方式遍歷的時間爲:118
迭代器方式遍歷的時間爲:83
普通for循環遍歷的時間爲:80
並行流的forEach的遍歷時間爲52

 

其實這樣結果我很意外,因爲在昨天並行流的對比結果相對差多了,也就比Lambda的foreach快點,之後我把並行流的順序放在第一位結果如下:

並行流的forEach的遍歷時間爲114
Lambda 表達式forEach方式遍歷的時間爲:89
迭代器方式遍歷的時間爲:93
普通for循環遍歷的時間爲:89

突然發現並行流的速度差了很多,原因未知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章