개발자는 먼저 가독성이나 성능을 목표로해야합니까? [닫은]


82

종종 개발자는 문제를 해결할 수있는 두 가지 가능한 방법, 즉 관용적이고 읽기 쉬운 방법과 덜 직관적이지만 더 나은 성능을 발휘할 수있는 방법 중에서 선택해야합니다. 예를 들어, C 기반 언어에서는 숫자에 2를 곱하는 두 가지 방법이 있습니다.

int SimpleMultiplyBy2(int x)
{
    return x * 2; 
}

int FastMultiplyBy2(int x)
{
    return x << 1;
}

첫 번째 버전은 기술 및 비 기술 독자 모두에게 더 간단하지만 비트 이동이 곱셈보다 더 간단한 작업이기 때문에 두 번째 버전이 더 잘 수행 될 수 있습니다. (지금은 컴파일러의 옵티마이 저가이를 감지하고 최적화하지 않을 것이라고 가정 해 보겠습니다.

개발자로서 초기 시도로 어느 것이 더 좋을까요?


약간 가혹합니다. 우리 모두가 때때로 가지고있는 우려에 대한 좋은 질문입니다. +1
Inisheer

3
이 예는 분명히 인위적이고 사소합니다. 실제로 하드 코딩 된 승수를 사용하는 함수는 없습니다.
JohnMcG

1
요점은 "<가 <=보다 더 잘 수행 되는가?"와 같은 질문을 많이 본다는 것입니다. 이것은 잘못된 질문입니다. 옳은 (첫 번째) 질문은 관용적이거나 관습적인 것이고 성능에 대해 걱정하는 것입니다.
JohnMcG

1
이것은 내가 stackoverflow에서 읽은 최고의 질문 중 하나입니다. 이것은 언어의 의미론뿐만 아니라 컴퓨터 작동 방식의 핵심에 도달합니다. +1
WolfmanDragon

2
@OutlawLemur 나는 그것을 알고 있습니다. 그러나 어떤 사람들은 예를 들어 <또는 <= (후자의 경우 비교 값이 미리 증가됨)를 사용하여 루프를 구성하는 것이 더 나은지 묻습니다.
JohnMcG

답변:


108

하나 놓쳤습니다.

첫 번째 코드는 정확성을위한 것이고 그 다음은 명확성을위한 것입니다 (물론 둘은 종종 연결되어 있습니다!). 마지막으로 실제로 필요한 실제 경험적 증거가있는 경우에만 최적화를 살펴볼 수 있습니다. 조기 최적화는 정말 악합니다. 최적화에는 거의 항상 시간, 명확성, 유지 보수 비용이 듭니다. 당신은 그것으로 가치있는 것을 구입하고 있는지 확인하는 것이 좋습니다.

좋은 알고리즘은 거의 항상 현지화 된 튜닝보다 우수합니다. 정확하고 명확하며 빠른 코드를 가질 수없는 이유는 없습니다. 하지만 '빠름'에 초점을 맞추기 시작하면 불합리하게 운이 좋을 것입니다.


이것은 여기에서 가장 좋은 대답입니다. 코드가 아닌 알고리즘을 조정하십시오. 미묘한 변경으로 Erastosthenes의 jscript Sieve가 다른 동일한 C ++ 버전보다 성능이 우수하도록 만들 수 있습니다. (내 자신의 방법 인 Atkins의 체가 아닙니다.)
Peter Wone

2
안타깝게도 좋아하는 답변이 없습니다. :)
Sandor Davidhazi

59

IMO는 성능이 측정되고 더 빠른 버전이 필요할 때까지 분명하게 읽을 수있는 버전입니다.


나는 동의한다. 작년에 저는 회사 서버 측 Java 코드베이스와는 별도로 주요 구성 요소를 구현했으며 읽을 수 있도록 최선을 다했습니다. 나중에 성능 문제가 있음이 밝혀졌고 어떤 방식 으로든 좀 덜 읽을 수있는 디자인으로 이어지는 주요 재 작업을했습니다.
Ryan Delucchi

46

Don Knuth 에게서 가져옵니다.

조기 최적화는 프로그래밍의 모든 악 (또는 적어도 대부분)의 근원입니다.


이 인용문은 Don 자체가 아니라 Hoare에서 나온 것입니다. Don은 방금 인기를 얻었습니다. wikipedia를 확인하십시오.
kohlerm

1
그리고 그것은 매우 중요한 몇 가지 자격을 포함하는 전체 단락에서 하나의 을 선별 적으로 인용 한 것 입니다.
Marquis of Lorne

19

가독성 100 %

