코딩시 미세 최적화가 중요합니까?


178

최근 에 PHP 에서 isset ()이 strlen ()보다 빠른 이유를 찾기 위해 Stack Overflow에 대한 질문을했습니다 . 이로 인해 읽을 수있는 코드의 중요성과 코드에서 마이크로 초의 성능 향상이 고려할 가치가 있는지에 대한 의문이 제기되었습니다.

아버지는 은퇴 한 프로그래머이며 그에 대한 대답을 보여주었습니다. 그는 코더가 마이크로 레벨에서도 코드의 성능을 고려하지 않으면 훌륭한 프로그래머가 아니라고 확신했습니다.

잘 모르겠습니다. 아마도 컴퓨팅 성능이 향상되어 더 이상 이러한 종류의 마이크로 성능 향상을 고려할 필요가 없다는 의미입니까? 아마도 이런 종류의 고려는 실제 언어 코드를 작성하는 사람들에게 달려 있습니까? (위의 경우 PHP).

인터넷은 전 세계 에너지의 10 %를 소비합니다. 수백만 개의 웹 사이트에서 수조 번 복제 될 때 몇 마이크로 초의 코드가 얼마나 낭비되는지 궁금합니다.

프로그래밍에 관한 사실을 바탕으로 대답을 알고 싶습니다.

코딩시 미세 최적화가 중요합니까?

모두에게 감사드립니다.

때때로 우리는 마이크로 최적화에 대해 정말로 걱정할 필요가 있지만 매우 드문 상황입니다. 대부분의 경우 안정성과 가독성이 훨씬 중요합니다. 그러나 때때로 미세 최적화를 고려해도 문제가되지 않습니다. 기본적인 이해는 다음과 같이 코딩 할 때 명백한 나쁜 선택을하지 않는 데 도움이 될 수 있습니다

if (expensiveFunction() || counter < X)

해야한다

if (counter < X || expensiveFunction())

( @ zidarsk8의 예 ) 이것은 저렴한 기능 일 수 있으므로 코드를 변경하면 미세 최적화됩니다. 그러나 기본적인 이해가 있으면 처음부터 올바르게 쓸 수 있기 때문에 필요하지 않습니다.


123
아버지의 조언이 구식 입니다. 성능이 얼마나 향상되는지 묻지 않습니다. 병목 현상이 어디에 있는지 묻습니다. 전체적으로 차이가 없으면 코드 섹션의 성능을 향상시키는 것이 중요하지 않습니다. 가장 느린 링크가 속도를 결정합니다. PHP에서 이것은 네트워크에 쓰는 것입니다 (IE가 다르게 측정한다는 것을 증명할 수 없다면); 더 읽기 쉬운 코드를 작성하는 것이 더 중요합니다.
Martin York

61
핵심어가 고려된다면, 그는 틀리지 않습니다. 그것에 대한 단서가 있어야합니다.
JeffO

37
유명한 Premature Optimization 인용문이 아직 언급되지 않았기 때문에 안타깝습니다 . "프로그래머들은 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 많은 시간을 낭비하며 효율성에 대한 이러한 시도는 실제로 부정적인 부정적인 영향을 미칩니다 디버깅과 유지 보수가 고려 될 때 영향을 미칩니다. 우리는 시간의 97 % 정도라는 작은 효율성을 잊어야합니다. 조기 최적화는 모든 악의 근원입니다 . 그러나 우리는 그 중요한 3 %의 기회를 포기해서는 안됩니다. "
Tamara Wijsman

13
"세계 에너지의 10 %"에 소스를 제공 할 수 있습니까?
Michael Easter

17
coder does not consider performance in their code even at the micro level, they are not good programmers마이크로 최적화와는 매우 다릅니다. 그냥 좋은 코딩입니다.
woliveirajr

답변:


90

나는 네 아버지에 동의하고 동의하지 않는다. 성능은 초기에 생각해야하지만 마이크로 최적화는 작은 CPU 바인딩 된 코드 섹션에서 많은 시간이 소요될 것임을 실제로 알고 있는 경우에만 초기에 생각해야 합니다.

미세 최적화의 문제점은 일반적으로 프로그램이 실제로 필요한 것보다 더 많은 시간을 소비하는 방법에 대한 개념이 없어 수행된다는 것입니다.

이러한 지식은 이 예에서같이 성능 조정을 수행 한 경험에서 비롯됩니다. 명백히 비효율적이지 않은 것처럼 보이는 직관적 인 프로그램이 처음보다 43 배 더 빠를 때까지 일련의 진단 및 속도 향상 단계를 거치게됩니다.

그것이 보여주는 것은 문제가 어디에서 일어날 지 실제로 추측하거나 직관 할 수 없다는 것입니다. 필자의 경우 무작위로 일시 중지 하는 진단을 수행 하면 상당한 시간을 담당하는 코드 줄이 우선적으로 노출됩니다. 그것들을 보면 대체 코드를 찾을 수 있으므로 전체 시간을 대략 그 분수만큼 줄일 수 있습니다.

수정하지 않은 다른 작업은 이전보다 시간이 많이 걸리지 만 전체 시간이 줄어 들었으므로 이제는 더 큰 부분을 차지하므로 다시 수행하면 해당 부분도 제거 할 수 있습니다. 여러 번 반복 하여이 작업을 계속 수행하면 미세 최적화를 수행하지 않고도 엄청난 속도를 얻을 수 있습니다 .

그런 경험을 한 후에, 새로운 프로그래밍 문제에 접근 할 때, 처음에는 그러한 비효율을 초래하는 디자인 접근 방식을 인식하게됩니다. 내 경험상 데이터 구조, 정규화되지 않은 데이터 구조, 알림에 대한 의존성, 그런 종류의 과잉 설계에서 비롯됩니다.


120

마이크로 최적화는 숫자가 말하는 경우에만 중요합니다.

