어느 시점에서 성능에 대해 생각해야합니까?


16

응용 프로그램을 구축 할 때 이것이 특정 기능을 수행하거나 구현하는 가장 좋은 방법인지 끊임없이 묻습니다. 종종 스택 오버 플로우 또는 피드백을 원하는 다른 포럼에 질문을 게시하여 성능과 관련하여 "마차 앞에 카트를 넣지 않는"방법에 대한 의견을받습니다. 대부분의 프로그래머는 응용 프로그램이 끝날 때까지 성능에 대해 생각하지 않거나 성능이 절대적으로 허용되지 않습니까? 개발 환경이 프로덕션 환경과 다르고 개발 랩톱의 결과에 전적으로 의존해서는 안된다는 것을 이해하지만 다른 기술보다 성능을 향상시키는 방법과 기술이 있습니다.

개발 프로세스 전체에서 성능을 고려하는 것은 나쁜 습관입니까? 성능이 실제로 향상 될 때까지 이러한 고려 사항을 해제해야합니까?

최신 정보

분명히하기 위해, 당신이 고려하고 있거나 일부 기능에 대해 작업하려고하는 상황에 대해 이야기하고 있습니다. 구현 방법에는 여러 가지가 있지만 각 구현이 얼마나 잘 확장되는지 확실하지 않습니다. 또한 익숙하지 않은 몇 가지 기술이있을 수 있습니다. 소규모에서는 모든 접근 방식이 적합 할 수 있지만 대규모에서는 일부는 유지되고 일부는 그렇지 않습니다. 의견이나 지침을 요청할 때 종종 다음과 같은 반응이 나타납니다.


나는 항상 끔찍하게 확장되는 헛소리를 쓰려고 노력하지 않습니다. 스타트 업 코드에서 이처럼 완벽하게 명확한 라인이 엄청나게 엉망인 "최적화 된"버전보다 많은 CPU 사이클을 필요로하는지 걱정하지 않습니다. 어떤 "성능에 대한 생각"에 대해 이야기하고 있습니까?

Daaaahling, 분명하지 않습니까? 오디션을 기다릴 때!
매트 엘렌

답변:


24

성능 고려 사항의 지연은 때때로 문구의 오용에 기초합니다.

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

전체 인용문을 읽으면 Knuth가 말하려고 한 것은 프로파일 링없이 개발 중에 적용된 미세 최적화는 일반적으로 바람직하지 않습니다. 실제로 성능상의 이점을 얻지 않고도 유지 보수가 덜되는 코드로 이어지기 때문입니다.

그렇다고 응용 프로그램이 거의 끝날 때까지 성능을 고려해서는 안된다는 의미는 아닙니다. 그렇게하면 성능이 부적절하고 디자인 아키텍처가 더 나은 성능을 지원하지 않으므로 다시 시작해야 할 수도 있습니다.

난해한 (및 조기) 최적화없이 우수한 성능을 달성하기 위해 개발 중에 수행 할 수있는 많은 작업이 있습니다.

  1. 현명하고 신중한 아키텍처를 사용하십시오.
  2. 데이터 구조를 올바르게 사용하십시오.
  3. 적절하게 수행되는 기술 (라이브러리, 프레임 워크)을 사용하십시오.

이러한 작업을 수행하면 수행해야하는 성능 최적화가 코드의 작은 부분에 국한됩니다. 프로파일 링은 해당 코드를 식별하고 유지 보수성을 희생하지 않으면 서 성능 향상이 가장 좋은 위치에 집중할 수 있도록합니다.


5
+1 세이지의 잘 표현되었지만 과용 된 문구를 실행 가능한 방식으로 밝힌 +1 나는 솔루션을 코딩하기 전에 문제에 대한 훌륭한 해결책을 생각하지 않기위한 근거로 매일 그것을 사용하기 때문에 워크 스테이션을 통해 샘플러에 그 문구를 꿰매어 놓은 프로그래머가 너무 많다는 것을 알고 있습니다. .
Adam Crossland

