문제

나는 현재 고객을 위해 일하고 있습니다 석화 "성능 이유"로 인해 테스트 할 수없고 유지할 수없는 코드를 변경하는 것. 많은 오해가 있다는 것은 분명하며, 그 이유는 이해되지 않고 맹목적인 믿음으로 이어졌습니다.

내가 겪은 그러한 반포 반자 중 하나는 가능한 한 많은 수업을 표시해야한다는 것입니다. 내부 봉인...

*REEDIT : 나는 모든 것을 표시하는 것을 본다 봉인 조기 최적화로 내부 (C#).*

사람들이 알고 있거나 만날 수있는 다른 공연의 공연이 무엇인지 궁금합니다.

도움이 되었습니까?

해결책

내가 겪은 가장 큰 성능 방지는 다음과 같습니다.

  • 성능을 측정하지 않습니다 변경 전후.

성능 데이터를 수집하면 특정 기술이 성공했는지 여부가 표시됩니다. 그렇게하지 않으면 아무것도 바뀌지 않았을 때 누군가가 성능이 향상 된 "느낌"을 가지고 있기 때문에 꽤 쓸모없는 활동을 초래할 것입니다.

다른 팁

방에있는 코끼리 : 더 나은 알고리즘 대신 구현 수준 마이크로 최적화에 중점을 둡니다.

가변 재사용.

나는 선언에 몇 번의주기를 절약하고 메모리 발자국을 낮추고 있다고 생각하면서 항상 이것을했습니다. 이러한 절감 효과는 특히 코드 블록을 옮기고 시작 값에 대한 가정이 바뀌었을 때 특히 코드를 디버그 할 수있는 코드를 얼마나 무례하게 만들었는지에 비해 미미한 가치였습니다.

조기 성능 최적화 생각 나다. 나는 모든 비용으로 성과 최적화를 피하는 경향이 있으며, 내가 필요하다고 결정할 때 나는 우리가 OBFU를 올바른 장소에 놓기 위해 여러 라운드를 대학에 전달합니다.

내가 실행 한 것은 Ruleas의 의견에 언급 된 Jeff Atwood의 기사의 대화의 일종의 간단하게 만들기 위해 심각한 깨진 코드로 하드웨어를 던지는 것이 었습니다. 더 빠른 하드웨어에서 실행하여 최적화 된 알고리즘을 사용하여 기본적이고 올바른 알고리즘을 사용하는 종류의 속도의 차이에 대해 이야기하는 것이 아닙니다. A O (N Log N) 알고리즘이 표준 라이브러리에있을 때 분명히 올바른 홈 브루드 O (N^3) 알고리즘을 사용하는 것에 대해 이야기하고 있습니다. 프로그래머가 표준 라이브러리에 무엇이 있는지 알지 못하기 때문에 손 코딩 루틴과 같은 것들도 있습니다. 그 사람은 매우 실망 스럽습니다.

디자인 패턴을 사용하여 사용합니다.

  1. 함수 호출의 페널티를 피하기 위해 함수 대신 #defines를 사용합니다. 정의 확장이 거대하고 실제로 느린 코드를 생성하는 것으로 판명되는 코드를 보았습니다. 물론 디버그하는 것은 불가능했습니다. 인라인 기능은이 작업을 수행하는 방법이지만주의 해서도 사용해야합니다.

  2. 스위치 문에 사용할 수있는 단어의 독립 테스트가 비트로 변환 된 코드를 보았습니다. 스위치는 실제로 빠를 수 있지만 사람들이 일련의 독립 테스트를 비트 마스크로 바꾸고 약 256 개의 최적화 된 특수 케이스를 작성하기 시작하면 성능 이점을 제공한다는 벤치 마크가 더 좋습니다. 실제로 유지 보수 관점과 다른 테스트를 독립적으로 처리하면 코드가 훨씬 작아 성능에도 중요합니다.

명확한 프로그램 구조의 부족은 그들 중 가장 큰 코드 신호입니다. 거의 결코 빠르지 않은 것으로 여겨지는 복잡한 논리.

코드를 작성하는 동안 리팩터 또는 최적화하지 마십시오. 코드를 완료하기 전에 코드를 최적화하지 않는 것이 매우 중요합니다.

줄리안 버치는 한 번 나에게 말했다.

"그렇습니다.하지만 몇 년 동안 응용 프로그램을 실행하는 데 몇 년이 걸리는 개발자가 수행하는 데 소요되는 시간을 보충하는 데 실제로 필요합니까?"

그는 구현하는 데 주어진 시간이 걸리는 최적화에 의해 각 거래 중에 저장된 누적 시간을 언급하고있었습니다.

오래된 세이지의 현명한 말 ... 나는 종종 펑키 한 최적화를 고려할 때이 조언을 생각합니다. 현재 상태에서 코드를 다루는 데 얼마나 많은 개발자 시간이 소비되는지를 고려하여 동일한 개념을 조금 더 확장 할 수 있습니다. 원한다면 시간을 시간별 개발자와 사용자에 비해 가중시킬 수도 있습니다.

물론, 예를 들어, 전자 상거래 애플리케이션이 응답하는 데 1 초가 걸리면 1 초 동안 지루해지는 사용자로부터 약간의 돈을 잃게됩니다. 1 초를 구성하려면 구현해야합니다. 그리고 유지 최적화 된 코드. 최적화는 총 이익에 긍정적이고 순이익에 부정적인 영향을 미치므로 균형을 맞추기가 훨씬 어렵습니다. 좋은 통계로 시도 할 수 있습니다.

프로그래밍 언어 악용. Plsnakish 1.4에서는 IF/다른 대신 예외 처리와 같은 것들이 더 빠릅니다. 뭔지 맞춰봐? PLSNAKISH 1.8에서 언어 관리자가 문제를 해결했기 때문에 코드를 난독 화하고 훨씬 느리게 실행 되었기 때문에 2 년 후의 코드를 유지하는 누군가가 당신에게 정말로 화를 내게 될 것입니다. 예외 처리 트릭을 사용하는 것보다 10 배 빠릅니다. 일하다 ~와 함께 당신의 프로그래밍 언어와 프레임 워크!

한 번에 둘 이상의 변수를 변경합니다. 이것은 나를 절대적으로 이끌어냅니다 Bonkers! 하나 이상의 변경이 변경되었을 때 시스템에 대한 변화의 영향을 어떻게 결정할 수 있습니까?

이와 관련하여 관찰에 의해 보증되지 않는 변경을 수행합니다. 프로세스가 CPU 바운드가 아닌 경우 더 빠르게/더 CPU를 추가하는 이유는 무엇입니까?

일반 솔루션.

주어진 패턴/기술이 한 상황에서 더 잘 수행한다고해서 다른 상황에서 더 잘 수행한다고해서 다른 상황에서 더 잘 수행하는 것은 아닙니다.

.NET의 StringBuilder Over 사용은 이것의 빈번한 예입니다.

전 고객이 앱 속도를 높이는 것에 대한 조언을 구하는 모든 고객에게 전화를 걸었습니다.

그는 "x 점검, y를 확인한 다음 z를 확인한 다음 z를 확인한 다음 z"와 같은 것을 말하기 위해 전문가의 추측을 제공하기를 기대하는 것 같았습니다.

나는 당신이 문제를 진단해야한다고 대답했습니다. 내 추측은 다른 사람보다 덜 잘못되었을 수도 있지만 여전히 잘못되었으므로 실망 스러울 것입니다.

나는 그가 이해했다고 생각하지 않습니다.

일부 개발자는 빠르지만 확정되지 않은 솔루션이 느리게 수정 된 솔루션보다 바람직하다고 생각합니다. 따라서 그들은 생산에서 "결코 일어나지 않을 것"또는 "중요하지 않을 것"이라는 다양한 경계 조건이나 상황을 무시할 것입니다.

이것은 결코 좋은 생각이 아닙니다. 솔루션은 항상 "올바른"것이 필요합니다.

상황에 따라 "올바른"정의를 조정해야 할 수도 있습니다. 중요한 것은 당신이 어떤 조건에 대한 결과가 원하는 것을 정확히 알고/정의하고, 코드가 해당 결과를 제공한다는 것입니다.

Michael A Jackson은 성능 최적화를위한 두 가지 규칙을 제공합니다.

  1. 하지 마십시오.
  2. (전문가 전용) 아직하지 마십시오.

사람들이 성능에 대해 걱정한다면, 그것을 현실로 만들라고 말하십시오 - 좋은 성능은 무엇이며 어떻게 테스트합니까? 그런 다음 코드가 표준에 맞지 않으면 적어도 코드 작성자와 응용 프로그램 사용자가 동의하는 것입니다.

사람들이 Ossified Code (예 : 시간 싱크)를 다시 작성하는 비 성능 비용에 대해 걱정하는 경우 추정치를 제시하고 일정에서 수행 할 수 있음을 보여줍니다. 할 수 있다고 가정합니다.

나는 슈퍼 린 코드 "금속에 가까운"이 우아한 도메인 모델보다 더 성능이 있다는 것이 일반적인 신화라고 생각합니다.

이것은 Directx의 제작자/리드 개발자가 C ++ 버전을 크게 개선하여 작성한 것입니다. [출처 필수

C ++ stl에서 (예 : push_back ()를 사용하여 배열에 추가, ~ = d 등. 배열이 얼마나 큰지 미리적으로 예정되어있어 사전 할당 할 수있는 방법을 알고있을 때.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top