알고리즘 (및 일반적으로 효율성)이 덜 중요 해지고 있습니까?


29

계산 능력을 구매하는 것이 과거보다 훨씬 저렴하기 때문에 알고리즘에 대한 지식과 효율성이 덜 중요 해지는가? 무한 루프를 피하고 싶을 것이기 때문에 모든 것이 진행되는 것은 아닙니다. 그러나 하드웨어가 더 좋다면 어떻게 든 소프트웨어가 더 나빠질 수 있습니까?


2
"예, 아니오"
vzn

4
이제 비행기가 존재하고 대서양 횡단화물이 더 이상 배를 타야 할 필요는 없습니다. 운송 속도가 덜 중요합니까? FedEx와 DHL 고객은 그렇게 생각하지 않습니다.
Peter Shor

2
입력 크기가 충분히 크면 기계 속도에 관계없이 알고리즘 간의 크기 차가 중요합니다. 그러나 나는 종종 프로그래밍 요소 <cough> Python </ cough>의 문법적인 설탕에 내장 된 표현을 사용하는 것이 나의 "최적화"보다 훨씬 빠르다는 것을 깨닫기 위해서만 일정한 요소 차이를 "최적화"하기 위해 변경하는 것에 속지 않았습니다.
kojiro


여기서 흥미로운 사례 연구 중 하나는 Windows입니다. 예를 들어, 일부 / 다양한 방법 으로 고도로 최적화 된 하드웨어에서도 예전보다 효율적 으로 실행 되지 않습니다. 최신 소프트웨어는 가스가 사용 가능한 모든 부피를 채우는 방식과 다소 유사하거나, 또는 용량의 증가 또는 증가에 관계없이 예산이 어느 정도 증가하거나 새로운 층이 추가되고 증가하는 등 점점 더 많은 일을하고 있습니다. 다소 오버런 ... 진화론
vzn

답변:


31

알고리즘 효율의 중요성을 보여주는 알고리즘 소개 책 의 예제를 정말 좋아합니다 .

삽입 정렬병합 정렬 이라는 두 가지 정렬 알고리즘을 비교해 봅시다 . 이들의 복잡성은 각각 O ( n log n ) = c 2 n lg n 입니다. 일반적으로 병합 정렬에는 더 큰 상수 요소가 있으므로 c 1 < c 2로 가정하겠습니다 .O(n2)=c1n2O(nlogn)=c2nlgc1<c2

귀하의 질문에 답하기 위해 느린 정렬 컴퓨터 (B) 실행 병합 정렬 알고리즘에 대해 더 빠른 컴퓨터 (A) 실행 정렬 알고리즘의 실행 시간을 평가합니다.

우리는 추정하다:

  • 입력 문제의 크기는 천만 숫자입니다 : ;n=107
  • 컴퓨터 A 는 초당 명령어를 실행한다 (~ 10GHz);1010
  • 컴퓨터 B 는 초당 명령 만 실행합니다 (~ 10MHz).107
  • 상수 요소는 (약간 과대 평가 된 것)와 c 2 = 50 (실제로는 더 작음)입니다.c1=2c2=50

따라서 이러한 가정은

컴퓨터 A가107 개의숫자를 정렬하고

2(107)2 instructions1010 instructions/second=2104 seconds
107

50107lg107 instructions107 instructions/second1163 seconds

컴퓨터 B.

따라서 1000 배 느린 컴퓨터는 17 배 더 빨리 문제를 해결할 수 있습니다. 실제로 병합 정렬의 이점은 문제의 크기에 따라 더욱 중요 해지고 증가 할 것입니다. 이 예가 귀하의 질문에 답변하는 데 도움이되기를 바랍니다.

그러나 이것이 알고리즘 복잡성에 관한 것은 아닙니다. 오늘날 CPU 주파수가 높은 머신을 사용하는 것만으로도 상당한 속도 향상이 불가능합니다. 사람들은 확장 성이 좋은 멀티 코어 시스템을위한 알고리즘을 설계해야합니다. 코어가 증가함에 따라 (예를 들어 메모리 액세스 관리를위한) 오버 헤드도 증가하기 때문에 이는 까다로운 작업입니다. 따라서 선형 속도 향상을 얻는 것은 거의 불가능합니다.