@ 아담-감사합니다! 완전히 동의 해! 나는 개인적으로 많은 코드를 작성하기 전에 생각을 기울이지 않으려는 이유를 이해하지 못합니다.
Cognitronic

세 점에 +1. 완료하면 모두 시스템에 고정되어 성능 최적화에 크게 영향을 미칩니다. 모든 것이 끝나면 그 증가를 얻을 수 없습니다. 또한 일부 사람들은이 인용구를 느슨하게하기위한 방패로 사용한다는 것에 아담과 더 동의 할 수 없습니다.
Zekta Chan

20

생각하지 말아야 할 것이 있습니다 :

  • 인가 ++i보다 빠른 i++?
  • 인가 switch보다 빠른 if?
  • inline내 기능을 해야합니까 ?
  • 가상 기능이 느립니까?
  • C ++ / Java / C #가 다른 것보다 빠르거나 느립니까?
  • 이러쿵 저러쿵, ...

고려해야 할 사항은 다음과 같습니다.

  • 현실적인 예상 작업량은 무엇입니까?
  • 입력 정보는 얼마나 자주 변경되며 누가 제공합니까? 사전 컴파일을 고려하는 것이 합리적입니까?
  • 데이터 구조를 가능한 한 단순하고 표준화 된 상태로 유지 했습니까? 그것은 해싱과 그런 것들에 대해 걱정하지 않는다는 것을 의미합니다.
  • 알림 을 절대적으로 최소로 유지 했습니까 ? (데이터 구조가 정규화되지 않았기 때문에 데이터의 한 부분을 변경하면 다른 부분도 동시에 변경해야합니다.)

후자의 관점에서 볼 때, 내 경험상 데이터 구조를 설계하여 정규화하지 않아야 할 경우 일시적인 불일치를 견딜 수 있도록하고 나중에 일종의 주기적 스윕으로 해결할 수 있도록하는 것이 가장 좋습니다. 성능을 저하시키는 주요 원인은 알림이 더 이상 알림을 트리거하여 사전에 추측하지 못했던 범위까지 더 트리거하는 것입니다. 그리고 종종 자기 암시적인 변화로 인해 노력이 낭비됩니다.

이 모든 작업을 완료 한 경우 깨끗한 디자인입니다. 그런 다음 주기적으로 개발할 때 프로파일하십시오. ( 랜덤 일시 중지 는 내가 사용하는 방법입니다.) 그런 다음보다 정교한 알고리즘을 가져 와서 성능이 향상되는 것을 알 수 있다면 반드시 그렇게하십시오.


2
좋은 답변; 너무 나쁜 질문은 너무 빨리 CW로 갔다. 또는 당신은 일부 담당자를 얻을 수 있었다. 편집 히스토리에는 이러한 상황이 언제 발생했는지와 이유를 보여주는 감사 추적이있었습니다. 이제는 SE 네트워크가 의심스럽게 그것을하고있는 것 같습니다.
Robert Harvey

@Robert : 예. 슬퍼. 난 그냥 내 가상 맥주에 울어야 할거야 :-)
Mike Dunlavey

3

아니요. 처음부터 성능 (특히 데이터베이스 디자인)에 대해 생각해야합니다. 최적화가 조기 최적화라고 생각하는 사람들은 업계에 많은 해를 끼쳤습니다. 이 인용문은 원래 문제가 발생하기 전에 사람들이 미세 최적화를 보지 못하도록하기위한 것입니다. 전혀 최적화하지 않았습니다. 예를 들어, 데이터베이스에는 성능이 좋지 않은 알려진 기술이 많이 있습니다. 디자인에서 이러한 것을 피하는 것은 당신이해야 할 일의 일부입니다. 성능이 좋지 않은 기술을 사용하여 설계 되었기 때문에 100,000,000 개의 레코드가있는 데이터베이스를 리팩토링하는 것은 매우 어렵고 더 나은 하드웨어를 구입하여 더 이상 문제를 피할 수 없습니다.