컴파일러가 "x * 2"=> "x << 1"최적화를 수행 할 수없는 경우 새 컴파일러를 사용하십시오!

또한 프로그램 시간의 99.9 %는 사용자 입력, 데이터베이스 쿼리 및 네트워크 응답을 기다리는 데 소비됩니다. 20 bajillion 시간을 여러 번 수행하지 않는 한 눈에 띄지 않을 것입니다.


8

주어진 예에서 99.9999 %의 컴파일러는 두 경우 모두 동일한 코드를 생성합니다. 내 일반적인 규칙을 보여줍니다. 먼저 가독성과 유지 관리를 위해 작성하고 필요할 때만 최적화하십시오.


C 컴파일러는 표시된 두 가지 예제에 대해 다른 어셈블리 코드로 컴파일됩니다. 첫 번째는 루프를 만들고 두 번째는 왼쪽으로 시프트 명령어를 만듭니다. 이것은 모든 C 스타일 컴파일러에 대해 사실이어야합니다. 각 컴파일러를 테스트하지 않았기 때문에 이에 대해 약속 할 수 없습니다.
WolfmanDragon

이 특정 예에서는 확실히. 일반적인 질문은 여전히 좋은 하나입니다 그래서이 아닌 경우가 많이있다
마크 베이커

@WolfmanDragon, 도대체 무슨 소리 야? "* 2"가 루프를 생성하는 이유는 무엇입니까? "gcc -O2 -s"로 시도하면 두 경우 모두 추가 지침이 표시됩니다.
Paul Tomblin

1
컴파일러가 해당 함수에서 루프를 생성하는 경우 다른 컴파일러를 사용하는 것이 좋습니다!
Martin Vilcans

8

확실히 가독성. 누군가 불평하지 않는 한 속도에 대해 걱정하지 마십시오


8

가독성.

성능을위한 코딩에는 고유 한 과제가 있습니다. Joseph M. Newcomer가 말했습니다.

최적화는 중요한 경우에만 중요합니다. 그것이 중요 할 때 그것은 매우 중요하지만 그것이 중요하다는 것을 알 때까지 많은 시간을 낭비하지 마십시오. 그것이 중요하다는 것을 알고 있더라도 그것이 중요한 위치를 알아야합니다. 성능 데이터가 없으면 무엇을 최적화해야할지 알 수 없으며 아마도 잘못된 것을 최적화 할 것입니다.

결과는 모호하고 작성하기 어렵고 디버그하기 어렵고 문제를 해결하지 못하는 코드를 유지하기가 어렵습니다. 따라서 (a) 소프트웨어 개발 및 소프트웨어 유지 관리 비용이 증가하고 (b) 성능 효과가 전혀 없다는 두 가지 단점이 있습니다.


5

가독성. 최적화 할 시간은 베타 테스트를 할 때입니다. 그렇지 않으면 시간을 보내는 데 필요한 것이 무엇인지 전혀 알 수 없습니다.


5

나는 가독성을 우선으로 할 것입니다 . 오늘날 우리가 가지고있는 최적화 된 언어와 엄청나게로드 된 머신을 고려할 때 우리가 읽을 수있는 방식으로 작성하는 대부분의 코드는 괜찮은 성능을 발휘할 것입니다.

매우 드문 시나리오에서 성능 병목 현상이 발생할 것이라고 확신하고 (과거의 나쁜 경험에서 비롯된 것일 수 있음) 성능에 큰 이점을 줄 수있는 이상한 트릭을 찾았습니다. 그. 그러나 코드 조각을 잘 주석 처리해야 더 읽기 쉽게 만들 수 있습니다.


4

이 논쟁에서 자주 간과되는 요소는 프로그래머가 읽기 어려운 코드를 탐색하고 이해하고 수정하는 데 걸리는 추가 시간입니다. 프로그래머의 시간이 한 시간에 백 달러 이상이라는 것을 고려할 때 이것은 매우 실제적인 비용입니다.
이러한 직접적인 추가 개발 비용은 성능 향상에 대응합니다.


4

설명과 함께 주석을 달면 읽기 쉽고 빠릅니다.

실제로 프로젝트 유형과 성능이 얼마나 중요한지에 따라 다릅니다. 3D 게임을 제작하는 경우 일반적으로 거기에 던져야 할 일반적인 최적화가 많이 있으며 그렇게하지 않을 이유가 없습니다 (너무 일찍 빠져들지 마세요). 그러나 당신이 까다로운 일을하고 있다면 그것을 보는 사람이 당신이 까다로운 방법과 이유를 알 수 있도록 주석을 달아 라.


3