성능이 클라이언트 나 사용자에게 전혀 문제가되지 않는 경우, 개발중인 요구 사항에 성능 데이터의 일부 스펙이 있어야합니다. 소프트웨어를 개발할 때 이러한 요구 사항에 대해 시스템 성능을 테스트해야합니다. 성능 요구 사항을 충족하지 않는 경우 코드베이스를 프로파일 링하고 성능 요구 사항에 도달하기 위해 필요에 따라 최적화해야합니다. 필요한 최소 성능 내에 들어가면 시스템에서 더 이상 성능을 짜낼 필요가 없습니다. 특히 코드의 가독성과 유지 관리 성을 더 이상 손상하려는 경우 (제 경험에 따르면 고도로 최적화 된 코드를 읽을 수없고 유지 보수가 가능하지만 항상 그런 것은 아닙니다. 시스템의 다른 품질 속성을 저하시키지 않고 추가 성능 향상을 얻을 수 있다면,

그러나 성능이 가장 중요한 경우가 있습니다. 저는 주로 실시간 시스템과 임베디드 시스템을 생각하고 있습니다. 실시간 시스템에서 작업 순서를 변경하면 계산 결과에 영향을 줄 수있는 올바른 작업에 필요한 최종 기한을 맞추는 데 큰 영향을 줄 수 있습니다. 내장형 시스템에서는 일반적으로 메모리, CPU 전력 및 전력 (배터리 전력 에서처럼)이 제한되어 있으므로 바이너리 수명을 줄이고 계산 횟수를 줄여 시스템 수명을 최대화해야합니다.


반면에 느린 기능과 빠른 기능을 사용하는 사이에 문제가 있다면 isset의 경우와 같이 느린 기능을 사용할 이유가 없습니다.
Mavrik

7
@Mavrik 사실입니다. X와 Y의 두 가지 기능이 있고 Y가 X보다 빠르면 (적어도 특정 조건에서는) 코드를 여전히 읽기 쉽고 유지 관리 할 수있는 경우 Y를 사용하지 않아도됩니다. 그러나 Y에 대해 알지 못하고 X 대신 Y를 사용하도록 코드를 리팩터링해야하고 해당 코드 세그먼트의 성능에 문제가없는 경우에는 변경할 이유가 없습니다. 성능, 시간, 비용, 노력, 가독성 / 유지 보수성 등 트레이드 오프에 관한 모든 것입니다.
Thomas Owens

2
나는 진심으로 동의합니다. 미세 최적화와 관련 하여이 점을 지적하고 싶었습니다. 가독성 / 시간 측면에서 비용이 들지 않으면 그렇게하십시오. 그렇지 않으면하지 마십시오.
Mavrik

+1 고도로 최적화 된 코드는 읽기 쉽고 유지 관리가 쉽지 않지만 항상 그런 것은 아닙니다.
Boz

성능이 중요한 경우 : (1) 게임; (2) 많은 양의 데이터; (3) 트래픽이 많은 웹 사이트; (4) 매우 복잡한 UI의 응답 성; (5) 바이러스 검사와 같은 백그라운드에서 실행되는 서비스; (6) 재정; (7) 스마트 폰; 등등. RTS 및 임베디드 시스템과 같은 난해한 사례로 제한되지 않습니다.
렉스 커

103

누구나 최적화 에 대해 물을 때마다 Michael A. Jackson인용 을 상기시킵니다 .

프로그램 최적화의 첫 번째 규칙 : 하지 마십시오.

프로그램 최적화의 두 번째 규칙 (전문가에게만 해당) : 아직 하지 마십시오 .

Wikipedia의 인용문이 영국 영어로 수정되었습니다. * 8 ')

두 번째 규칙은 코드프로파일 링 하고 차이를 만드는 것들을 최적화하는 데만 시간을 투자하는 것입니다.

어셈블리로 프로그래밍 할 때 아버지의 주장이 정확했습니다. 그러나 요즘 대부분의 사람들이 프로그램보다 금속에 훨씬 가깝습니다. 오늘날 프로파일 링없이 자신을 최적화 하려고 하면 현대적인 JIT 컴파일러 가 일반적인 방식을 최적화 할 가능성이 높기 때문에보다 일반적인 방식으로 수행했을 때보 다 코드 실행 속도느려질 수 있습니다 .

C에서도 컴파일러가하는 것보다 코드 섹션을 최적화하는 방법에 대해 더 많이 알기 위해서는 최적화에 능숙해야합니다.

Ulrich Drepper가 그의 뛰어난 논문에서 모든 프로그래머가 기억해야 할 것들에 대해 이야기하는 것에 대해 모른다면 아마도 자신을 최적화하려는 패배자 일 것입니다. 그러나 논문 제목과 달리 (실제로 David Goldberg의 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것에 대한 경의입니다 ) 이러한 수준의 이해를하지 못한다고해서 반드시 좋은 프로그래머가되는 것은 아닙니다. 프로그램 제작자.

isset()strlen()에서 PHP

PHP를 모르기 때문에 실제로 무엇을해야하는지 명확 isset()하지 않습니다. 문맥에서 유추 할 수는 있지만, 이는 초보자 PHP 프로그래머에게는 유사하지 않으며 숙련 된 프로그래머가 두 배로 걸릴 수도 있습니다. 이것은 유지 관리를 악몽으로 만들 수있는 언어를 관용적으로 사용하는 것입니다.

뿐만 아니라 isset()지금보다 효율적이기 때문에 항상 더 효율적 이라는 보장은 없습니다 . 최적화는 이제 내년 또는 10 년 안에 최적화가되지 않을 수 있습니다. CPU, 시스템, 컴파일러는 시간이 지남에 따라 개선 및 변경됩니다. PHP의 성능에 strlen()문제가있는 경우, 향후 PHP가 수정 될 수 있습니다. 그러면 모든 isset () 최적화를 제거하여 코드를 한 번 더 최적화해야합니다.

모든 최적화 는 미래의 안티 최적화 가 될 가능성이 있으므로 가능한 코드 냄새로 간주하여 최소한으로 유지해야합니다.

개인적인 경험의 예

이러한 안티 최적화 의 한 예로 if x==0 z=0 else z=x*y, 부동 소수점 곱셈이 항상 지점 보다 비싸다 는 가정을했기 때문에 양식 코드로 채워진 거대한 코드베이스를 소독해야했습니다 . 원래의 대상 아키텍처에서이 최적화는 코드 실행 속도를 크게 향상 시켰지만 시간은 변경되었습니다.

우리가 파이프 라인이 된 최신 CPU에서이 코드를 사용하려고 시도했을 때 성능은 엄청나게 나빴습니다. 이러한 모든 코드 라인을 단순화 z=x*y하여 프로그램이 새로운 아키텍처에서 훨씬 빠르게 실행되도록하여 안티 최적화로 인해 손실 된 성능을 복원합니다 .

일반적으로 오늘날 최적화해야하는 문제는 20 년 또는 10 년 전에 최적화해야하는 문제와 매우 다릅니다.

그런 다음 클럭주기 당 가장 많은 작업을 수행하는 것에 대해 걱정했습니다. 이제는 CPU 수준에서 파이프 라인 플러시, 분기 오판 및 캐시 누락에 대해 걱정할 가능성이 높지만 멀티-로 이동함에 따라 잠금 및 프로세스 간 통신이 훨씬 중요 해지고 있습니다. 프로세스 및 다중 프로세서 아키텍처. Drepper의 논문 은 이러한 많은 문제를 이해하는 데 실제로 도움이 될 수 있습니다.


3
파이프 라인 플러시 및 캐시 미스를 피하고 싶은 것은 : D 끔찍한 비용이 든다. 그러나 많은 부분을 여러 번 실행시키는 코드 부분에서만.
deadalnix

7
내가 추가 할 한 가지는 컴파일러가 먼 길을 걸어 많은 것들을 최적화한다는 것입니다. AFAIK는 까다로운 것보다 깨끗하고 읽기 쉬운 코드를 더 잘 최적화합니다.
Becuzz

3
시간을 낭비하는 마이크로 최적화의 실제 사례를 제공하고 Michael Jackson이 프로그래머임을 밝힌 +1.
Boz

1
예를 들어 +1. 사소한 변환을 컴파일러에 맡겨야하는 이유를 완벽하게 설명합니다.
back2dos

1
예를 들어 @Rex Kerr>는 비용이 분기에서 발생하여 CPU의 파이프 라인 플러시를 유발합니다. 부동 소수점 곱셈 역시 비싸다. 더 실행적인 것은 코드를 실행하는 CPU의 FPU 및 파이프 라인 길이에 따라 크게 달라집니다. 이 코드는 파이프 라인이 짧고 현재 CPU보다 효율적인 FPU가 적은 구형 CPU에서 더 빠르게 실행되었다는 사실에 놀라지 않을 것입니다.
deadalnix

84
  1. 깨끗하고 간결하며 단순하고 자명 한 코드를 작성하십시오.
  2. 병목 현상을 식별하기 위해 성능 테스트를 수행하십시오.
  3. 중요한 섹션을 최적화하십시오.

경험상 코드의 95 %가 5 %의 시간 동안 실행됩니다. 코드를 프로파일 링 / 벤치 마크하고 95 %의 5 %가 실행되는 것을 확인하기 전에는 최적화 할 필요가 없습니다.

모든 바보는 미세 최적화를 수행 할 수 있으며 괜찮은 컴파일러 / 런타임 이이 작업을 수행합니다.
좋은 코드를 최적화하는 것은 쉽지 않습니다. 최적화 된 코드를 작성하고 그 이후에 좋게 만들려고 노력하는 것은 지루하고 최악의 경우 지속 불가능합니다.

성능에 진지한 관심이 있다면 성능에 중요한 코드로 PHP를 사용하지 마십시오. 병목 현상을 찾아 C 확장으로 다시 작성하십시오. 난독 화 지점을 넘어서서 PHP 코드를 미세 최적화하더라도 속도가 거의 향상되지 않습니다.

개인적으로 저는 프로그래밍을 시작할 때 마이크로 최적화를 많이 좋아했습니다. 분명하기 때문입니다. 그것은 당신에게 빨리 보상하기 때문입니다. 중요한 결정을 내릴 필요가 없기 때문입니다. 지연 의 완벽한 수단입니다. 소프트웨어 개발의 중요한 부분에서 벗어날 수 있습니다. 확장 가능하고 유연하며 확장 가능하며 강력한 시스템 설계.


2
나에게 가장 좋은 대답은 Bugzilla 개발자 안내서에서 놀랍게도 발견되었습니다. "읽기보다는 현명하게 노력하고 있다면 아마도 더 빨리 만들려고합니까?" : 코드가 느리다는 사실을 알지 못하는 경우 (실제로 자세한 테스트를 통해) "더 빠르다"고 걱정하지 마십시오. 최적화-많은 프로그래머들이 아무도 경험하지 못한 문제를 지속적으로 해결하고 있습니다. 그렇게하지 마십시오. " bugzilla.org/docs/developer.html#general
Marco

7
나는 한 줄을 제외하고는 일반적으로 동의합니다. "모든 바보들은 그들이 미세 최적화 할 수 있다고 생각합니다 "...;)
Nim

@Nim : 포인트 획득;)
back2dos

26

나는 당신의 아버지와 동의 할 것입니다. "코더가 마이크로 레벨에서도 코드의 성능을 고려하지 않는다면, 좋은 프로그래머는 아닙니다." 핵심은 "성능 고려"입니다. 이는 "모든 단계에서 미세 최적화를 수행"하는 것과 다릅니다.

나는 C 프로그램을 더 빠르게 만드는 데 사용 된 것이 오늘날에는 그렇지 않을 수도 있지만 대부분 다른 의견에 동의하지만 고려해야 할 또 다른 심각한 사항이 있습니다. C 또는 C ++를 사용해야합니까? 오버로드 된 간단한 연산자가있는 클래스를 많이 사용하면 성능이 저하 될 수 있습니다. 그게 중요합니까? 응용 프로그램에 따라 다르지만 고려조차하지 않으면 훌륭한 프로그래머가 아닙니다. 어떤 사람들은 약 2 밀리 초 동안 그것을 고려하고 닫을 수도 있지만, 너무 많은 사람들이 문자 그대로 고려하지조차 않는다고 생각합니다.

실제로는 최적화를 통해 코드를 읽기가 더 어려워 질 수 있습니다. 코드 작성 시간이 더 오래 걸립니다. 코드는 조금 더 빠르거나 조금 더 빠릅니다 (드물지만). 고객은 아마도 그 차이를 알지 못할 것입니다.

또 다른 현실은 사람들이 코드를 재사용하는 것을 좋아하고 코드가 작성된 위치가 코드를 작성할 때와 크게 다를 수 있다는 것입니다. 갑자기 사람들이 걱정할 수 있습니다.

예를 들어, PC 나 게임 콘솔에 Angry Birds 와 같은 것을 썼다고 가정 해보십시오 . 물리 시스템과 그래픽 시스템에서 최적화를 무시했습니다. 요즘에는 2.5GHz 듀얼 코어가 기본적으로 최소이며 게임이 충분히 작동하기 때문입니다. 그런 다음 스마트 폰이 나오고 포팅하려고합니다. 아, 600MHz ARM 코어?

주말에 Hot 또는 Not 과 같은 웹 사이트를 생각해보십시오 . 편리한 데이터베이스를 사용하고, 빠른 개발을 염두에두고 모든 것을 작성하고, 친구에게 URL을 이메일로 보내어 실행하십시오. 3 개월 후 서버 과부하로 인해 죽어 가고 있으며 확장 할 수있는 방법이 없습니다. 항상 일어난다. 가장 큰 웹 사이트에는 수백 킬로와트 또는 메가 와트로 측정 된 전력 요금이 있습니다. 코드 최적화를 통해 절약 할 메가 와트가 있다고 생각하십시오.