3

정확성 1을 먼저 염두에두고 유지 보수성, 안전성 및 신뢰성을 염두에두고 성능에 대해 생각할 수 있습니다. 이 순서를 개발할 때 각 코드에 적용하십시오. 퍼포먼스 솔루션은 단순히 일을 명확하고 간단하게 유지하는 것에서 자연스럽게 떨어질 수 있습니다.

성능의 80 %가 현재 문제에 적합한 알고리즘과 데이터 구조를 선택하고 있습니다. 잘못 최적화 된 퀵 정렬은 여전히 ​​평균적인 경우에 가장 최적화 된 버블 정렬에서 바지를 이길 수 있습니다 (가장 최악의 경우).

SO에있는 모든 사람들이 "빠르고, ++ p 또는 p ++ 더 빠른"마인드 인 사람들은 컴파일러가 더 큰 문제를 잃어 버려 더 큰 문제를 잃어 버려 깨지기 쉬운 코드를 만들어내는 "빠르고, ++ p 또는 p ++"사고 방식입니다. -리딩, 잘못 , 그리고 무엇보다도 더 간단한 해결책보다 훨씬 빠르지는 않습니다. 나는 그런 종류의 코드를 직접 다루었 다. 하나의 예는 우리가 만들 수 없습니다 너무 취성했다 어떤 완전히 파괴없이 변경.


1 "정확성"은 "사양이 충족 됨"을 의미하며 "버그가없는"과 동의어가 아닙니다.


1
일부 사양은 성능 요구 사항을 정의하며 주문에 어떤 영향을 미칩니 까?
벤 L

@Ben : 이상적으로는 없습니다. 그러나 위의 순서를 만족했지만 여전히 어려운 성능 요구 사항을 충족하지 못하는 경우 첫 번째 단계는 병목 현상 (duh)을 찾아 프로파일 링하는 것입니다. 그 후, 그것은 판단 요청입니다. 유지 보수성, 안전성 또는 신뢰성을 희생합니까? 하나의 솔루션으로 모든 것을 생각할 수는 없습니다. 나는 안전과 신뢰성에 대해 더 편집증 적이므로 먼저 가독성을 거래 할 것이지만 런타임 환경 자체는 다른 두 가지를 교환할만큼 안전하고 안정적 ​​일 수 있습니다.
John Bode

2

"좋은"성능이 무엇인지 알고 나면 성능에 대한 생각을 시작해야합니다. 다시 말해, 다음 임계 값이 무엇인지 식별하기 전에 성능에 대해 생각하기 시작하는 것은 잘못입니다.

  • 허용되지 않는 성능-손이 before 기 전에 지금 수정하십시오.
  • 허용 가능한 성능-성능으로 더 이상 시도하기 전에 다른 기능에 집중해야합니다.
  • 목표 성과-이상화 된 성과 수치. 즉, 충분한 시간과 리소스가 있다면 시스템을 어떻게해야합니까?

해당 임계 값을 식별 한 후에는 성능 측정에 사용중인 메트릭도 식별했습니다. 즉, 하루에 여러 번 실행할 수있는 자동화 된 성능 테스트를 설정할 수 있습니다. 당신이 나아지고 있는지 알 수 있습니다.

이러한 메트릭을 만들려면 시스템이 수행해야하는 작업을 이해해야합니다. 예를 들어 절대 성능 메트릭이 요구되거나 (X 시간 내에 응답) 처리량 측정이 (Y 시간당 X 응답)에 요구됩니까? 처리량 및 절대 시간 최적화에는 다른 접근 방식이 필요하며 실제로 중요한 것이 무엇인지 모른다면 잘못된 방식을 최적화하는 것일 수 있습니다.


1