요약하자면, 오늘날 효율적인 알고리즘의 설계는 이전과 마찬가지로 중요합니다. 주파수 증가 나 추가 코어가 효율적인 알고리즘이 제공하는 것과 비교할 때 속도 향상을 제공하지 않기 때문입니다.


4
선형 속도 향상의 불가능 성은 암달의 법칙 에서 파생된다는 것은 언급 할 가치가 있습니다.
Bartosz Przybylski

암달의 법칙이 항상 적용되는 것은 아닙니다. 계산 과학에는 문제의 크기가 커짐에 따라 병렬화 할 수없는 작업의 비율이 0으로 떨어지는 문제가 많이 있습니다. 계산에 n 2 일 이 걸리고 n 개의 다른 x ' i s에 대해 n i = 1 f ( x i ) 를 계산해야 한다고 가정 해 봅시다 . 연속적으로 시간 비용은 O ( n n 2 + n ) = O ( n 3 )입니다f(x)n2i=1nf(xi)nxisO(nn2+n)=O(n3)과 평행 반면 프로세서 작업은 O ( N 2 + N ) = O ( N 2 ) . nO(n2+n)=O(n2)
Nick Alger

"1000 배 느린 컴퓨터는 17 배 더 빨리 문제를 해결할 수 있습니다."이것은 하드웨어 속도와 다른 알고리즘을 동시에 결합 할 때 잘못된 설명입니다. 오히려 각 종류의 종류에 대해 컴퓨터 A와 컴퓨터 B를 개별적으로 비교하십시오. (컴퓨터 A에서 병합 정렬을 사용하거나 컴퓨터 B에서 삽입 정렬을 사용할 수없는 이유는 무엇입니까?)
AquaAlex

3
@AquaAlex, 예제의 목적은 느린 컴퓨터가 선택한 알고리즘을 사용하여 빠른 컴퓨터보다 성능이 뛰어남을 보여주는 것입니다. 각 정렬 유형에 대한 실행 시간을 개별적으로 비교하거나 A에서 병합 정렬을 실행하고 B에서 삽입 정렬을 실행할 수 있습니다. 그러나 일반적으로 빠른 컴퓨터는 느린 컴퓨터보다 성능이 우수하다는 것이 의미가 없습니다.
Pavel Zaichenkov

그래서 더 효율적인 알고리즘이 더 빠른 CPU와 더 큰 메모리에서 하루에도 여전히 무게를 지니고 있음을 보여주는 아이디어였습니다.
AquaAlex

36

반대로. 하드웨어가 점점 저렴 해지면서 몇 가지 다른 개발이 이루어지고 있습니다.

첫째, 처리 할 데이터의 양이 기하 급수적으로 증가하고 있습니다. 이로 인해 준 선형 시간 알고리즘과 빅 데이터 영역에 대한 연구가 이루어졌습니다 . 검색 엔진에 대해 생각해보십시오. 많은 양의 쿼리를 처리하고 많은 양의 데이터를 처리하고 신속하게 처리해야합니다. 알고리즘이 그 어느 때보 다 중요합니다.

둘째, 머신 러닝 분야 는 강력 해지고 알고리즘이 풍부합니다 (BA에서 배우는 것과는 다른 종류 임). 이 영역은 번성하고 있으며 종종 새로운 알고리즘이 개발되어 성능이 크게 향상됩니다.

셋째, CPU 처리 속도 를 높이는 데 장애물이되고 있기 때문에 분산 알고리즘 이 더욱 중요해 졌습니다. 오늘날 병렬화를 통해 컴퓨팅 성능이 향상되고 있으며 전용 알고리즘이 필요합니다.

넷째, 증가하는 CPU 성능의 균형을 맞추기 위해 최신 프로그래밍 패러다임은 보안 허점을 방지하기 위해 가상 머신 방법을 사용합니다. 이로 인해 이러한 프로그램의 속도가 상당히 느려집니다. 수수께끼에 추가하여 운영 체제는 종과 휘파람에 더 많은 CPU 시간을 투자하여 비디오 압축 및 압축 해제와 같은 CPU 집약적 알고리즘을 포함 할 수있는 실제 프로그램의 CPU 시간을 줄입니다. 따라서 하드웨어는 빠르지 만 효율적으로 사용되지는 않습니다.