대답은 상황에 따라 다릅니다. 예를 들어 장치 드라이버 프로그래밍이나 게임 개발에서 두 번째 형식은 허용되는 관용구입니다. 비즈니스 애플리케이션에서는 그리 많지 않습니다.

가장 좋은 방법은 다른 개발자가 코드 를 어떻게 수행하는지 확인하기 위해 코드 (또는 유사한 성공적인 애플리케이션)를 살펴 보는 것입니다.


3

<<를 사용하면 마이크로 최적화가 수행됩니다. 그래서 Hoare의 (너츠 아님) 규칙 :

조기 최적화 는 모든 악의 근원입니다.

적용되며 우선 더 읽기 쉬운 버전을 사용해야합니다.

이것은 IMHO가 확장 할 수 없거나 잘 수행 할 수없는 소프트웨어를 설계하기위한 변명으로 종종 오용되는 규칙입니다.


3

양자 모두. 코드는 둘 다 균형을 이루어야합니다. 가독성 및 성능. 둘 중 하나를 무시하면 프로젝트의 ROI가 망가질 수 있기 때문에 결국 상사에게 중요한 모든 것이됩니다.

가독성이 좋지 않으면 유지 관리가 어려워지고 유지 관리에 더 많은 리소스가 소비되어 ROI가 낮아집니다.

성능이 좋지 않으면 투자 및 고객 기반이 감소하여 ROI가 낮아집니다.


2

코드베이스가 클수록 가독성이 중요합니다. 작은 기능을 이해하려고 노력하는 것은 그렇게 나쁘지 않습니다. (특히 예제의 메소드 이름이 단서를 제공하기 때문입니다.) 마침내 코딩을 그만 둔 외톨이 천재가 작성한 우버 코드의 일부에는 그다지 좋지 않습니다. 그는 마침내 자신의 능력의 복잡성의 최고점을 보았 기 때문에 당신을 위해 썼고 당신은 결코 그것을 이해하지 못할 것입니다.


2

코드의 가독성이 걱정된다면 주저하지 말고이 작업을 수행하는 이유와 내용을 상기시키는 주석을 추가하십시오.


1

곱셈 대 bitshift는 것입니다 사소한 최적화 그 이익 옆에 아무것도 . 그리고 지적했듯이 컴파일러가이를 수행해야합니다. 그 외에는이 명령이 실행되는 CPU만큼 이득은 무시할 수 있습니다.

반면에 심각한 계산을 수행해야하는 경우 올바른 데이터 구조가 필요합니다. 그러나 문제가 복잡하다면 그 문제를 알아내는 것이 해결책의 일부입니다. 예를 들어, 정렬되지 않은 1000000 개의 객체 배열에서 ID 번호를 검색하는 것을 고려하십시오. 그런 다음 이진 트리 또는 해시 맵을 사용하여 재고하십시오.

그러나 n << C와 같은 최적화는 일반적으로 무시할 수 있고 언제든지 변경하기가 쉽습니다. 코드를 읽기 쉽게 만드는 것은 아닙니다.


1

해결해야 할 작업에 따라 다릅니다. 일반적으로 가독성이 더 중요하지만 처음부터 성능을 생각할 때 여전히 몇 가지 작업이 있습니다. 그리고 최적화 자체가 코드의 충분한 부분을 처음부터 다시 작성해야 할 수 있기 때문에 모든 것이 완벽하게 작동 한 후에는 프로파일 링 및 최적화를 위해 하루를 보낼 수 없습니다. 그러나 요즘에는 흔하지 않습니다.


1

항상 최대로 최적화해야하며 성능은 항상 중요합니다. 오늘날 우리가 블로 트웨어를 사용하는 이유는 대부분의 프로그래머가 최적화 작업을 원하지 않기 때문입니다.

그렇긴해도 매끄러운 코딩에 대한 설명이 필요한 곳에 언제든지 주석을 달 수 있습니다.


특정 수준에 동의합니다. 나는 당신이 원래의 질문처럼 마이크로 최적화를 넣어서는 안된다고 생각합니다. 최적의 방식으로 리소스를 사용하는 방식으로 시스템을 설계해야합니다. 해당 분야에서 얻을 수있는 훨씬 더 많은 성능이 있습니다.
Erik van Brakel

오늘날 우리는 블로 트웨어를 가지고 있지만 최적화가 부족하다고 비난하지는 않습니다. 나는 과도한 디자인, 바주카포로 날아 다니는 파리, 노 젓는 배만 필요할 때 해저 정기선을 짓는 것을 비난합니다. 물론 그것은 숙고합니다.
Mike Dunlavey