조기 최적화가 모든 악의 근원이라고 들었을 것입니다. 문제는 무엇이 조기에 하는가? 내 생각에 성능에 대해 생각하는 것은 결코 나쁜 생각이 아니지만 코드가 작동 할 때까지 지나치게 걱정하지 마십시오. 일단 작동하면 무거운로드 테스트를 수행하고 병목 현상을 프로파일 링하고 식별하며 성능 최적화를 수행하십시오.

그 존재는 당신이 경우 초기 코딩 단계에서 성능에 대한 생각에 아무것도 잘못 거기 말했다 알고 진정한 차이를 만들 것입니다 특정 기술. 예를 들어, 과거의 경험에 따르면 하나의 스토리지 구조가 다른 것보다 빠르거나 적은 RAM을 사용하므로 라이브러리에서 다른 스토리지 구조를 선택합니다. 또는 알고있는 데이터 에 대해 간단한 캐싱 시스템 (나중에 테스트에 필요한 경우 더 정교하게 만들 수 있음)으로 구축많이 액세스 할 것이고 훨씬 더 잘 캐시 될 것입니다. 이런 식으로, 당신은 (최소한 초기에는 아님) 퍼포먼스에 대해 지나치게 걱정하지 않지만 다른 프로젝트에서 배운 팁과 트릭을 사용하고 있습니다. 초기 개발 과정에서 쉽게 포함 할 수 있도록 이러한 단순성을 유지하고 일부 이점을 제공 할 수도 있습니다.


1

성능은 요구 사항 문서의 시스템 및 사용자 관련 사양에 자세히 나와 있어야합니다. 많은 사람들 이 응용 프로그램 개발에서 요구 사항 분석 을 수행한다는 아이디어에 대해 비웃는 것을 알고 있지만 놀랍게도 그러한 문서는 응용 프로그램이 완성 될 때 성능 관련 리소스를 무엇과 어디에 할당해야하는지 간결하게 대답 할 것입니다. 그리고 그것은 적시에 그 질문에 대답 할 것입니다

요구 사항 문서는 필수적이지 않은 프로세스에 낭비되는 수백 시간을 절약 해줍니다.


1

균형 잡힌 접근 방식이 더 좋습니다. 성능은 중요하지만 작업을 수행하는 것만 큼 중요하지는 않습니다.

  1. 먼저 자신이하는 일과 수행 방식에 대해 조금 생각하려고하는 기능을 작성하십시오 (성능에 대해서는 생각하지만 약간은 아님).
  2. 그것을 테스트
  3. 한 번 실행하면 더 나아질 필요가 있는지 생각해보십시오 (일반적으로 당신은하지 않지만 어떤 경우에는 가능할 것입니다).

이것은 성능과 기능에 대한 일반적인 접근 방식이며 일반적으로 프로그램의 기능과 작업을 개선해야 할 필요가 있는지, 시간이 얼마나 걸리는지 확인하는 데 달려 있습니다.

이와 같은 Q & A 웹 사이트를 생각해 보자. 그 뒤에있는 웹 사이트는 질문하기와 가능한 한 가장 많은 시간 / 비용을 얻는 방법에 대해 많은 생각을했다고 생각합니다. 그러나 알림에 대해 생각할 때 알림이 한 번에 한 번 나타나고 새로운 답변이나 무언가가 있다고 말하는 것이 중요하지 않습니다.


1

성능에 대한 안전한 사고 지연의 한 가지 방법이 있습니다. 가능한 경우 도메인 특정 언어를 사용하는 것입니다.

대부분의 개발 작업을 자체의 작은 DSL로 수행 할 수 있고 문제 영역을 가장 일반적이고 높은 수준의 형태로 표현할 수 있도록 충분히 설계 되었다면 실제 문제 도메인 코드가 아니라 DSL 구현 만 개선하십시오.

veiw의 유지 관리 성 측면에서도 훨씬 더 나은 접근 방식입니다.


1

