이 영역을 누르면 첫 페이지로 이동
나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

페이지 맨 위로 올라가기

나눔코딩

01. ArrayList vs LinkedList Speed Test

  • 2021.03.05 12:07
  • 25. 자료 구조와 알고리즘/JAVA
OS Windows 10 Home 64bit 버전 2004 (OS 빌드 19041.630)
언어 Java 8
# 코드
public class ArrayListAndLinkedListSpeedTest {

    private static final ArrayList<Integer> ARRAY_LIST = new ArrayList<>();
    private static final LinkedList<Integer> LINKED_LIST = new LinkedList<>();

    public static void main(String[] args) {

        // 100, 100000, 1000000, 1000000
        int size = 100000;

        // 처음 데이터 추가 작업 시간
        arrayListFirstAddTime(size);
        linkedListFirstAddTime(size);
        System.out.println();

        // 중간 데이터 추가 작업 시간
        arrayListMiddleAddTime(size);
        linkedListMiddleAddTime(size);
        System.out.println();

        // 마지막 데이터 추가 작업 시간
        arrayListLastAddTime(size);
        linkedListLastAddTime(size);
        System.out.println();

//         첫번째 데이터 제거 시간
        arrayListFirstRemoveTime(size);
        linkedListFirstRemoveTime(size);
        System.out.println();

//         마지막 데이터 제거 시간
        arrayListLastRemoveTime(size);
        linkedListLastRemoveTime(size);

    }

    private static void arrayListFirstRemoveTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            ARRAY_LIST.remove(0);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("arrayListFirstRemoveTime= %.4f", time));

    }

    private static void linkedListFirstRemoveTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            LINKED_LIST.remove(0);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("linkedListFirstRemoveTime= %.4f", time));
    }

    private static void linkedListLastRemoveTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            LINKED_LIST.remove(LINKED_LIST.size()-1);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("linkedListLastRemoveTime= %.4f", time));
    }

    private static void arrayListLastRemoveTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            ARRAY_LIST.remove(ARRAY_LIST.size()-1);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("arrayListLastRemoveTime= %.4f", time));
    }

    private static void linkedListLastAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            LINKED_LIST.add(LINKED_LIST.size()-1, i);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("arrayListLastAddTime= %.4f", time));
    }

    private static void arrayListLastAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            ARRAY_LIST.add(ARRAY_LIST.size()-1, i);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("arrayListLastAddTime= %.4f", time));
    }

    private static void linkedListMiddleAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            LINKED_LIST.add((LINKED_LIST.size()-1)/2, i);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("linkedListMiddleAddTime= %.4f", time));
    }

    private static void arrayListMiddleAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            ARRAY_LIST.add((ARRAY_LIST.size()-1)/2, i);
        }
        double time = (System.currentTimeMillis() - startTime) / 1000;
        System.out.println(String.format("arrayListMiddleAddTime= %.4f", time));
    }

    private static void linkedListFirstAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            LINKED_LIST.add(i);
        }
        double time = (System.currentTimeMillis() - startTime) /1000;
        System.out.println(String.format("LinkedListFirstAddTime= %.4f", time));
    }

    private static void arrayListFirstAddTime(int size) {
        double startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            ARRAY_LIST.add(i);
        }
        double time = (System.currentTimeMillis() - startTime) /1000;
        System.out.println(String.format("ArrayListFirstAddTime= %.4f", time));
    }
}

 

# First Add Test

1000 개 반복 추가 (이미지 클릭)

 

10000 개 반복 추가 (이미지 클릭)

 

100000 개 반복 추가 (이미지 클릭)

 

100000 개 반복 추가 (이미지 클릭)

 

1000000 개 반복 추가 (이미지 클릭)

 

데이터 양이 많아 질 수록 LinkedList 가 느리다

그 이유는 검색속도 때문이다

예시 100
100000 10000000
  검색 삽입 작업
시간
검색 삽입 작업
시간
검색 삽입 작업
시간
ArrayList 1s 5s 6s 2s 5s 7s 3s 5s 8s
LinkedList 2s 1s 3s 4s 1s 5s 8s 1s 9s

삽입 속도는 1개씩 들어가서 처리하기 떄문에 같다고 치지만,

검색속도는 데이터가 추가 될 때마다 갯수가 늘어난다

ArrayList 에서는 1개 데이터가 추가될 때마다 검색속도가 1초 씩 증가 한다고 치고

LinkedList 에서는 1개 데이터가 추가 될 때마다 검색속도가 2^n초 씩 증가 한다고 친다면

데이터양이 적을 땐 LinkedList 가 빠르지만, 많아 질 수록 ArrayList 더 빨라진다

저작자표시 (새창열림)

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

다른 글 더 둘러보기

정보

나눔코딩 블로그의 첫 페이지로 이동