당신의 아버지가 말했듯이, 당신은 적어도 그것을 고려해야 합니다. 대부분의 사람들은 테이블의 성능이 어느 정도인지 알지 못하고 "조기 최적화"와 "하지 말 것"에 대한 간단한 설명으로 테이블을 능가합니다. 이들은 좋은 프로그래머가 아닙니다.

이 사이트에 대한 일반적인 의견은 아닙니다. 안녕 평판 포인트 ...


3
물론, 가치가없는 것으로 보이지 않는 한 (머리 뒤쪽) 고려하고 일반적으로 거부해야합니다. 최적화는 일반적으로 코드 가독성을 낮추고 코딩 및 유지 시간을 10 배 정도 늘릴 수 있다는 점을 고려해야합니다. 프로그램이 CPU를 많이 사용하지 않으면 종종 필요하지 않습니다. 컴파일러가 일반적으로 최적화보다 훨씬 더 우수하며 많은 최적화가 실제로 성능을 저하시킬 수 있음을 인식하십시오. 최적화 및 프로파일을 테스트 할 시간이 없다면 최적화 할 시간이 아닙니다.
jimbob 박사

3
Angry Birds 예제는 왜 조기에 최적화 하지 않아야 하는지를 정확하게 보여줍니다 . 데스크탑에서 콘솔로, 모바일 장치로 포팅 할 때, 적어도 세 가지 매우 다른 유형의 하드웨어를 처리하고 있으며 하나에 대한 최적화가 다른 하나의 도움 대신에 손상 될 수 있습니다. 더 나쁜 것은, 최적화는 코드를 이해하기 어렵게 만들고 따라서 포팅하기 어렵게 만드는 것입니다. 물론 처음부터 효율적인 알고리즘을 선택하지만 실제 데이터가 각 플랫폼에서 문제가있는 위치를 알려줄 때 성능 조정 단계에 대한 미세 최적화를 저장하십시오.
Caleb

@Caleb : Angry Birds 예제는 특정 하드웨어를 최적화하지 않는 이유를 보여줍니다. 또한보다 일반적인 "C 수준"최적화를 수행하고 화상을 입지 않고 전체 앱을 구축하는 방법을 보여줍니다. 실제로 화상을 입지 않았지만 원래 의도를 넘어서는 데 어려움이 있습니다.
phkahler

25

먼저 사례를 살펴 보겠습니다 : PHP

  • 필자는 PHP가 "마이크로 최적화"에 대해 걱정해야하는 일종의 언어 (본질과 응용 프로그램의 주요 영역 때문에)라고 생각하지 않습니다. PHP 코드는 대부분 opcode 캐싱으로 최적화됩니다.
  • PHP로 작성된 프로그램은 CPU 바운드가 아니며 대부분 I / O 바운드이므로 이러한 최적화는 시간의 가치가 없습니다.
  • 반드시 최적화해야 할 것은 아마도 C 익스텐션에 들어가서 PHP 런타임에 동적으로로드되어야 할 것입니다
  • 보다시피, 우리는 PHP에서 코드를 미세 최적화함으로써 인센티브를 얻지 못합니다. 반면, PHP 코드를 더 읽기 쉽고 유지 보수가 가능하도록 만드는 데 더 많은 배당금을 지불해야합니다.

일반적으로

"TOOOOO"는 파이썬 이나 루비 같은 동적 언어로 코드를 최적화하는 데 많은 시간을 소비 하지 않을 것입니다. 왜냐하면 CPU 집약적 인 숫자 처리 작업을 위해 설계되지 않았기 때문입니다. 표현력 이라고하는 정교한 방식 (읽기 및 유지하기 쉬운)으로 실제 상황을 모델링하는 것이 속도보다 중요한 여러 가지 문제를 해결합니다. 속도가 주요 관심사 였다면 처음에는 역동적이지 않을 것입니다.

컴파일 된 프로그램 (C ++, Java)의 경우 최적화가 더 중요합니다. 그러나 거기에서도 먼저 작성중인 프로그램의 특성 / 도메인 / 목적을 살펴 봐야합니다. 또한 해당 최적화의 이점에 대해 미세 최적화하는 데 시간을 신중하게 고려해야합니다. 더 많은 최적화가 필요하다면 한 단계 아래로 내려 가서 코드 조각을 어셈블러로 코딩하십시오.

따라서 원래의 질문에 대답하기 위해 "코딩시 미세 최적화가 중요합니까?" 대답은

  • 응용 프로그램 도메인, 복잡성 등 어떤 일을하고 있습니까?
  • 프로그램에서 마이크로 초 속도 향상이 정말 중요합니까?
  • 어떤 종류의 최적화가 가장 유리합니까? 항상 코드 최적화는 아니지만 외부적인 것일 수 있습니다.
  • 마이크로 최적화에 투자 할 때 얼마나 많은 "좋은 점"(속도 측면에서)을 얻고 있습니까?
  • 하드웨어, RAM 및 프로세서를 변경하거나 코드를 병렬로 실행하거나 분산 시스템에서 다른 방법으로 더 나은 속도를 얻을 수 있습니까?

미세 최적화 (해당 사항에 대한 코드 최적화)는 시간이 많이 걸리는 것뿐만 아니라 코드의 자연스러운 가독성을 "분산시켜"유지 보수가 많이 필요합니다. 항상 최후의 수단으로 생각하십시오. 항상 개별 코드 파일을 최적화하는 것보다 더 나은 하드웨어와 더 나은 아키텍처를 채택하여 전체 응용 프로그램을 최적화하십시오.


18

마이크로 최적화라는 많은 답변이있는 것 같습니다

성능, 시간, 비용, 노력, 가독성 / 유지 보수성 등 트레이드 오프에 관한 모든 것.

그러나 나는 가독성에 영향을 미치지 않는 최적화가 있다는 것을 알고 있으며, 재미있게하기를 좋아합니다. 나는 학교 과제 중 일부 (모든 속도 기반)를 보았는데, 다음과 같은 조건문을 작성할 때 항상 미세 최적화를 고려하는 것이 좋습니다.

if (counter < X && shouldDoThis()) // shouldDoThis() is an expensive function

항상보다 좋다

if (shouldDoThis() && counter < X ) 

그런 식으로 코드를 "고속화"하는 데는 몇 가지 방법이 있으며 그 차이는 대개 무시할 만하지 만 항상 그런 것은 아닙니다.

누군가 이것을 이것을 실제로 최적화하는 것으로 생각하는지는 모르지만 프로그래머는 코드를 작성할 때 이러한 것들을 알고 고려해야한다고 생각합니다.


2
특정한 경우에는 중요하지 않을 수 있습니다 . 그러나 중요한 경우 프로파일 링 및 최적화 후에 불필요한 시간을 소비 할 필요 없도록 이러한 최적화를 인식 하는 것이 매우 중요 하다고 생각합니다 .
tskuzzy

4
이것은 매우 위험한 예입니다. 최적화 해야 결코 동작을 변경할 수 없습니다 . 심지어 그것이 cheap() && expensive()최적화 라는 것을 제안하더라도 expensive () && cheap()사람들은 그것이 의미 상 중요한 변화 를 고려하지 않고 ( &&단락 연산자가있는 언어로 ) 맹목적으로 다른 것을 대체하도록 초대합니다 .
Mark Booth

5
기능에 부작용이 없으면 기능이 동일하고 더 빠릅니다. 그들이 부작용이 있다면, 처음에 이와 같은 코드를 작성해서는 안됩니다. 나는 이것이 실제로 행동을 바꾸지 않는 한 습관에서 벗어나야한다고 말합니다.
phkahler 2019

3
@MarkBooth 여기서 phkahler에 동의해야합니다.이 기능들 중 어느 것도 부작용이 없어야합니다! if 문의 condionos 순서는 프로그램 결과에 영향을 미치지 않아야합니다. 내 예는 if (x<100 && isPrime(x))보다 명확하게하기 위해 로 작성하는 것이 좋습니다 .
zidarsk8

1
@ zidarsk8- 최적화 가 실행 속도 이외 것을 변경 하면 최적화아닙니다 . 프로그래머로서 우리는 종종 실용적이어야 하며, 때로는 단락 연산자와 함께 사용되는 모든 기능이 순수하다는 것을 보장 할 수 없습니다. 특히 코드가 제어 할 수없는 타사 라이브러리를 호출 할 때 더욱 그렇습니다. 이러한 상황에서는 경험이 부족한 프로그래머가 최적화 라는 이름으로 버그를 도입하지 않도록주의해야 합니다 .
Mark Booth

11

내 경력 초기에 "미세 최적화하지 마십시오"와 같은 포괄적 인 진술은 많은 혼란을 초래했습니다. 모든 것이 정황입니다. 따라서 사람들이 "이것"보다는 "모범 사례"라고 말하는 이유.

"모범 사례"는 모든 상황을 고려한 최고의 선택입니다. 예를 들어 LINQEntity Framework 는 인라인 SQL 대신 사용해야합니다. 우리 회사에서는 SQL Server 2000을 사용하고 있습니다. SQL Server 2000은 Entity Framework를 지원하지 않습니다. 모범 사례에는 다음이 필요합니다.

  • 새로운 버전의 SQL Server를 구매한다는 아이디어로 상사를 파는 것은 수천 달러를 의미합니다.
  • 새로운 기술을 배우는 아이디어로 개발자를 판매합니다.

나는 경험이 이런 일이 일어나지 않을 것이라는 것을 안다. 그래서 나는 끝내거나 스트레스를받지 않거나 모범 사례를 따르지 않을 수 있습니다.