성능을 고려해야합니다. 그러나 일반적으로 컴퓨터보다 시간이 더 중요하므로 튜닝이 끝났음을 표시하는 선을 그려야합니다.

성능에 관한 정말 좋은 텍스트 기사는 Computer Performance Shell Game 입니다.

"병목 현상 찾기"라고도하는 컴퓨터 성능 셸 게임은 항상 다음 네 가지 리소스간에 재생됩니다.

  • CPU
  • 디스크
  • 회로망
  • 기억

주어진 순간에 컴퓨터는 이러한 리소스 중 하나에서 일부 작업이 완료되기를 기다리고 있습니다. 그러나 어느 것이 CPU, 메모리, 디스크 또는 네트워크입니까? 성능에 관심이 있다면 가장 먼저해야 할 일은 현재 성능을 방해하는 병목 현상을 파악하고 제거하는 것입니다.


0

"최상의"방법은 매우로드 된 용어이며, 대답은 런타임까지 알려지지 않은 요소에 따라 크게 달라질 수 있습니다.

  • 메모리가 충분합니까? - "메모리 내"데이터 구조를 사용하면 성능이 향상되지만 메모리 스왑이 충분하지 않으면 성능이 저하됩니다.
  • 지속성이 필요합니까? 데이터베이스는 무결성을 제공하지만 위의 "메모리 내"데이터 구조보다 느립니다. 훨씬 느리다.
  • 결과를 캐시 할 수 있습니까? 광택이 도움이 될 수 있습니다! http://www.varnish-cache.org/

목록은 계속 이어집니다.

당신이 무엇을 할 수 할, 지식에서 당신은 "아마도 작업을 할 수있는 간단한 일이"작성하는 것입니다 않는 이를, 그리고 그것을 할 모듈 좀 더 알게되면 쉽게 재구성 할 수 있도록 패션. "가장 단순한"것은 반드시 간단한 것은 아닙니다.


0

항상 명심해야합니다. 나는 대부분의 사람들이 말하는 것은 당신이 알지도 못하는 것을 최적화하기 위해 이틀을 보내는 데 아무런 요점이 없다는 것입니다. 제품을 실행하고 사용성 테스트를 수행하면 성능 문제가있는 위치를 보여줍니다. 그런 다음 실제 성능 문제를 식별 한 후에는 수행해야 할 최적화를 대상으로 할 수 있습니다.


0

이론적으로 적어도 베타 테스트를 수행 한 후에는 성능을 생각해야합니다.

그러나 이것은 잘못된 디자인 결정을 내리기위한 라이센스가 아닙니다. 예를 들어, NVARCHAR 문자열을 기본 키로 사용하는 것은 성능 저하의 확실한 경로입니다. 즉, 성능 문제에 관계없이 불결한 습관이므로 처음에는 사용하지 않아야합니다.

디자인이 일반적인 모범 사례 (모든 일반 형식, 클래스에 적절한 정보 숨기기, 싱글 톤 사용 최소화 등)를 따르고 나중에 성능 문제가있는 경우 처리하기가 쉽습니다 (여기서 색인 작성, 거기에 캐시를 구현하십시오).

HTH


0

때에 따라 다르지. 80/20 규칙을 명심하는 것이 유용합니다. 응용 프로그램에서 코드의 대부분 (80 %)은 성능에서 눈에 띄는 차이를 만들기에 충분할 정도로 자주 실행되지 않습니다. 앱이 실행 시간의 약 80 %를 소비해야하는 나머지 20 %에 집중해야합니다.

특정 계산이 수백만 번 반복 될 것이라는 것을 알고있는 경우와 같이 명백한 성능 핫스팟 중 일부 를 미리 식별 할 수 있습니다 . 이러한 경우 작업에 적합한 데이터 구조와 알고리즘을 선택하여 사전 최적화하는 것이 좋습니다.