많은 양의 데이터를 처리하려면 요약되고 효율적인 알고리즘이 필요합니다. 인공 지능 분야에서 새로운 종류의 알고리즘이 등장하고있다 . 분산 알고리즘이 주목을 받고 있습니다. 그리고 여러 가지 이유로 CPU 성능이 덜 효율적으로 사용됩니다 (그러나 주로 컴퓨터가 더 강력 해지기 때문에). 알고리즘은 아직 죽지 않았습니다.


"알고리즘은 아직 죽지 않았다"... 반대로 우리는 "알고리즘의 황금 시대"를 통해 살고있을 가능성이 높다 ....
vzn

12

알고리즘에 대한 지식은 빠른 알고리즘을 작성하는 방법 이상의 것입니다.

또한 문제 해결 방법 (예 : 분할 및 정복, 동적 프로그래밍, 욕심, 축소, 선형 프로그래밍 등)을 제공하여 새롭고 까다로운 문제에 접근 할 때 적용 할 수 있습니다. 적절한 접근 방식을 사용하면 일반적으로 코드가 더 단순하고 작성하기가 더 빠릅니다. 따라서 신중하게 정리되지 않은 코드는 종종 느릴뿐만 아니라 복잡하기 때문에 Kevin의 대답에 동의하지 않아야합니다. 나는 David Parnas의이 인용문을 좋아한다.

종종 개발자들은 "대형 시스템을 빠르게 구축하는 방법을 알고있는 사람"이라고 말합니다. 큰 시스템을 빠르게 구축하는 데는 아무런 트릭도 없습니다. 빨리 만들수록 더 커집니다!

물론 좋은 코드를 작성하려면 알고리즘을 소프트웨어 설계 방법과 결합해야합니다.

알고리즘에 대한 지식은 데이터 구조를 사용 하여보다 쉽고 효율적으로 처리 할 수 ​​있도록 데이터를 구성하는 방법을 알려줍니다 .

또한 시간 효율성, 공간 복잡성 및 코드 복잡성 측면에서 접근 방식의 효율성 을 추정 하고 여러 가지 접근 방식 간의 절충점을 이해할 수있는 방법을 제공합니다. 이러한 절충점을 아는 것이 자원 제한 내에서 올바른 결정을 내리는 열쇠입니다.

소프트웨어 효율성의 중요성에 대해서는 Wirth 's Law를 인용하겠습니다.

하드웨어 속도가 빨라질수록 소프트웨어 속도가 느려집니다.

Larry Page는 최근 소프트웨어가 18 개월마다 두 배씩 느려지므로 무어의 법칙을 능가한다고 주장했습니다.


7

, 그들은 넓은 산업에서 '상대적으로' 덜 중요합니다. 텍스트 편집기는 '충분히 빠를'수 있으며 많은 개선이 필요하지 않을 수 있습니다. IT 노력의 많은 부분은 Java로 작성된 구성 요소 A가 C로 작성된 구성 요소 B와 작동하는지 확인하기 위해 Cobol 또는 기타로 작성된 메시지 큐를 통해 올바르게 통신하거나 제품을 시장에 출시하는 것입니다.

또한 아키텍처가 복잡해졌습니다. 사이클 당 하나의 명령을 가진 평범한 오래된 간단한 프로세서가 있고 어셈블리에 썼을 때 최적화는 '쉬웠습니다'(명령 수를 세어야했습니다). 현재 간단한 프로세서는 없지만 레지스터 이름 변경 및 다중 레벨 캐시를 갖춘 완전 파이프 라인의 수퍼 스칼라 비 순차 프로세서가 있습니다. 그리고 어셈블리는 아니지만 C / Java / etc로 작성합니다. 코드가 컴파일 / JIT 된 곳 (일반적으로 더 나은 코드를 만들기 위해 어셈블리에서 작성했거나 Python / Ruby / ...에서 코드가 해석되고 컴퓨터에서 여러 수준의 추상화로 분리 된 곳) 미세 최적화는 어렵고 대부분의 프로그래머는 반대 효과를 얻을 것입니다.

아니요 . 연구와 '절대' 측면 에서 그 어느 때보다도 중요 합니다. 많은 양의 데이터를 처리 할 때 속도가 중요한 영역이 있습니다. 이 척도에서 Pavel 예제에 표시된대로 복잡성이 중요합니다.