전반적인 결과에 영향을 미치는 결정에는 정치적, 기술적, 금전적 고려가 있습니다. 결정을 할 때이 사실을 기억하고 현명하게 전투를 선택하십시오.

" 하루마다 모든 활동을위한 계절과 시간이 있습니다. "


1
BTW에서 Dapper 를 인라인 SQL에 대한 마이크로 ORM 대안으로 사용할 수 있습니다 .
Dan

2
LINQ and Entity Framework should be used in lieu of inline SQL-실제로 무언가를 최적화하기 위해 인라인 SQL이 필요할 때까지; EF가 생성하는 SQL이 항상 최적 인 것은 아닙니다.
Robert Harvey

1
사장님이 SQL 2k8의 라이센스 비용 (또는 현재의 다른 것)에 대해 걱정하는 경우 EOL VERY에 곧 올 수있을 정도로 오래되었다고 지적해야합니다 (아직없는 경우)
warren

@warren-일부 회사는 이러한 사항을 고려하지 않습니다. 일부의 경우 여전히 "작동"하면 업그레이드되지 않습니다. 업무상 서버가 계속 작동한다는 의미입니다. 우리는 이미 EF에 대한 지원이 부족하다는 것을 알고 있습니다. 그것은 그들이 돈을 쓰도록 설득하기에 충분하지 않습니다.
P.Brian.Mackey

1
알다시피, SQL 2000과 함께 EF를 사용할 수 있습니다. 디자이너는 작동하지 않지만 실제 엔터티 프레임 워크는 SQL 2000을 지원합니다. 디자이너 한계를 극복하기 위해 동일한 스키마를 사용하여 sql 2008 express에서 로컬 데이터베이스를 만들 수 있습니다. sql 2000 데이터베이스의 경우 디자이너가 모든 클래스를 생성하도록 지정한 다음 .edmx 파일로 이동하여 대상 데이터베이스 버전을 2000으로 변경하고 SQL Server 2000 데이터베이스에서 연결 문자열을 지정하십시오. 최상의 솔루션은 아니지만 업그레이드 할 수없는 경우 작동합니다.
Neil

8

이것은 항상 트레이드 오프입니다.

첫째, 컴퓨터 산업은 결국 돈에 관한 것입니다. 개발자로서해야 할 일은 고객을위한 가치를 창출하여 돈을 벌 수 있도록하는 것입니다 (과도하게 단순화되었지만 요점은 여기에 있습니다).

개발자 시간은 돈이 든다. 기계 전력도 돈이 든다. 일반적으로이 두 번째 비용은 첫 번째 비용보다 훨씬 저렴합니다. 따라서이 코드는 읽을 수있는 코드와 유지 관리 가능한 코드를 갖추는 데 중요하므로 개발자는 대부분의 시간을 가치를 제공 할 수 있습니다.

경우에 따라 미세 최적화가 중요 할 수 있습니다. 그러나 일반적으로 읽기 어려운 코드 또는 확장 가능한 코드가 적습니다 (링크 된 예제의 경우는 아니지만 일반적으로 그렇습니다). 개발자 시점에 어느 정도 비용이 듭니다. 이번에는 기계 전력보다 비싸므로 낭비입니다.

둘째, 대규모 프로젝트의 미세 최적화는 유지 관리 / 진전을 어렵게 만들고 어렵게 만들 수 있습니다. 그것의 문제는 진화 할 때 다른 최적화가 불가능하다는 것입니다. 진화하는 응용 프로그램을 사용하면 일반적으로 이러한 최적화를 수행하지 않고도 수행 할 수있는 것보다 느린 솔루션으로 끝납니다.

셋째, 알고리즘 복잡도는 일반적으로 데이터 세트가 커지면 수행 할 수있는 모든 미세 최적화를 극복하므로 최적화는 무의미합니다. 안타깝게도, 미세 최적화를 통해 코드를 유지 / 진전시키기가 어려워 지므로 최적화가 어려울 수 있습니다.

때때로이 가치는이 최적화에 있습니다 (비디오 게임이나 항공기의 자동 조종 장치와 같은 지연 시간이 중요한 프로그램을 생각하십시오). 그러나 이것은 증명되어야합니다. 일반적으로 프로그램은 대부분의 시간을 제한된 코드 부분으로 보냅니다. 어떤 미세 최적화 작업을 수행하더라도 병목 현상을 식별하고이 부분에 대한 작업 없이는 프로그램을 훨씬 더 빠르게 얻을 수 없습니다.

질문 한대로 실제 프로그램에서 문제를 벤치마킹하지 않은 것으로 나타났습니다. 이 경우 트릭을 수행하고 더 빠르지 않은지 알 수 있습니다. 그래서 당신은 어떤 문제가 있기 전에 그것을 묻고있었습니다. 문제가있는 곳입니다. 최적화 문제를 잘못 처리했습니다.

유지 관리 및 진화는 일반적으로 마이크로 최적화보다 가치가 있으므로 수행하기 전에 올바른 인터페이스를 사용해야합니다. 그런 다음 프로그램의 일부가 서로 추상화되어 있으면 전체를 엉망으로 만들지 않고 마이크로 최적화 할 수 있습니다. 이를 위해서는 인터페이스를 신뢰할 수있을만큼 오래 실행해야합니다.


"항상 트레이드 오프가 있습니다". 프로그램이 트레이드 오프 곡선에있는 경우 한 변수를 줄이면 다른 변수가 증가합니다 . 내 경험상, 대부분의 프로그램은 트레이드 오프 곡선에 가깝지 않으며 두 변수를 줄일 수있는 충분한 공간이 있습니다.
Mike Dunlavey

+1 유지 보수 및 진화는 미세 최적화보다 더 가치가 있습니다. 비록 컴퓨터 산업이 단순한 돈 이상의 것이 아닌가? 예를 들어 오픈 소스, 교육, 혁신, 거버넌스, 커뮤니티 등 저는 그 근원에서 돈을 찾을 수있을 것이라 확신하지만 대부분의 경우에 해당됩니다.
보즈

@Boz kay> 이것은 부분적으로 사실입니다. 먼저 상사와 손님은 대부분 그 사람들에 대해 알지 못하고 돈에 관심이 있기 때문입니다. 일부 오픈 소스 도구를 홍보하려면 회사 브랜드를 개선하는 방법 또는 개발 비용을 줄이는 방법을 알려야합니다. 또한 개발자를 행복하게 만드는 것은 회사에서 좋은 개발자를 얻는 방법입니다. 좋은 개발자는 돈을 버는 것입니다 (주로 품질과 혁신을 던집니다). 결국 돈이 핵심입니다. 그리고 나는 내 리눅스 컴퓨터에서 훌륭한 무료 소프트웨어 후원자라고 쓰고 있습니다. 교육도 마찬가지입니다.
deadalnix

8

성능은 기능입니다

Jeff Atwood의 기사는 고성능 웹 사이트를 구축하고 그렇게하는 것의 중요성에 대한 훌륭한 기사입니다.

즉, 필요할 때까지 마이크로 최적화에 집중하지 마십시오. 수행 할 수있는 비용면에서 유리한 최적화가 있습니다. 코드가 아닌 아키텍처에 중점을 둡니다. 내가 느꼈던 대부분의 웹 사이트는 성능에 악영향을 줄뿐만 아니라 깊이 뿌리 내리고 수정하기 어려운 높은 수준의 문제 (불필요한 웹 서비스 계층, 열악한 데이터베이스 디자인, 지나치게 복잡한 아키텍처)를 가지고있었습니다.

웹 사이트를 구축 할 때 클라이언트 쪽 코드와 데이터베이스 논리가 서버 쪽 코드보다 성능 문제를 일으킬 가능성이 훨씬 높습니다. 그러나 성능 문제가있는 경우 코드를보다 잘 프로파일 링하여 조기에 찾을 수 있습니다.


7

개발자 시간은 컴퓨터 시간보다 비쌉니다. 일반적으로 최적화하려는 것입니다. 그러나:

  • 미세 최적화와 알고리즘 복잡성에는 차이가 있습니다. 올바른 알고리즘을 사용하고 있다고 확신 할 수 있도록 충분한 시간을 보내십시오 .
  • 당신이 바로 그 질문을하고 있는지 확인 select (select count(*) from foo) >= 1같은 것이 아니다 select exists(select 1 from foo).
  • 일부 언어 관용구는 더 빠르기 때문에 인기가 있습니다. 대부분의 유창한 언어 사용자가 익숙하기 때문에 사용하는 것이 좋습니다. (당신의 예는 좋은 예입니다).

7

무엇을 최적화 하시겠습니까?

  • 소프트웨어 성능?
  • 신뢰할 수 있음?
  • 프로그래머 생산성?
  • 고객 만족?
  • 전력 효율?
  • 유지 보수성?
  • 시장에 시간?
  • 비용?

"최적화"가 항상 코드를 최대한 빨리 실행하는 것을 의미하지는 않습니다. 무언가를하는 가장 빠른 방법을 찾는 것이 중요 할 때가 있지만 대부분의 코드에서 일반적인 것은 아닙니다. 사용자가 50 마이크로 초와 100 마이크로 초 사이의 차이를 알 수없는 경우 가끔 실행되는 코드에서 둘 사이의 차이는 사실상 없습니다. 예를 들면 다음과 같습니다.

사용자의 입력 길이와 두 개의 루틴 중 하나가 걸리는 시간을 연속적으로 두 번 키 스트로크 사이의 시간보다 훨씬 작은 것으로 결정하기 위해 디스플레이를 업데이트해야하는 경우, 실제로는 어떤 루틴이 중요하지 않습니다. 너는 사용한다. 반면에 10 억 개의 문자열 길이를 결정해야하는 경우 다른 루틴 간의 성능 차이에주의를 기울여야 할 것입니다. 첫 번째 경우 이해하고 확인하기 쉬운 코드를 작성하는 것이 좋습니다. 두 번째 경우, 속도에 대한 가독성을 기꺼이 교환 할 수 있습니다.