그러나 그 최적화는 디자인 활동에 더 가깝습니다. 일반적으로 쓸모없는 것은 "최적의 성과 얻기"라는 이름으로 현명한 비트 인증 트릭으로 엄청난 시간을 소비하는 미세 최적화입니다. 특히 전후에 적절한 측정을 수행하지 않으면 이러한 변경으로 인해 실제 상황에서 앱이 느려지거나 앱 속도가 느려질 수 있습니다.


0

현재 개발 단계에 따라 다릅니다.

1) 소프트웨어의 기능을 구축하는 경우 계속 작동하고 제대로 작동하는지 확인하십시오 (예 : 바람직하고 효율적).

2) 일단 빌딩 블록 통합, 당신은 리소스 hogger의 힌트를 얻을 것이다, 당신은 최적화를위한 공간이있다.


0

당신이해야하는 경우 시작 성능에 대한 생각, 당신은 문제가있어. 항상 성능에 대해 생각해야합니다. 사실, 나는 좋은 프로그래머들이 의도하지 않았을 때에도 "7 초마다 섹스에 대해 생각하는 남성들"방식으로 퍼포먼스에 대해 생각할 것이라고 생각한다.

중요한 것은 모든 생각을 바탕으로 어떤 행동 을 취할 것인가 입니다. 생각은 싸지 만 행동은 코드를 깨뜨리고 마감일을 날려 버릴 수 있습니다.

대부분의 경우 현명한 행동은 아무것도하지 않는 것입니다. 성능 문제를 관찰 할 수있을 정도로 코드가 자주 호출되지 않는 것으로 나타났습니다. 컴퓨터마다 한 번씩 실행되는 시작 코드 일 수도 있습니다. 잠재적 사용자 기반의 1 %, 아마도 데이터베이스 액세스 속도가 느린 바다에서 익사 한 약간의 중복 서버 코드 일 수도 있고, 중요하지 않은 코드 섹션의 정수 할당 일 수도 있습니다.

종종 주어진 작업으로 인해 간단한 변경으로 해결할 수있는 성능 문제가 발생할 수 있다고 생각합니다. 예를 들어, 모든 요청에 ​​대해 복잡한 SQL 쿼리를 실행하거나 사전에서 동일한 데이터 조각을 두 번 요청하면 나쁘다는 잔소리가 있습니다. 최적화 기술에 대한 지식이 유용한 곳이며 가장 놀라운 결론이 나올 것입니다.

코드의 성능을 거의 확실히 향상시키는 빠른 기술에 대해 알고 있다면 그렇게하지 마십시오.