나눔코딩

  • 나눔코딩의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (316)
    • ∞. 읽은 거리 (3)
    • ∞. 기술 면접 (61)
      • 1. 자료구조 (0)
      • 2. 네트워크 (9)
      • 3. 운영체제 (11)
      • 4. 데이터베이스 (13)
      • 5. 디자인 패턴 (0)
      • 6. 알고리즘 (0)
      • 7. 자바 (15)
      • 8. 자바스크립트 (7)
      • 9. 스프링 (5)
      • 10. 시큐리티 (1)
      • 11. 기타 (0)
      • 12. Vue (0)
    • ∞. 웹개발 유용한 사이트 (14)
    • ∞. 트러블 슈팅 + TIL (7)
    • 00. 출발 (9)
    • 01. 엑셀 (9)
      • 기초 (4)
      • 컴활 1급 (4)
      • VBA (0)
    • 02. 엑세스 (9)
      • 기초 (5)
      • 컴활 1급 (4)
    • 04. Oracle (1)
      • 기초 (1)
    • 03. JAVA (8)
      • 기초 (7)
      • 객체지향 프로그래밍 (0)
    • 05. HTML (13)
      • 기초 (1)
      • css (10)
      • sass (0)
      • less (0)
    • 06. Javascript (16)
      • 기초 (13)
      • ES6 모듈 (2)
      • Canvas (0)
    • 07. JSP (0)
      • 기초 (0)
    • 08. jQuery (0)
      • 기초 (0)
    • 09. BootStrap (1)
      • 기초 (0)
      • v4 - Layout (1)
    • 10. Spring (30)
      • 기초 (3)
      • 실험 (4)
      • MVC (1)
      • BOOT (6)
      • Security (10)
      • Lib (Library) (2)
      • 벤치마킹 (0)
      • JUnit5 (2)
      • DevTools (0)
      • Socket (1)
      • Batch (0)
      • Mobile (0)
      • WebFlux (0)
      • Cloud (0)
      • Thymleaf (0)
      • Actuator (0)
      • 성능 테스트 (1)
    • 11. JetBrains (34)
      • 기초 (1)
      • IntelliJ IDEA (33)
      • WebStorm (0)
      • Pycham (0)
    • 12. API (0)
      • 기초 (0)
      • 네이버 API (0)
      • 카카오 API (0)
      • 구글 API (0)
      • 인스타그램 API (0)
    • 13. AutoHotkey (1)
    • 14. Python (8)
      • 기초 (3)
      • Selenium (2)
      • Beautiful Soup (0)
      • openpyxl (1)
      • Pyqt5 (0)
      • Deep learning (open CV) (0)
      • Geocoder (0)
      • Anaconda (0)
      • DeepLearning (0)
      • Jupyter Nootbook (0)
    • 14.5. R (0)
    • 15. JMeter (0)
      • 다운로드 (0)
    • 16. Vue JS (23)
      • 기초 (3)
      • Vue 2 (15)
      • Vue 3 (5)
      • Vuetify 2.5.8 (0)
    • 17. Git (12)
      • 기초 (8)
      • ItelliJ IDEA (4)
      • SourceTree (0)
    • 18. AWS (5)
      • 기초 (2)
      • Jira (3)
    • 19. Naver Cloud Platform (0)
    • 20. Google Cloud Platform (0)
      • 기초 (0)
      • stt & tts (0)
    • 21. Kotlin (0)
    • 22. Android (0)
      • 기초 (0)
      • Java (0)
      • Kotlin (0)
      • Flutter FrameWork (0)
    • 23. Clean Code [JAVA] (1)
    • 24. BuildTool (1)
      • Maven (1)
      • Gradle (0)
    • 25. 자료 구조와 알고리즘 (18)
      • JAVA (1)
      • Java Script (1)
      • 프로그래머스 (0)
      • 백준 알고리즘 (0)
      • 나의 알고리즘 (14)
      • Brilliant 공부 (0)
    • 26. React (1)
      • 기초 (0)
      • 강의 정리 (1)
    • 27. PostMan (0)
      • 기초 (0)
    • 28. 프로그래머스 (9)
    • 29. Leet Code (0)
    • 30. MySQL (3)
      • 기초 (2)
      • 문제 (1)
    • 73. GraphQL (0)
    • 74. Nuxt JS (0)
    • 75. Electron (0)
    • 76. UX &amp; UI Design Tool (0)
      • 기초 (0)
      • Axure (0)
      • Sketch (0)
      • Figma (0)
    • 77. MarkDown (1)
      • 기초 (1)
    • 78. Tomcat (1)
      • 메모 (1)
    • 79. Element JS (0)
    • 80. Parallax JS (0)
      • 기초 (0)
    • 81. Player JS (0)
      • 기초 (0)
    • 82. Smart Maker (0)
    • 83. Vim (0)
      • 기초 (0)
    • 84. Linux (0)
      • 기초 (0)
      • Centos 7 (0)
      • Ubuntu (0)
    • 85. Node JS (2)
      • 기초 (1)
      • WebRTC (0)
      • NVM (1)
    • 86. Propeller JS (0)
    • 87. FullPage JS (0)
      • 기초 (0)
    • 88. 아두이노 (0)
    • 89. Tensorflow (0)
    • 90. 웹 패킷 분석 (0)
    • 91. 크롬 개발자도구 (0)
    • 92. 디자인 패턴 (7)
      • 생성(Creational) (3)
      • 구조(Structral) (1)
      • 행위(Behavioral) (2)
      • SOLID 패턴 (0)
    • 95. Linux Shell Script (0)
    • 96. 구글 애널리스틱 (0)
    • 97. ffmpeg (0)
    • 98. ShareX (1)
    • 자료실 (0)
    • 기타 (2)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 엑셀 가운데맞춤
  • 엑셀 기타작업
  • 엑셀 표시형식
  • 깁
  • 엑셀 글씨
  • 졵
  • 엑셀 분석작업
  • 엑셀 기본작업

나의 외부 링크

  • 비전공자 개발자
  • 자바 디자인 패턴
  • 자바 디자인 패턴
  • 스프링 블로그
  • 해킹보안 & 웹 관련
  • ERD 생성
  • 전문 기술 블로그
  • Servlet에 대한 개념없이 스프링을 했네요?
  • 스프링 FitlerChainList
  • 알고리즘 파워 블로그

정보

THE HEYDAZE의 나눔코딩

나눔코딩

THE HEYDAZE

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © THE HEYDAZE. Designed by Fraccino.

티스토리툴바