디자인 최적화가 최우선 과제라는 점에서 두 분 모두 동의합니다. 또한 소프트웨어 엔지니어링 프로세스의 모든 수준에 동일한 태도가 적용되어야한다고 말하고 싶습니다. 코드 수준에서 최적화를 수행하지 않는다면 디자인 중에도 부족한 것일 수 있습니다.
Lance Roberts

1

병목 현상을 모르면 최적화 할 필요가 없습니다. 코드의 해당 부분이 거의 실행되지 않는 경우에만 함수를 매우 효율적으로 만들었을 수 있습니다 (보통 어느 정도 가독성을 떨어 뜨림). 따라서 측정 할 것이있을 때까지 마이크로 최적화 할 수 없으며 가독성을 위해 시작하는 것이 좋습니다. 그러나 전체 아키텍처를 설계 할 때 속도와 이해 가능성을 모두 염두에 두어야합니다. 둘 다 엄청난 영향을 미치고 변경하기 어려울 수 있기 때문입니다 (코딩 스타일 및 방법에 따라 다름).


1

소프트웨어 비용의 약 70 %가 유지 관리에있는 것으로 추정됩니다. 가독성은 시스템을보다 쉽게 ​​유지 관리 할 수있게하여 수명 동안 소프트웨어 비용을 낮 춥니 다.

성능이 가독성보다 더 중요한 경우가 적습니다.

가독성을 희생하기 전에 "이 작업을 수행하여 시스템에 추가하는 추가 비용을 처리 할 준비가되어 있습니까?"라고 생각하십시오.


1

나는 Google에서 일하지 않기 때문에 사악한 선택을 할 것입니다. (최적화)

Jon Bentley의 "Programming Pearls"6 장에서 그는 한 시스템이 6 개의 다른 설계 수준에서 최적화하여 400 배의 속도를내는 방법을 설명합니다. 저는 이러한 6 가지 디자인 수준에서 성능에 신경을 쓰지 않음으로써 현대 구현자가 프로그램에서 2-3 배 정도의 속도 저하를 쉽게 달성 할 수 있다고 믿습니다.


1

거의 모든 사람들이 대답에서 말했듯이 가독성을 선호 합니다. 내가 실행하는 100 개 프로젝트 중 99 개는 어려운 응답 시간 요구 사항이 없으므로 쉬운 선택입니다.

코딩을 시작하기 전에 이미 답을 알고 있어야합니다. 일부 프로젝트에는 'Y (밀리) 초 내에 작업 X를 실행할 수 있어야 함'과 같은 특정 성능 요구 사항이 있습니다. 그럴 경우 목표를 달성하고 최적화해야하는 시점을 알고 있습니다. (희망적으로) 이것은 코드를 작성할 때가 아니라 프로젝트의 요구 사항 단계에서 결정됩니다.

좋은 가독성과 나중에 최적화 할 수있는 능력은 적절한 소프트웨어 설계의 결과입니다. 소프트웨어가 사운드 디자인 인 경우 시스템의 다른 부분을 손상시키지 않고 소프트웨어의 일부를 분리하고 필요한 경우 다시 작성할 수 있어야합니다. 게다가 내가 만난 대부분의 진정한 최적화 사례 (실제 저수준 트릭을 무시하고 부수적 임)는 한 알고리즘에서 다른 알고리즘으로 변경하거나 데이터를 디스크 / 네트워크 대신 메모리로 캐싱하는 것입니다.


1

가독성이 첫 번째 목표입니다.

1970 년대에 육군은 소프트웨어 개발의 "새로운"기술 (하향식 설계, 구조화 된 프로그래밍, 최고 프로그래머 팀 등)을 테스트하여 이들 중 어느 것이 통계적으로 유의미한 차이를 만들 었는지 확인했습니다.

개발에 통계적으로 유의미한 차이를 만든 유일한 기술은 ...

프로그램 코드에 빈 줄 추가.

사전 구조화 된 사전 객체 지향 코드의 가독성 향상은 이러한 연구에서 생산성을 향상시킨 유일한 기술이었습니다.

==============

최적화는 전체 프로젝트가 단위 테스트를 거쳐 계측 준비가 된 경우에만 해결해야합니다. 코드를 최적화해야하는 곳을 알 수 없습니다.

1970 년대 후반의 획기적인 책 Kernigan과 Plauger에서 SOFTWARE TOOLS (1976)와 SOFTWARE TOOLS IN PASCAL (1981)은 하향식 디자인을 사용하여 구조화 된 프로그램을 만드는 방법을 보여주었습니다. 그들은 텍스트 처리 프로그램을 만들었습니다 : 편집기, 검색 도구, 코드 전 처리기.