그러나 다른 경우가 있습니다-알고리즘에서 '다운'하는 것은 속도가 중요 할 때 선택되는 옵션입니다 (HPC, 임베디드 장치 등). 컴파일러 및 / 또는 소프트웨어 최적화를 전문으로하는 많은 대학 그룹에서 찾을 수 있습니다. 예를 들어 간단한 루프 순서 스왑은 캐시를 효율적으로 활용하기 때문에 수천 시간의 속도를 높일 수 있습니다. 경계선 예일 수도 있지만 CPU- 메모리 간격은 지난 30 년 동안 1000 배 증가했습니다. 또한 컴퓨터 아키텍처는 CS의 일부입니다. 따라서 계산 속도의 많은 개선 사항은 실제로 일반 CS 분야의 일부입니다.

산업 측면에서-단일 프로그램이 며칠, 몇 달 또는 몇 년 동안 실행될 수 있기 때문에 HPC 클러스터 속도가 중요한 경우. 전기 요금을 지불해야 할뿐만 아니라 기다리는 것도 비용이들 수 있습니다. 하드웨어를 두 배나 늘릴 수 있지만 700M $ 은 대기업을 제외한 모든 회사의 포켓 체인지로 간주 될 수 없습니다. 이러한 경우 프로그래머가 더 저렴한 옵션이며 프로그램을 새로운 언어로 다시 작성하는 것이 '작은'속도 향상을 의미 할 수 있습니다. 생각 해보세요.

또한 속도는 더 나은 UX를 의미 할 수 있습니다. 휴대 전화 OS에 대한 많은 리뷰는 '스냅 피어'이며 '트릭'으로 수행 할 수 있지만 분명히 연구 분야입니다. 또한 데이터에 더 빠르게 액세스하고 필요한 작업을 신속하게 수행하려고합니다. 때로는 더 많은 일을 할 수 있음을 의미합니다. 게임에서 모든 작업을 수행하기 위해 0.017이 있고 더 빨리 사탕을 넣을 수 있습니다.


2

흥미로운 토론입니다. 그리고 여기 몇 가지 살펴볼 것이 있습니다.

  1. 이론적 인 컴퓨터 과학-진화하는 과학으로, 시간이 지남에 따라 문제를 해결하는 새롭고 더 나은 방법을 찾을 수 있습니다. 즉, 검색 및 정렬을위한 알고리즘이 개선되었습니다.

  2. 더 큰 커뮤니티 / 더 큰 라이브러리-다른 사람들이 많은 작업을 수행했기 때문에 우리는 그들의 작업을 기반으로하고 이미 생성하고 코딩 한 알고리즘을 사용할 수 있습니다. 이러한 라이브러리는 시간이 지남에 따라 업데이트되어보다 효율적인 프로그램 / 알고리즘에 자동으로 액세스 할 수 있습니다.

  3. 개발-이제 여기에 문제가 있다고 생각합니다. 많은 프로그래머는 컴퓨터 과학자가 아니기 때문에 기술적 / 이론적 문제가 아닌 비즈니스 문제를 해결하기위한 코드를 작성하며, 예를 들어 거품 정렬을 빠른 정렬처럼 사용하면 행복 할 것입니다. 그리고 하드웨어 속도는 나쁜 프로그래머가 나쁜 알고리즘과 나쁜 코딩 방법을 사용하지 못하게합니다. 메모리, CPU 속도, 저장 공간 이러한 것들은 더 이상 주요 관심사가 아니며 몇 개월마다 점점 더 크고 빠르며 저렴 해지고 있습니다. 나는 새로운 핸드폰을 본다. 1970 년대와 80 년대의 메인 프레임 컴퓨터 / 서버보다 더 발전했습니다. 더 많은 스토리지, 더 많은 처리 능력, 더 빠른 메모리.

  4. UI 및 DATA-사용자 인터페이스 / 사용자 경험 및 DATA는 이제 대부분의 개발 영역에서 초 고효율 코드보다 더 중요한 것으로 간주됩니다. 따라서 속도는 사용자가 오래 기다려야 할 때만 발생합니다. 사용자에게 모양과 느낌을주고 응용 프로그램에서 좋은 응답을 얻는다면 그는 행복합니다. 그리고 비즈니스가 모든 데이터가 안전하게 저장되어 있다는 것을 알고 있다면, 필요한만큼의 공간을 신경 쓰지 않아도 언제든지 데이터를 검색하고 조작 할 수 있습니다.