지금 생각하면 5 분 후에 확실히 할 수 있습니다. 코드에서 (또는 // TODO주석으로) 코드를 유지하면 코드를 더 깔끔하게 유지하고 다른 기능을 수행하기 위해 이전 시간을 절약 할 수 있으며 나중에 해당 코드를 버리는 경우 시간을 낭비하지 않아도됩니다. 테스트 할 때 원래 코드가 성능 문제를 일으키는 것으로 판명되면 돌아가서 빠른 기술을 적용하십시오.

여기서는 더 빠르기 때문에 관용적 인 코드 작성을 피해야한다고 말하지 않습니다. 생산성과 가독성을 향상시키고 버그를 줄이는 모범 사례에 따라 관용적 코드를 작성하십시오. 관용적 인 책별 코드와 더 빠르고 쉽게 작성된 대안 중에서 선택할 수 있다면 항상 속도 대신 가독성을 찾으십시오.

유일한 어려운 상황은 코드 성능을 향상시킬 수있는 쉬운 방법이없는 것처럼 보이지만, 코드가 제공되는 즉시 코드 조각이 끊어 질 수 있다는 것은 매우 명백합니다. 사이트의 페이지 당 또는 유사하게 무서운 것 여기서 실제로 멈추고 더 생각해야 할 곳입니다. 일반적으로 로컬 규모로는 해결할 수없는 아키텍처 문제입니다. 빠른 스파이크 또는 프로토 타입으로 의심을 확인하고 유사한 경험과 일반적인 솔루션을 찾고 아키텍처 변경 또는 기능 저하를 고려하십시오.


0

IMHO 시스템을 구현하기 전에 성능에 대해 생각하고 생각 만하는 것이 중요합니다. 응용 프로그램을 분석하고 잠재적 성능 병목 현상이 발생할 수있는 사항을 찾아야합니다.

그런 다음 가능한 간단하게 시스템을 구현하십시오. 성능 문제가 발생하면 최적화하십시오.

예를 들어, 일종의 서비스 (SOAP, REST HTTP 등)를 통해 데이터를 가져 오는 GUI 클라이언트가 있다고 가정하십시오. 그런 다음 고성능 / 확장 성을 위해 가장 중요한 것은 가능한 한 적은 수의 통화를 갖는 것입니다. 각 통화마다 많은 정보를 반환하는 것이 아니라, 많은 통화는 각각 작은 정보를 반환합니다.

이런 종류의 시스템을 구현할 때 시스템 사이의 호출 수에 대해서는별로 신경 쓰지 않습니다. 그러나 코드베이스가 필요할 때 리팩토링 / 최적화를 쉽게 할 수 있도록해야합니다.


0

처음부터 성능을 매우 일반적인 방식으로 생각해야합니다. 애플리케이션에 적합하고 합리적으로 효율적인 데이터 구조와 알고리즘을 선택해야합니다. 알고리즘은 소프트웨어의 기본이며 데이터 구조는 더욱 그러합니다. 더 작은 세부 사항을보다 쉽게 ​​다시 작성할 수있는 동안 큰 변경을 수행해야하는 경우 크게 다시 작성해야 할 수 있습니다.

효율적인 습관을 원할 수도 있지만 언어에 따라 다릅니다. C ++에서 예를 들어 "++ i;" 독립형 명령문 또는 표현식은 항상 "i ++;"만큼 우수하며 잠재적으로 훨씬 더 효율적일 수 있습니다. 그러나 대부분의 경우 명확한 코드를 작성하고 컴파일러를 신뢰해야합니다. 미세 효율성에 대해 걱정하는 습관을들이는 것은 해결하는 것보다 더 많은 문제를 일으킬 것입니다. 데스크톱 응용 프로그램의 경우 컴파일러는 적어도 i >> 1vs. 와 같은 것보다 똑똑 i / 2하거나 성능을 향상시키는 가장 좋은 방법은 더 나은 컴파일러를 얻는 것이므로 걱정하지 마십시오.

그 외에도 테스트 할 수있는 것을 얻을 때까지 걱정하지 마십시오. 그 때 프로그램을 프로파일 링하여 핫스팟이있는 위치를 확인하고 성능 프로그램이 있는지 여부에 대한 아이디어를 얻을 수 있습니다. 성능을 개선해야하는 경우 프로그램이 대부분의 시간을 소비하는 위치를 찾아서 개선하십시오. 적절한 글로벌 효율성으로 디자인하고 프로그램을 잘 작성했다면 프로그램의 상대적으로 작은 부분 만 변경하는 것입니다.


0

나는 당신이 할 수있는 최선의 방법은 당신이 무언가를 얻을 때까지 좋은 디자인 관행을 따르는 것입니다 (예를 들어, 당신이 알고있는 것을 수행하지 마십시오). 개선을 측정 할 수 없으면 개선 할 수 없습니다. 테스트 할 수있는 것이 있으면 프로파일 링 실행을 수행하고 핫스팟 (있는 경우)이있는 위치에 대한 아이디어를 얻는 것이 좋습니다. 문제가 발생하면 문제 영역을 리팩토링하거나 다시 작성하는 것이 좋습니다.하지만 너무 나쁘지 않은 경우 (코드가 두세 가지 방법으로 90 %의 시간을 소비한다고해서 전체적으로 적절하게 수행되는 경우 아무런 의미가 없습니다) 그런 다음 계속 개발하십시오. 제가 한 번 이상 본 것은 시스템의 가장 복잡한 부분을 최적화하는 데 며칠을 소비하는 개발자입니다.


0

언제부터 생각해야합니까? 얼마나 많은 노력을 기울여야합니까? 프로젝트 의 Cockburn Scale 에 따라 다릅니다 . (즉, 성능이 좋지 않은 위험은 무엇입니까?)

기본 사항을 미리 배우십시오 (Robert Harvey의 답변 참조 ). 소프트웨어 개발의 다양한 단계에서 성과 지향적 사고를 적용하기 위해 개발자는이를 외부에서 알아야하므로 이러한 추가 고려 사항으로 인해 사고 프로세스가 방해받지 않습니다. 즉, 프로젝트가 계획되기 전에 성과에 대해 생각하기 시작하십시오.

개발 초기 단계에서 성능 프로파일 링 도구를 자유롭게 사용하고 통계 기록을 추적하십시오. 나중에 의사 결정에 유용한 정보를 구성하는 데 특별한주의를 기울이십시오.

그런 다음 프로젝트의 성격과 Cockburn Scale에 따라

  • 빠른 프로토 타이핑, 또는 "내일이없는 것처럼 코드를 쾅쾅"또는 비즈니스에 미치는 영향이 적은 자체 개발 : 통계를 유지하십시오. 아직 성능에 대해 생각하지 마십시오. 가장 쉬운 방법으로 기능을 구현하십시오. 당신의 마음에 오는 첫 번째 알고리즘을 고수하십시오.

    • 프로젝트 후반에는 실제 사용 사례를 기반으로 "핫스팟"을 식별하기위한 임시 성능 테스트가 진행됩니다. 소프트웨어를 사용할 수 없게 만드는 성능 문제가있는 경우 쉽게 식별 할 수 있어야합니다.
    • 비즈니스 영향이 적은 사내 개발의 경우 코드를 배포하고 나중에 성능 문제를 해결하십시오.
  • 일관되고 균형 잡힌 성능 접근 방식이 필요한 데스크탑 응용 프로그램. 고도로 최적화 될 필요는 없습니다. 그러나 가능한 한 "행지"(응답 없음)가 적어야합니다.

    • 데스크톱 응용 프로그램은 일반적으로 성능 중심적 사고를 복잡하게하는 매우 복잡한 실행 경로를 가지고 있습니다. 계층화 된 설계를 통해 데이터베이스 / 네트워크 성능 문제를 GUI 성능 문제와 분리 하여 팀의 여러 전문가 가 처리 할 수 ​​있습니다 .
    • 로그 추적 기록을 통해 핫스팟을 식별 할 수 있습니다.
  • 하드웨어에서 최고의 성능을 얻으려면 고성능 컴퓨팅이 필요합니다.

    • 팀에서 성과 통계를 분석하고보고 할 담당자를 지정하십시오.
    • 성능 특성에 대한 이론을 만들고 실험을 통해 검증하고 단순화 된 Comp Sci 모델의 예측과 비교하십시오.
    • *

0

처음에. 필요한 성능 특성을 식별하십시오. 대상을 식별 할 수없는 경우, 요구 사항을보다 잘 이해하기 위해 뒤로 물러나거나 다시 작성할 위험이있는 구성 요소 요구 사항을 알 때까지 연기해야합니다. 그런 다음 테스트하십시오. 최적화하지 말고 테스트하십시오. 코딩이 성능 테스트에 실패하면 최적화하십시오. 테스트 프레임 워크가 있으면 기존 성능 모니터링 도구를 사용하여 작업을 합리적으로 쉽게 수행 할 수 있습니다.

성능 테스트를 프로젝트 수명 동안 회귀 테스트로 유지하십시오. 유지 보수 코드는 '수정 사항'에 초점이 매우 좁기 때문에 성능 문제를 유발하는 것으로 유명합니다.


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