어쨌든 코드를 최적화하려는 경우 변경 전후에 코드를 프로파일 링해야합니다. 요즘의 프로그램은 병목 현상의 위치를 ​​파악하기 어려울 정도로 복잡합니다. 프로파일 링은 올바른 코드 를 최적화 한 다음 최적화가 실제로 작동했음을 보여줍니다.

당신은 당신의 아버지가 언제 은퇴했는지 또는 어떤 종류의 프로그래밍을했는지 말하지 않았지만 그의 반응은 놀라운 것이 아닙니다. 역사적으로 메모리, 보조 스토리지 및 컴퓨팅 시간은 모두 비싸고 때로는 매우 비쌌습니다. 요즘에는 모든 것이 프로그래머 시간에 비해 매우 저렴 해졌 습니다. 동시에 프로세서와 컴파일러는 프로그래머가 절대 일치하지 않는 방식으로 코드를 최적화 할 수있게되었습니다. 프로그래머가 약간의 트릭을 사용하여 여기에 몇 가지 기계 명령을 부딪히는 시대는 대부분 사라졌습니다.


1
+1 지난 몇 년 동안 모바일 장치는 코드 최적화에 크게 의존하고 있습니다. 최적화 된 코드를 작성하지 않거나 적어도 코드를 고려하지 않는 사람은 모바일 장치에서 CPU 집약적 인 앱을 원활하게 실행하기가 어려울 수 있습니다.
Styler

가능한 최적화 목록과 매우 유사한 +1 그는 어셈블리 / 포트란을 사용했습니다
Boz

@Styler : 모바일 장치에 GB의 메모리가있는 쿼드 코어 CPU가있을 때까지 오래 걸리지 않았습니다. 이미 듀얼 코어 스마트 폰이 있습니다.
Lie Ryan

@Lie Ryan : 그렇습니다. 그러나 대부분의 개척자들처럼 그들은 나무 보트를 타고 여행해야했습니다.)
Styler

7

코드를 작성하는 동안 마이크로 최적화는 중요하지 않습니다. 최적화는 프로파일 러의 도움으로 수행되어야하며, 코드를 중요한 곳에 최적화해야합니다.

그러나 프로그래머 코드를 작성하는 동안 어리석은 일을 피해야합니다.

예를 들어 루프 내에서 값 비싼 작업을 반복하지 마십시오. 루프 외부의 변수에 값을 저장하고 사용하십시오. 자주 호출되는 함수에서 문자열 비교 또는 정규 표현식과 같은 작업을 반복하지 마십시오. 레벨을 올릴 수있을 때, 비교를 수행하여 정수 또는 함수 참조 또는 파생 클래스로 만듭니다.

이러한 것들은 숙련 된 프로그래머가 기억하기 쉽고 코드 품질을 거의 항상 향상시킵니다.


내 질문 편집에서 더 명확해야한다는 것을 깨달았습니다. 나는 똑같은 말을하고있었습니다. 업데이트했습니다.
Boz

7

최적화 할 대상을 결정할 때는 항상 Amdahl의 법칙을 기억하십시오 . 정확한 수학에 대한 링크를 참조하십시오. 기억해야 할 성스러운 말은 :

프로그램의 한 부분이 런타임의 10 %를 차지하고 해당 부분을 두 배 빠르게 실행하도록 최적화하면 프로그램 전체의 속도가 5 % 만 향상됩니다.

그렇기 때문에 사람들은 항상 전체 런타임의 몇 퍼센트를 차지하지 않는 프로그램 부분을 최적화 할 가치가 없다고 말합니다. 그러나 이것은 더 일반적인 원칙의 특별한 경우입니다. 암달의 법칙에 따르면 전체 프로그램을 두 배 빠르게 실행해야한다면 모든 제품 의 평균 속도를 평균 50 % 향상시켜야합니다 . 20 기가 바이트의 데이터를 처리해야하는 경우 디스크에서 20 기가 바이트를 읽는 데 걸리는 시간보다 빠른 속도로 디스크를 가져 오거나 데이터를 작게 만드는 두 가지 방법 만 있습니다.

그렇다면 암달의 법칙은 미세 최적화에 대해 무엇을 말합니까? 그들은 전반적으로 신청하면 가치가 있다고 말합니다. 프로그램에서 모든 기능의 런타임을 1 % 줄일 수 있다면 축하합니다! 프로그램의 속도를 1 % 향상 시켰습니다. 그만한 가치가 있었습니까? 글쎄, 컴파일러 녀석은 그 일을하는 최적화를 발견하게되어 기뻐할 것입니다. 그러나 직접 수행하는 경우 더 큰 것을 찾으십시오.


1
Amdahl 인용문의 경우 +1이지만 "전체 프로그램을 두 배 빠르게 실행하려면 모든 조각의 속도를 높여야합니다"에 동의하지 않습니다. 나는 당신이 실제로 "조각"의 속도를 높이 지 않는다고 말할 것입니다. 오히려 불필요한 일을 찾아 제거하십시오. 프로그램이 장난감보다 큰 경우 특히 함수 호출. 성능에 대한 일반적인 생각은 대부분 호출 트리에서 불필요한 단일 분기 (단일 명령 일 수 있음)를 찾아 제거하는 것의 중요성을 완전히 무시하는 것 같습니다.
Mike Dunlavey

악마는 거기에 "평균"이라는 단어가 있습니다. 수학적으로 프로그램의 속도를 50 % 씩 높이려면 평균 50 % 씩 속도를 높여야합니다 . 이제 프로그램을 런타임의 75 %를 차지하는 작업과 25 %를 차지하는 작업으로 나눌 수 있고 이전 속도를 3 배까지 높일 수 있다면 후자의 작업에 아무런 조치를 취하지 않더라도 전체적으로 50 %를 제공합니다. 그러나 훨씬 일반적인 경우는 각각 런타임의 5 % 미만을 차지하는 수십 개의 "작업"이 있으며, 그 결과 속도를 높이거나 제거해야합니다.
zwol

더 일반적인 경우가 있다고 생각합니다. 시간의 50 %를 차지하는 "작업"이 있지만 실제로는 필요하지 않으므로 전체를 제거하여 전체 시간을 해당 양만큼 줄인 다음 반복하십시오. 나는 이것이 받아들이 기 어렵다는 것을 알고있다-프로그램은 (후 시적으로) 완전히 불필요한 것들을하는 데 많은 시간을 소비 할 수 있다는 것을 알고있다. 그러나 여기 내 표준 예가 있습니다.
Mike Dunlavey

6

개발 단계에 따라, 처음 무언가를 쓰기 시작할 때 마이크로 최적화를 사용하는 것보다 우수한 알고리즘을 사용하여 더 많은 성능을 얻을 수 있으므로 마이크로 최적화를 고려해야합니다. 또한 시간에 민감한 응용 프로그램으로 개발중인 대상을 일반 비즈니스 응용 프로그램보다 미세 최적화 고려 사항에서 더 많은 이점을 볼 수 있습니다.

소프트웨어를 테스트하고 확장하는 경우 마이크로 최적화로 인해 코드가 읽기 어려워지고 수정해야 할 고유 한 버그 세트가 생길 수 있습니다.

느린 코드에 대한 사용자의 불만이 실제로 발생하면 다른 모든 것이 해결 된 경우에만 고려해 볼 가치가 있습니다.

  • 코드가 잘 작성 되었습니까?
  • 응용 프로그램이 문제없이 데이터에 액세스 할 수 있습니까?
  • 더 나은 알고리즘을 사용할 수 있습니까?

이러한 질문에 모두 답변했지만 여전히 성능 문제가있는 경우 코드에서 미세 최적화를 사용하기 시작할 때가되었지만 다른 변경 (예 : 더 나은 코드, 더 나은 알고리즘 등)으로 인해 문제가 발생할 가능성이 있습니다. 마이크로 최적화보다 성능이 더 좋습니다.


5

실행 속도는 프로그램의 품질에 기여하는 많은 요소 중 하나입니다. 종종 속도는 가독성 / 유지 보수성과 반비례 관계가 있습니다. 거의 모든 경우에 코드는 사람이 읽을 수 있어야 코드를 유지할 수 있습니다. 가독성이 손상 될 수있는 유일한 시간은 속도가 필수 요건 일 때입니다. 전체 가독성 / 유지 보수가 허용하는 것보다 더 빠른 코드를 만들기위한 요구 사항은 적용 할 수 없지만 적용 할 수있는 경우가 있습니다. 기억해야 할 중요한 점은 마이크로 최적화 코드는 종종 해키 코드이므로 정의 된 요구 사항이없는 한 거의 항상 문제를 해결하는 잘못된 방법입니다. 예를 들어, 사용자는 CRUD 작업에서 .5 초와 1 초 사이의 차이를 거의 알지 못합니다. 0.5 초에 도달하기 위해 assembly-interop-hackfest에 갈 필요가 없습니다. 예, 헬리콥터를 비행하기 위해 비행 할 수 있으며 10 배 빠르지 만 가격과 헬리콥터 비행이 훨씬 어렵다는 사실은 아닙니다.불필요하게 코드를 미세 최적화 할 때, 이것이 바로 당신이하는 일입니다. 불필요한 목표를 달성하기 위해 불필요한 복잡성과 비용을 추가하십시오.


5

제약 조건에 도달하면 미세 최적화가 중요합니다. 관심있는 것은 메모리, 처리량, 대기 시간 또는 전력 소비 일 수 있습니다. 이것들은 시스템 레벨 특성입니다. 모든 기능을 모든 방식으로 최적화 할 필요는 없으며 최적화 할 수 없습니다.