따라서 효율적인 프로그래머가 더 이상 중요하거나 필요하지 않다는 것이 아니라, 매우 효율적인 프로그래머로 인해 사람들에게 보상하는 회사는 거의 없으며, 하드웨어가 좋아 져서 하드웨어가 더 나빠져서 실력 있는. 그러나 여전히 효율성에 중점을 둔 사람들이 여전히 있으며 커뮤니티 정신으로 인해 시간이 지남에 따라 모든 사람들이 이익을 얻습니다.


1

이 흥미롭고 깊은 질문에 대한 다른 각도 는 현상 의 학제 간 및 교차 절단 측면 을 강조합니다 . Dai는 그의 대답에서 Wirth의 법칙을 인용합니다.

하드웨어 속도가 빨라질수록 소프트웨어 속도가 느려집니다.

경제학에서 관찰 된 현상과이 아이디어의 흥미로운 유사점이 있습니다. 경제학은 컴퓨터 과학과 많은 밀접한 관련이 있습니다. 예를 들어 "로드 밸런싱"알고리즘에 의해 요청에 따라 부족한 리소스 (예 : 스레드 등)가 할당되는 스케줄링입니다. 또 다른 예는 생산자 소비자 대기열입니다. 또한 경매.

또한 예를 들어, 시조 법 목록, Wikipedia :

파킨슨의 법칙 – "완료 가능한 시간을 채우기 위해 작업이 확대됩니다." C. Northcote Parkinson (1909-1993)이 공동 주창 한이 책에서“Expenditure는 소득을 충족시키기 위해 증가합니다.” 컴퓨터 : 프로그램이 확장되어 사용 가능한 모든 메모리를 채 웁니다.

보다 효율적인 Watt 증기 엔진이 Newcomen 설계를 대체하기 시작한 후 에너지 사용이 증가하는 것으로 관찰 된 Jevon의 역설과도 강한 유사성이 있지만 엔진의 사용 또는 확산이 증가했습니다.

경제학에서 Jevons 역설 (/ ˈdʒɛvənz /; 때로는 Jevons 효과)은 자원이 사용되는 효율을 높이는 기술 진보가 자원 소비율을 높이는 것보다 증가시키는 경향이 있다는 제안입니다.

비유는 하드웨어가 리소스이고 소프트웨어는 리소스 소비 (일명 공급 대 수요)와 유사하다는 것입니다. 따라서 소프트웨어와 하드웨어 (및 각각의 진보)는 서로 밀접하게 결합 된 공생 피드백 루프에서 어느 정도 공존하는 방식으로 존재 합니다. 이 상호 작용에 영향을 미치는 많은 복잡하고 관련있는 요소가 있습니다. 예 :


왜 공감해야합니까? 나는 파킨슨의 법칙과 제본 스 역설에 대한 언급이 매우 밝혀졌다.
Yuval Filmus

@YuvalFilmus 내 추측 : 문법 문제. 이번에는 답을 너무 많이 읽는 능력을 방해하지는 않았지만 개선하려고했습니다.
Juho

1
"문법 문제"가 아니라 다른 스타일입니다. 그것은 원어민이 "실수"를 자신의 언어로 말하게하는 반면, 실제로 언어가 변하거나 지역적 차이가 있다는 것을 말하는 것과 같습니다. 이 경우 vzn의 관용적 스타일입니다.
Yuval Filmus

-3

아니요, 대부분 공간 복잡성을 고려하면서! 일반 컴퓨터의 저장 용량이 기하 급수적으로 증가하고 있습니다.


'무한한'스토리지가 있다면 공간 복잡성을 걱정할 필요가 없습니다. '문제'는 스토리지가 커지는 것이 아니라 컴퓨팅 파워와 메모리의 증가로 인해 제공되는 속도 향상에 따라 작동 할 데이터가 동기화되어 커지는 것입니다. (PS. 아래로 투표하지 않았습니다)
Maciej Piechotka

4
많은 모바일 앱 개발자가 무한한 리소스 를 사용하는 것으로 보이지만 불행히도 내 장치는 매우 유한합니다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.