완성 된 텍스트 형식화 기능이 INSTRUMENTED되었을 때 그들은 대부분의 처리 시간이 텍스트 입력과 출력을 수행하는 세 가지 루틴에서 소비된다는 것을 발견했습니다. (원본에서는 io 함수가 시간의 89 %를 차지했습니다. 파스칼 책에서는 이러한 기능이 55 % 소비!)

이들은이 세 가지 루틴을 최적화 할 수 있었고 합리적이고 관리 가능한 개발 시간과 비용으로 성능을 향상시킬 수있었습니다.


1

가독성 우선. 그러나 가독성 이상의 것은 특히 데이터 구조 측면에서 단순성 입니다.

왜 그렇게 느린 지 이해할 수 없었던 시력 분석 프로그램을하는 학생이 생각납니다. 그는 단지 좋은 프로그래밍 관행을 따랐을뿐입니다. 각 픽셀은 하나의 객체 였고, 이웃에게 메시지를 보내는 방식으로 작동했습니다.

이것 좀 봐


1

가독성이 없다면 정말로 필요할 때 성능 향상을 얻기가 매우 어려울 것입니다.

성능은 프로그램에 문제가있을 때만 향상되어야합니다.이 구문보다는 병목 현상이 발생할 수있는 곳이 많습니다. <<에서 1ns 개선을 찌르고 있지만 10 분 IO 시간을 무시했다고 가정 해 보겠습니다.

또한 가독성과 관련하여 전문 프로그래머는 컴퓨터 과학 용어를 읽고 이해할 수 있어야합니다. 예를 들어, 우리는 putThisJobInWorkQueue라고 말하지 않고 enqueue 메소드의 이름을 지정할 수 있습니다.


동의하지만, 당신은 형편없는 모범이 있다고 생각합니다. 예를 들어, 코드베이스에 대해 아무것도 모르는 사람으로서 대기열에 넣는 것은 나에게 덜 의미가 있습니다. 나는 방법을 알고 싶지 않다. 나는 무엇을 알고 싶다. 당신이 준 예는 훨씬 더 나은 것을 말합니다.
Shaun Sweet

0

먼저 가독성을 위해 작성하되 독자는 프로그래머 가 될 것으로 기대하십시오 . 자신의 가치가있는 프로그래머라면 곱셈과 비트 시프트의 차이를 알고 있어야합니다. 또는 적절하게 사용되는 삼항 연산자를 읽을 수 있고 복잡한 알고리즘을 찾아보고 이해할 수 있어야합니다 (코드에 주석을 달고 있습니까? ) 등

물론 초기 과다 최적화는 나중에 리팩토링해야 할 때 문제를 일으키지 못하지만 개별 메서드, 코드 블록 또는 명령문의 최적화에는 실제로 적용되지 않습니다.


0

가독성을 위해 가라고 말하고 싶습니다.

그러나 주어진 예제에서 두 번째 버전은 이미 충분히 읽을 수 있다고 생각합니다. 함수의 이름이 함수에서 무슨 일이 일어나고 있는지 정확하게 나타 내기 때문입니다.

우리가 항상 우리에게 알려주는 기능 만 있다면, 그들이하는 일 ...


0

1 시간의 프로세서 시간 비용은 얼마입니까?

프로그래머 시간당 비용은 얼마입니까?


최종 사용자 시간당 비용은 얼마입니까? 이제 사용자 수에 따라 음소거합니다.
gbjbaanb

gbjbaanb : 제 생각이 맞습니다. Andy의 의견은 최종 사용자가 볼 수없는 서비스에 대해서만 작동하며, 그렇더라도 좋은 비교는 아닙니다.
Erik van Brakel

0

IMHO 두 가지 모두 할 일이 없습니다. 먼저 작동하는 코드를 찾아야합니다. 이것은 성능이나 읽는 능력보다 중요하기 때문입니다. 가독성과 관련하여 : 코드는 어떤 경우에도 항상 읽을 수 있어야합니다.

그러나 코드를 읽을 수없고 동시에 좋은 성능을 제공 할 수없는 이유를 알 수 없습니다. 귀하의 예에서 두 번째 버전은 나에게 첫 번째 버전만큼 읽을 수 있습니다. 그것에 대해 덜 읽기 쉬운 것은 무엇입니까? 프로그래머가 왼쪽으로 이동하는 것이 2의 거듭 제곱을 곱하는 것과 같고 오른쪽으로 이동하는 것이 2의 거듭 제곱으로 나누는 것과 같다는 것을 모르면 일반적인 가독성보다 훨씬 더 기본적인 문제가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.