제약 조건이보다 쉽게 ​​적용되므로 임베디드 시스템은 미세 최적화가 필요할 가능성이 높습니다. 그러나 미세 최적화조차도 지금까지만 가능합니다. 나쁜 디자인에서 벗어나는 방법을 미세 최적화 할 수는 없습니다. 시스템의 우수한 디자인에 대한 요점은 시스템 전체에 대해 추론 할 수 있다는 것입니다. 미세 최적화가 필요한 구성 요소는 시스템 설계를 손상시키지 않는 방식으로 깔끔하게 노출되고 최적화되어야합니다.

오늘날 소형 "임베디드"시스템 은 작년 의 Vaxen 또는 PDP-11 과 매우 유사 할 수 있으므로 이러한 문제가 더 일반적이었습니다. 현대의 일반 상업용 컴퓨팅을 수행하는 현대의 범용 시스템에서는 마이크로 최적화가 거의 없습니다. 이것은 아마도 당신의 아버지가 자신의 입장을 취하는 이유의 일부일 것입니다.

그러나 나노초, 밀리 초, 초 또는 시간을 처리하는지 여부는 중요하지 않습니다. 문제는 동일합니다. 그것들은 시스템의 맥락과 달성하고자하는 것에서 평가되어야합니다.

이것은 마이크로 최적화가 필요한 경우 에 대한 스택 오버플로에 대한 최근 질문의 예입니다 . 임베디드 시스템 용 오픈 소스 비디오 인코더 .


4

마이크로 최적화의 가장 큰 문제점은 유지 관리하기 어려운 코드를 작성하게한다는 것입니다.

또 다른 문제는 컴퓨터 구성에 따라 때때로 '최적화'가없는 것보다 마이크로 최적화의 성능이 최악 일 수 있습니다.

많은 미세 최적화를 수행하면 실제로 중요하지 않은 것에 맞서 싸우는 데 많은 시간이 소요됩니다.

더 좋은 방법은 코드를 깨끗하게 유지하고 유지 관리하기가 더 쉬우 며 성능 문제가 발생하면 프로필을 실행하여 실제로 코드를 느리게 만드는 원인을 파악하는 것입니다. 그리고 무엇이 정말로 나쁜지 아는 것은 고칠 수 있습니다.

마이크로 최적화를하지 않는 것이 바보 같은 코드를 작성하는 데 대한 변명이라고 말하는 것이 아닙니다.


4

밀리 초에 대해 걱정하기 시작하면 PHP를 포기하고 대신 C 또는 Assembly를 사용해야합니다. 내가 이것을하고 싶지는 않지만 그러한 숫자에 대해 토론하고 스크립팅 언어를 사용하는 것은 의미가 없습니다. 어쨌든 종종이 명령으로 코드를 반복합니까?

환경 적 요소에 대해서는 의문의 여지가 없습니다. 어쨌든 서버는 연중 무휴로 운영되며 실제로 처리하는 경우 실제로 오랫동안 작업을 수행하는 경우에만 중요합니다.

사무실의 빛과 컴퓨터가 우리가 질문과 답변을 입력하는 동안 사용한 에너지는 아마도 응용 프로그램에 합리적으로 적용 할 수있는 모든 종류의 마이크로 최적화보다 훨씬 많은 에너지를 소비했습니다.


+1 불을 끄거나 질문에 대답하지 않습니다.
Boz

4

작업에 가장 적합한 간단한 알고리즘을 선택해야합니다. 단순해야하는 이유는 코드를 읽을 수있게 유지하는 것입니다. 그것이 최고가되어야하는 이유는 나쁜 런타임 특성으로 시작하지 않기 위해서입니다. 큰 데이터 세트가있을 경우 BubbleSort를 맹목적으로 선택하지 마십시오. 그러나 간혹 10 가지 요소가있는 것이 좋습니다.

그런 다음 프로파일 링 번호에 가장 적합한 단순 알고리즘 선택이 충분하지 않다고 표시되면 최적화를 시작할 수 있습니다 (일반적으로 가독성 비용).


BubbleSort는 데이터가 최종 대상에서 너무 멀지 않은 몇 가지 부유 요소만으로 거의 정렬 될 때 실제로 quicksort 또는 mergesort보다 낫습니다. 그러나 다른 모든 작업에는 프로그래밍 언어가 제공하는 내장 정렬 기능을 사용해야합니다. 시작하는 가장 간단한 방법입니다 (대부분의 언어에서 내장 정렬 기능이 우수합니다). 나쁜 조언 : start out with bad runtime characteristic의도적으로 나쁜 런타임 특성으로 시작하지 마십시오.
Lie Ryan

@Lie, 데이터가 거의 정렬되어 있고 거품을 사용할 수 있다는 사실을 알고 있다면 알고리즘을 맹목적으로 선택하는 것이 아니라 오타를 지적 해 주셔서 감사합니다.

4

전에도 말했지만 여기에서 "조기 최적화는 모든 악의 근원" 이라고 말할 것 입니다. 이것은 프로그래머의 마음 중심에있는 규칙 중 하나 여야합니다.

코드는 현재 시점보다 항상 빠를 수 있습니다. 특정 칩을 염두에두고 직접 포장하지 않는 한 항상 최적화를 통해 얻을 수있는 것이 있습니다. 그러나, 당신이하는 모든 일에 대해 수동 포장 어셈블리가되고 싶지 않다면, 양적 목표가 있어야합니다. 일단 충족되면, "충분하다"고 말하고 최적화를 멈춰야합니다. 당신은 얼굴에 있습니다.

작동하지 않으면 아름답고 우아하며 성능이 뛰어난 코드는 쓸모가 없습니다 (그리고 "작업"에 의해 모든 예상 입력이 주어지면 예상 출력을 생성합니다). 따라서 작동하는 코드를 만드는 것이 항상 최우선 과제입니다. 작동 한 후에는 성능을 평가하고, 부족한 경우 성능을 향상시킬 수있는 방법을 찾으십시오.

성능에 영향을 줄 미리 결정해야 할 사항이 있습니다. 이 솔루션을 구현하는 데 사용할 언어 / 런타임과 같은 매우 기본적인 결정. 이들 중 다수는 하나의 메소드를 다른 메소드를 호출하는 것보다 훨씬 더 많은 성능으로 성능에 영향을 미칩니다. 솔직히 말해서, 스크립트 언어 인 PHP는 이미 성능에 영향을 미쳤지 만 C / C ++에서 상향식으로 작성된 스크립트 사이트는 거의 없기 때문에 다른 기술 (Java Servlets, ASP.NET)과 비교할 수 있습니다. 등).

그 후, I ​​/ O 메시지 크기는 차세대 최대 성능 킬러입니다. 하드 디스크, 직렬 포트, 네트워크 파이프 등에서 읽고 쓰는 내용을 최적화하면 I / O 작업 뒤의 알고리즘이 효율적이더라도 일반적으로 프로그램 실행 시간이 수십 배 향상됩니다. 그 후, 알고리즘 자체의 Big-O 복잡성을 줄인 다음 절대적으로 필요한 경우 저렴한 메소드 호출을 선택하고 낮은 수준에서 다른 난해한 결정을 내려 "미세 최적화"할 수 있습니다.


2
+1 작동하는 코드 생성은 항상 최우선 과제입니다.
Boz

2
@Keith, 실제로 Knuth가 먼저 말했고, 그는 그보다 훨씬 더 많은 것을 말했습니다.

Anon은
John Saunders

1
실제로 종교는 모든 악의 근원이지만 나는 벗어납니다.
Thomas Eding

4

당신은 아빠가 은퇴 한 프로그래머라고 언급했습니다. 메인 프레임 세계에서 일한 프로그래머는 성능에 대해 매우 염려해야했습니다. 메인 프레임이 사용자 당 64KB의 메모리로 하드웨어 제약 된 미국 해군 활동을 연구 한 것을 기억합니다. 그 프로그래밍 세계에서는 당신이 할 수있는 모든 작은 것들을 찾아 내야합니다.

현재 상황이 크게 다르기 때문에 대부분의 프로그래머는 마이크로 최적화에 대해 크게 걱정할 필요가 없습니다. 그러나 임베디드 시스템 프로그래머는 여전히 그렇고 데이터베이스 사용자는 여전히 최적화 된 코드를 사용해야합니다.


3

코드는 코드의 기능에 대해 명확하게 작성해야합니다. 그런 경우 에만 경우 너무 느린, 다시 가서 속도를. 코드는 이해하기 쉬운 경우 나중에 더 빨라지도록 변경할 수 있지만, 운이 좋으면 명확하게 변경하십시오.


3

다음과 같은 경우에 중요합니다.

1) 누군가의 삶은 코드에 달려 있습니다. 누군가의 심박수 모니터에서 25ms를 실행하는 기능은 아마도 나쁜 생각입니다.

나는 개인적으로 두 가지 접근 방식을 취합니다-가독성에 영향을 미치지 않는 미세 최적화가 있습니다. 그러나 가독성에 영향을 미치는 경우 잠시만 기다려주십시오. 많은 이점을 얻지 못하고 실제로 장거리에서 디버깅하는 데 시간이 더 걸릴 수 있습니다.


2
예제에서 몇 가지 사소한 점 : 25ms가 소요되는 심박수 모니터의 기능은 필요한 응답 시간으로 다른 필요한 작업이 발생할 수있는 한 문제가되지 않습니다. 인터럽트는 이것에 좋습니다. 실제 이벤트를 모니터링하여 사람이 소비하는 디스플레이를 업데이트하는 데 25ms의 대기 시간은 문제가되지 않습니다.
janm

3

코딩시 미세 최적화가 중요합니까?

