컴퓨터의 성능
- 프로그램의 에너지 효율성
-> 메모리의 계층성, 프로세서의 병렬성의 이해 필요 및 코드 아래 계층에서 벌어지는 일들을 이해해야 성능을 증가시킬 수 있다.
문장 수
및 입출력 작업 수
결정 -> 이를 줄이기 위해 다양한 알고리즘을 배운다.기계어 명령어 수
를 결정명령어 실행 속도
결정입출력 작업
의 실행 속도 결정좋은 프로그램은 속도가 빠르고, 효율적이며, 범용성이 높아야 합니다. 그 골격이 되는 좋은 알고리즘을 만들 필요가 있습니다.
간단한 프로그램은 이미 누군가가 만든 프로그램의 일부분을 조합하는 것만으로도 쉽게 만들 수 있기 때문에 알고리즘을 의식할 기회가 점차 줄어듭니다. 알고리즘을 제대로 공부한 사람이면 프로그램의 소스코드를 분석해서 판단할 수 있게 됩니다.
하지만 누군가가 만든 프로그램의 알고리즘이 반드시 하나 뿐이라는 보장도 없습니다. 또한, 좋은 프로그램이라고도 말할 수 없습니다.
그리고 현업에서 프로젝트를 할때는, 대부분은 언어나 프레임워크나 라이브러리에서 이미 잘 만들어진 것들을 가져와서 우리가 만들고자 하는 기능에 맞게 가장 적합하고 효과적인 것들을 쏙 가져와서 쓰는 경우가 대부분이기 때문에, 이런 코딩테스트 같은 문제를 푸는 일은 거의 없습니다.
프로그램 작성도 이와 마찬가지입니다. 좋은 프로그램을 만들고 싶고, 프로그램을 작성하는 공정을 효율적으로 진행하고 싶은 프로그래머라면 알고리즘 공부에 많은시간을 투자해야 합니다.
프로그래밍이 어느 정도 진행된 시점에서 프로그램이 효율이 좋지 못하다는 사실이 밝혀지거나 실행 시간을 단축할 방법이 존재한다는 것을 발견해도 대폭 수정하기 어렵고 시간낭비가 심합니다. 알고리즘을 잘 숙지한 상태라면 설계 단계부터 잘 고려해서 중간에 큰 수정을 할 수고를 덜게 됩니다.
집을 지을 때 일단 집을 완성하고 나서 자기가 살고 싶은 집을 선택하는 사람은 없을 것입니다. 집을 지을 때는 건축사가 작성한 설계도를 바탕으로 서로 합의한 후에 실제 건축 작업에 들어갑니다.
프로그래머를 구인하는 많은 회사는 적합한 사람을 채용하기 위해 노력합니다. 적합한 사람이란 기본적으로 효율적인 코드를 구현해내는 사람이고 이는 알고리즘을 이해하는 구직자입니다. 개발자의 실력을 가늠하는 척도로 이용되고 있는것이 현실입니다.
회사는 많은 구직자 중에서 적합한 사람을 채용하기 위해 코드 테스트라는 것을 도입했다.
회사는 적은 투입량으로 최대의 결과를 도출하는 대표적인 이윤집단이라는 것을 알아야 합니다.
마치 수학에서 덧셈 뺄셈을 기본으로 배우고 새로운 부분이 생기는 일없이 사용하는 것과 똑같은 맥락입니다.
자료구조와 알고리즘은 시대의 흐름에도 크게 변하지 않습니다. 시대가 바뀌면서 계속해서 새로운 기술들이 등장하고 변화된다. 기존의 프로그래밍 언어, 프래임워크, 라이브러리, API 등 많은 기술들이 변화되고 진화되어갑니다. 하지만 몇십년이 지나도 자료구조와 알고리즘은 예전과 달라지지 않은 근본 기술입니다.
상위 수준 언어가 어떻게 하드웨어 언어로 번역?, 하드웨어는 번역된 프로그램을 어떻게 실행?
소프트웨어와 하드웨어 사이의 인터페이스
는 무엇?, 소프트웨어는 어떻게 필요한 일을 하드웨어에게 지시?
소스 프로그램
, 프로그램 번역 소프트웨어
, 하드웨어 효율성
=> 프로그램의 성능을 결정하는 요소는 무엇?
순차 처리 -> 병렬 처리 무엇? 멀티코어 마이크로 프로세스
추상화
드물게 처리하는 것을 최적화 하는 것 보다 자주 생기는 일을 빠르게
병렬성을 통한 성능 개선 -> 파이프라이닝 사용
예측을 통한 성능 개선
메모리 계층 구조 -> 메모리의 성능 개선
물리 소자 장애 감지 -> 보안, 신용도 개선
상위 수준 코드 -> 컴파일러로 변환된 어셈블리 코드 -> 어셈블러를 통해 변환된 기계어 -> 하드웨어(CPU, memory, I/O, datapath)를 통해 실행되어 보여줌
자가 테이프같은 순차접근 메모리와는 달리 RAM은 메모리의 어떤 부분을 읽든지 같은 시간이 걸림, RAM을 사용했기 때문
무조껀 실행시간
만이 제대로 된 유효한 성능 척도이다.
[알고리즘] 왜 알고리즘을 공부해야 하는가?
[알고리즘, 시작]알고리즘을 배우는 이유
자료구조와 알고리즘을 배우는 이유
자료구조와 알고리즘을 왜 배워야 할까?