아니요, 가상 머신을 위해 코드가 작성된 JVM.NET 과 같은 플랫폼 이 있으므로 실행을 최적화하려는 시도가 제대로 수행되지 않을 수 있으므로 개발자 데스크탑에서 최적의 것이 서버에서 반드시 동일하지는 않습니다. 이 고급 소프트웨어 중 일부가 하드웨어에서 얼마나 멀리 떨어져 있는지 살펴보십시오. 고려해야 할 점은 하드웨어의 다양성이 주어진다는 것인데, 새로운 모델이 1 년 이내에 나올 때 CPU 또는 GPU와 같은 특정 칩에 대한 코드를 최적화하는 것이 얼마나 현실적인가?

여기서 고려해야 할 또 다른 질문은 실행 속도, 실행에 사용 된 메모리, 새로운 기능의 개발 속도, 컴파일 또는 디 컴파일 된 형태의 서버의 코드베이스 크기, 확장 성, 유지 관리 성 등의 메트릭으로 측정 한 성능입니다. .? 광범위하게 취한다면 문제는 사소한 것이되지만, 실제로 어떤 방식으로 측정 할 수있는 한 거의 모든 것이 될 수있는 성능을 얼마나 광범위하게 취해야하는지 확신 할 수 없습니다.


새로운 기능이나 버그 수정과 같이 우선 순위가 훨씬 높은 다른 작업에 비해 그러한 작업을 수행하는 것이 얼마나 가치가 있는지 궁금해 할 수있는 일부 미세 최적화가 작동하고 작동하지 않을 수 있습니다. 다른 질문은 하드웨어 나 소프트웨어의 업그레이드가 이러한 최적화 중 일부를 손상시킬 수 있는지 여부입니다.


1
JVM 및 .NET과 같은 플랫폼에서 마이크로 최적화를 절대적으로 수행 할 수 있으며 약간 다른 형태를 취합니다. 그러나 이전의 간단한 C 컴파일러를 최신의 고도로 최적화 된 컴파일러와 비교하는 경우에도 마찬가지입니다. 사용자가 수행 할 수있는 최적화는 다르게 보일 것입니다.
Joachim Sauer

1

좋은 프로그래밍과 마이크로 최적화 사이에는 큰 차이가 있다고 생각합니다.

동일한 작업을 수행하는 두 가지 방법이 있는데, 하나는 다른 것보다 빠르며 가독성은 동일해야합니다. 항상. 그리고 이것은 좋은 프로그래밍입니다. 더 나은 알고리즘을 사용하여 문제를 해결하지 않아도됩니다. 심지어 문서화하기도 쉽습니다. 알고리즘 이름을 지정하면 누구나 Google에서 알고리즘을 사용하고 작동 방식에 대한 자세한 정보를 찾을 수 있습니다.

그리고 좋은 알고리즘은 이미 최적화되어 있습니다. 그들은 빠를 것이다. 그들은 작을 것입니다. 필요한 최소 메모리를 사용합니다.

그것들을 사용하더라도 프로그램이 여전히 그 성능을 가지고 있지 않더라도 마이크로 최적화를 고려할 수 있습니다. 마이크로 최적화를 위해서는 언어를 알아야합니다.

그리고 하드웨어에 더 많은 돈을 쓸 여지가 항상 있습니다. 하드웨어는 싸고 프로그래머는 비싸다 . 하드웨어를 구입할 수있는시기를 최적화하여 너무 많은 시간과 비용을 소비하지 마십시오.


1

대부분의 경우 마이크로 최적화는 그만한 가치가 없기 때문에 IMHO 코드 가독성은 마이크로 최적화보다 더 중요 합니다.

넌센스 마이크로 최적화에 관한 기사 :

우리 대부분은 에코로, ++ $ i를 $ i ++로 바꾸거나, 큰 따옴표를 작은 따옴표로 바꾸는 것과 같이 말도 안되는 미세 최적화에 대한 블로그 게시물을 읽는 데 지쳤습니다. 왜? 시간의 99.999999 %이므로 관련이 없습니다. 왜? 시간의 99.99 %이므로 APC와 같은 PHP 가속기를 설치하거나 누락 된 인덱스를 데이터베이스 열에 추가하거나 홈페이지에있는 1000 개의 데이터베이스 요청을 피하십시오.

print는 실제로 무언가를 반환하기 때문에 하나 이상의 opcode를 사용합니다. 에코가 인쇄보다 빠르다는 결론을 내릴 수 있습니다. 그러나 하나의 opcode는 비용이 들지 않습니다.

새로운 WordPress 설치를 시도했습니다. 스크립트가 랩톱에서 "버스 오류"로 끝나기 전에 정지되지만 opcode 수는 이미 230 만 개가 넘었습니다. 충분했다.

따라서 대부분의 경우 미세 최적화는 수백만의 작업 중 1 개의 작업을 절약하지만 가독성을 떨어 뜨립니다.


1

다른 답변은 돈에 맞습니다. 그러나 언어 / 프레임 워크 구조의 동작에 대한 이해를 반영하는 조기 최적화 / 마이크로 최적화 및 성능 코드 작성 을 차별화 해야하는 또 다른 요점을 추가 할 것입니다 (죄송합니다. 마지막으로 한 단어를 찾을 수 없었습니다) . 마지막 좋은 코딩 방법이며 일반적으로해야합니다!

설명을하겠습니다. 프로파일 링없이 코드 섹션을 최적화하여 실제로 병목 현상이 발생하는지 알 수없는 경우 잘못된 최적화 (미숙 한 / 미세 최적화 읽기)가 아닙니다. 가정, 의견 및 문서화되지 않은 행동을 기반으로 최적화 할 때입니다. 그것이 문서화되어 있지만 더 작지만 더 효율적이고 논리적 인 방식으로 무언가를 수행한다면 , 나는 그것을 좋은 최적화 라고 부릅니다 . 다른 사람들이 말했듯이,이 두 가지 모두 좋은 사업을 얻는 것과 관련하여 단점이 거의 없으며 전혀 장점이 없지만 가독성을 완전히 잃지 않으면 나는 전자가 아닌 후자를 수행합니다 . 가독성 / 유지 보수가 가장 중요하며 선을 그리는 위치에 관한 것입니다.

나는 좋은 최적화와 나쁜 최적화의 무용 도로 여기에 다른 사람들이 만든 요점을 반복 할 것입니다.

  1. 특정 문제에 대한 종속성은 변경 될 수 있으며 응용 프로그램 의 논리적 섹션완료 하기 전에 최적화에 소요되는 시간은 시간 낭비입니다. 비교적 초기 단계에서 최적화하는 것을 의미합니다. 현재 List<T>앱을 출시 할 때까지 앱을 변경해야 LinkedList<T>했으며 이제 모든 벤치마킹은 시간과 노력을 낭비했습니다.

  2. 응용 프로그램의 실제 병목 현상 (측정 가능한 차이로 읽음)은 코드의 5 % (대부분 SQL 코드) 일 수 있으며 다른 95 %를 최적화해도 고객에게 아무런 이점이 없습니다.

  3. 일반적으로 "기술적으로"코드 성능이 좋을수록 더 많은 정보가 표시되므로 오류가 발생하기 쉬운 코드가 많아 져 유지 관리가 어려워지고 시간이 많이 소요되어 돈을 덜 벌게됩니다.

  4. 1 %의 성능 향상을 통해 전 세계에 절약 한 탄소 발자국은 팀이 해당 코드를 디버깅하고 유지 관리 할 때 방출해야하는 온실 가스로 인해 쉽게 뒤떨어집니다.

특히 잘못된 최적화단점 은 다음과 같습니다.

  1. 그것은 종종 당신에게 당신이 기대하는 성능을 제공하지 않습니다. 최적화가 잘못 된 SO에 대한이 질문을 참조하십시오 . 실제로 부작용이 발생할 있습니다. 그것은 문서화되지 않은 행동의 문제입니다.

  2. 대부분의 현대 컴파일러는 어쨌든 당신을 위해 그것을 할 것입니다.

나쁘고 좋은 최적화에 대한 몇 가지 예를 들겠습니다.

나쁜-

  1. 대신 더 작은 정수 유형을 사용하십시오 Int32.

  2. ++i 대신에 사용 i++

  3. for대신 foreach(내가 본 최악의, 논리를 완전히 물리 치고)

  4. 닫힌 변수 피하기

    string p;
    foreach (var item in collection)
        p = ...;
    
  5. char문자열 연결 중에 문자열 대신 사용 :

    string me = 'i' + "me myself"; // something along that line - causes boxing
    

장점 (.NET 세계에서. 자명해야 함)-

  1. 이중 조회

    if (Dictionary<K, V>.TryGetValue(K, out V))
        do something with V
    

    대신에

    if (Dictionary<K, V>.ContainsKey(K))
        do something with Dictionary<K, V>[K]
    
  2. 모두로드

    DirectoryInfo.EnumerateFiles();
    

    대신에

    DirectoryInfo.GetFiles();
    
  3. 2 단계 주조 :

    s = o as string;
    if (s != null)
        proceed
    

    대신에

    if (o is string)
        s = (string)o;
    
  4. 주문이 중요하지 않은 경우

    if (counter < X || expensiveFunction())
    

    대신에

    if (expensiveFunction() || counter < X)
    
  5. 권투

    void M<T>(T o) //avoids boxing
    {
    
    }
    

    대신에

    void M(object o)
    {
    
    }
    

이것들이 눈에 띄는 성능 이점을 제공하는지 묻는다면, 아니오라고 말할 것입니다. 그러나 나는 그것들이 이러한 구조의 행동에 대한 이해에서 유래하기 때문에 그것들을 사용해야한다고 제안합니다. 1 개만 할 수 있는데 왜 두 번 전화를 걸까요? 철학적 인 관점에서 좋은 코딩 관행. 그리고 1 & 3은 엄격한 용어로 읽기가 쉽지 않지만 가독성을 능가합니까? 아니, 별로는 사용하지 않습니다. 이제 이것이 핵심입니다-가독성 대비 적절한 성능 유지. 그리고 그것이 끝나면 선을 그리는 위치에 관한 것입니다.


1

"Worth it"은 작성하고 읽고 유지하는 것이 얼마나 간단한 지, 사용자 에게 무언가를 훨씬 더 빠르게 반응하고 대화식으로 만드는 데 걸리는 시간 과 같은 컨텍스트가 필요합니다.

음료수 캔을 구입하기 위해 몇 페니를 저축하면 그 페니를 구하기 위해 먼 거리를 여행해야한다면, 특히 요즘 탄산 음료를 거의 마시지 않는다는 점을 고려할 때별로 좋지 않습니다. 백만 캔의 음료수를 구매할 때 캔당 몇 페니를 절약하는 것은 큰 일이 될 수 있습니다.

한편 두 사람이 내 옆에 있고 한 사람이 몇 동전을 똑같이 저렴하게 제공하고 다른 사람은 그렇지 않은 경우 약간의 돈을 절약하고 모자가 더 좋아서 더 비싼 것을 선택합니다. 어리석은 경우처럼 보입니다. 비관의.

내가 "마이크로 최적화"라고 부르는 사람들이 적용하는 것이 사소한 것이 아니라면 그러한 최적화를 고려해야 할 세 가지가 절대적으로 있어야 할 때, "미세 최적화"라고 부르는 사람들에게는 호기심없이 측정, 컨텍스트 및 사용자 엔드 토론이없는 것 같습니다. 나에게 적절한 마이크로 최적화는 요즘 메모리 레이아웃 및 액세스 패턴과 관련이 있으며 초점이 "마이크로"인 것처럼 보이지만 실제로는 마이크로가 아닙니다.

얼마 전까지 만해도 대량의 열 확산 스키닝을 위해 알고리즘 복잡도를 변경하지 않고 동일한 출력 (자동 테스트로 확보)을 사용하여 24 초에서 25 밀리 초 (약 960 배 더 빠름)로 작업을 줄일 수있었습니다. "마이크로 최적화"(가장 큰 것은 메모리 레이아웃이 약 2 초로 줄어든 메모리 레이아웃 변경에서 비롯된 것으로, 나머지는 SIMD 및 VTune의 캐시 미스에 대한 추가 분석 및 일부 메모리 레이아웃 재배 열과 같은 것들이었습니다).

Wolfire는 여기에서이 기술을 설명하고 필요한 시간으로 어려움을 겪었습니다. http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/

내 구현은 1 분 미만으로 낮추려고 애쓰는 동안 밀리 초 안에 그렇게 할 수있었습니다. 여기에 이미지 설명을 입력하십시오

24 초에서 25ms로 "미세 최적화"한 후 워크 플로우의 게임 체인저였습니다. 이제 아티스트는 리그를 약간 변경할 때마다 24 초 동안 기다리지 않고 30FPS 이상에서 실시간으로 리그를 변경할 수 있습니다. 그리고 더 이상 진행률 표시 줄과 이런 종류의 것들이 필요하지 않았기 때문에 소프트웨어의 전체 디자인이 실제로 바뀌 었습니다. 따라서 모든 개선 사항이 알고리즘 복잡성에 대한 개선없이 이루어 졌다는 점에서 "마이크로 최적화"일 수도 있지만, 이전에는 고통스럽고 비 대화식 프로세스였던 것이 실제로 "매우 최적화"였습니다. 실시간 대화 형으로 사용자의 작업 방식을 완전히 바꿔 놓았습니다.

측정, 사용자 엔드 요구 사항, 컨텍스트

나는 Robert의 의견을 정말로 좋아했으며 아마도 내가 원하는 요점을 찾지 못했습니다.

글쎄 이런 종류의 변화가 "가치가 없다"고 주장하는 사람은 아무도 없습니다. 실질적인 혜택을 보여줄 수있었습니다. 많은 소위 미세 최적화는 불가능합니다.

이것은 종종 실시간 요구 사항이있는 매우 중요한 성능의 분야에서 일 하기는하지만, 나가야 할 마이크로 최적화를 고려할 때만 가능합니다.

그리고 측정뿐만 아니라 사용자 측도 강조합니다. 나는 현재 필드 (그리고 이전에는 gamedev)에 사용자 / 팬, 개발자 두 번째로 왔기 때문에 이상합니다. 그래서 나는 기술적 인 퍼즐을 푸는 것과 같은 프로그래머들을 흥분시키는 일반적인 것들에 결코 흥분하지 않았다. 나는 그들에게 부담이 있음을 알았지 만 다른 사용자와 공유 한 사용자 엔드 드림을 통해 그것들을 견뎌 낼 것입니다. 그러나 그것은 내가 무언가를 최적화하고 있는지 확인하는 데 도움이되었습니다. 실제 이익을 가진 사용자에게 실제로 영향을 미쳤습니다. 마이크로 최적화를 목표로 삼는 것이 나의 안전 장치입니다.

필자의 의견으로는 실제로 프로파일 러만큼이나 중요합니다. 큐브의 세분화를 10 억 개의 패싯으로 미세 최적화하는 것과 같은 일을하는 동료가 있었기 때문에 캐릭터 및 차량과 같은 실제 프로덕션 모델을 질식시키기 위해서였습니다. 그 결과는 "기술 데모"의미에서 인상적이지만 실제 사용자에게는 거의 쓸모가 없었습니다. 실제 사용 사례와 일치하지 않는 사례를 프로파일 링하고 측정하고 벤치마킹했기 때문입니다. 따라서 소프트웨어와 같은 소프트웨어를 생각하고 사용하는 법을 배우거나 그들과 협력하여 (이상적으로는 적어도 협력해야 함) 사용자에게 중요한 것을 먼저 이해하는 것이 매우 중요합니다.


2
글쎄 이런 종류의 변화가 "가치가 없다"고 주장하는 사람은 아무도 없습니다. 실질적인 혜택을 보여줄 수있었습니다. 많은 소위 미세 최적화는 불가능합니다.
Robert Harvey

1
@RobertHarvey 그것은 내가 할 바라고 점의 종류이고, 어떤 사람들은 등을 측정, 효과에 반드시 현미경 아니지만,이 상황에 너무 의존의 "마이크로 최적화"라고 부릅니다 이후 isset대가 strlen초점이 더 조금만 보인다 컨텍스트와 측정이 없습니다. :-D
Dragon Energy

1
@RobertHarvey 나는 비록 "마이크로 최적화"에 부정적인 맥락이 있다면, 그러한 측정, 상황 및 사용자 엔드 요구가없는 경향이 있다고 간접적으로 말하고 싶었다. 아무도 사용하지 않은 것을 제외하고는 멋진 무언가로 지옥을 최적화 한 동료가 있었기 때문에 마지막 사건에 대해서도 계속 갈 수있었습니다. 적절한 최적화를 위해서는 약간의 사용자 이해가 필요하다고 생각합니다. 그렇지 않으면 사용자가 신경 쓰지 않는 것을 프로파일 링하고 조정할 수 있습니다.
드래곤 에너지

1
일부 최적화는 긴급한 요구에 의해 주도되고 다른 최적화는 호기심 (지적 추구 및 모험)에 의해 주도됩니다. 우리 둘 다 필요해 Dragon Energy의 이야기에서는 아마도 편집자가 24 초가 될 때까지 렌더링 결과를 보지 못하는 것에 대해 큰 소리로 불평하지 않았기 때문에 아마도 "필요한 필요성"이 아닐 것입니다. 실제로 프로그래머는 속도 기록을 이길 수있는 모든 노력에 투자 할 때까지 얼마나 빠른지 알지 못할 수 있습니다. 주도적 인 수요로 자신을 제한하는 것은 비즈니스에 의미가 있지만 그렇게하면 놀라운 최적화 기회 나 게임 체인저를 놓치게됩니다.
rwong

1
비즈니스 감각으로 말하면 수익 창출 문제도 있습니다. 모든 이동 (예 : 성능 최적화 작업을 수행하는 프로그래머)은 비용이 많이 들며 비즈니스 이해를 위해서는 비용을 보상해야합니다. 따라서 프로그래머가 비즈니스 관리자로부터 승인을 받아야하는 경우 게임 변경 속도 개선을 "판매"할 수 있는지 또는 얼마나 많은 돈을 절약 할 수 있는지를 물어야합니다.
rwong

0

마이크로 최적화는 병목 현상이 아닌 것을 최적화하는 프로세스입니다. 예를 들어, 프로그램이 두 개의 함수 A와 B를 호출하고 A가 완료하는 데 100 밀리 초가 걸리고 B가 2 마이크로 초가 걸리고 함수 B를 계속 최적화하는 경우 중요하지 않을뿐만 아니라 절대적으로 잘못된 것입니다. 그러나 최적화 기능 B를 마이크로 최적화가 아닌 최적화라고합니다. 최적화의 중요성에 달려 있습니다. 할 일이없고 프로그램에 버그가 없다고 가정하면 예, 중요합니다. 그러나 일반적으로 우선 순위가 있습니다. 함수 C를 추가 / 쓰기해야한다고 가정 해보십시오. 함수 C를 작성하면 해당 기능없이 프로그램을 더 빨리 만드는 것보다 돈을 더 많이 버는 것으로 생각되면 최적화하십시오. 그렇지 않으면 기능을 추구하십시오. 또한, 성능에 중점을 둔 숙련 된 프로그래머는 최적화에 많은 시간을 소비하지 않고 빠른 프로그램 만 작성합니다. 적어도 그들은 어떤 도구를 사용해야하고 의미없는 (마이크로 판독) 최적화를 위해 몇 년을 소비하지 않아야 할지를 알고 있습니다.


이 게시물은 읽기 어렵습니다 (텍스트의 벽). 더 나은 형태로 편집 하시겠습니까 ?
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.