무엇을 최적화합니까? [닫은]


19

일반적으로 소프트웨어를 설계 할 때 일반적으로 어떤 유형의 최적화를 원하십니까?

디자인 최적화를 선호하는 유형입니까?

  • 개발 시간 (즉, 작성 및 / 또는 유지 관리가 더 쉬움)?
  • 처리 시간
  • 저장 공간 (RAM, DB, 디스크 등) 공간

물론 이것은 해결되는 문제 유형과 마감일에 매우 주관적이므로 한 가지 최적화 형식을 다른 형식보다 선택 해야하는 이유에 대해 듣고 싶습니다.


위의 세 가지 모두 일반 (일반적으로 유지 관리와 관련)을 던지고 싶습니다. 예를 들어 소프트웨어 요구에 광범위하게 적용 할 수있는 매우 효율적인 데이터 구조를 설계하고 철저히 테스트하는 데 시간이 걸리면 몇 년 동안 서비스를 제공 할 수 있으며 개인 문제 해결에 적합한 더 많은 데이터 구조를 작성하지 않아도됩니다. 문제.

답변:


40

유지

그런 다음 필요한 경우 프로파일 링하고 속도를 최적화하십시오. 최소한 지난 10 년 동안은 스토리지가 필요하지 않았습니다. 그 전에 나는했다.


8
+1, 처음부터 유지 관리 성을 최적화하면 나중에 필요한 경우 속도 나 스토리지를 최적화하는 것이 더 쉬울 것입니다.
Carson63000

처리 시간과 스토리지 를 최소한 고려해야 하므로 지나치게 과도한 접근 방식을 선택하지 마십시오.

@ Thorbjørn, 개발자 시간을 최적화하는 경우 아마도 주어진 언어로 읽기 / 쓰기가 더 쉬운 알고리즘을 선택했을 것입니다. 나중에 그리고 성능이 문제가되는 경우에만 @Tim이 말했듯이 프로파일 러를 선택하십시오.
Jason Whitehorn

@Jason, 나는 매우 동의하지 않습니다. 선택한 알고리즘의 성능 특성에 익숙해야 적합한 구현을 선택할 수 있습니다. 즉, 우편 번호를 찾는 데 주로 필요할 때 ArrayList를 선택하면 확장 성이 떨어질 수 있습니다.

1
@ Thorbjørn, 나는 당신과 동의하지 않습니다. 실제로, 나는 알고리즘에주의를 기울여야한다는 것이 정확하다고 생각합니다. 그러나 우리가 의견에서 다른 점은 내 생각에 선택할 알고리즘에 대한 아이디어는 경험을 통해 학습되고 문제가 발생할 때만 수정된다는 것입니다. 당신은 당신의 요점에 맞습니다. 코드를 구현하기 위해 읽기 어렵거나 오래 걸리는 비용으로 최적화해야 할 필요는 없습니다.
Jason Whitehorn

27

개발 시간

가공 및 보관이 저렴합니다. 당신의 시간은 아닙니다.

참고 사항 :

그렇다고 빨리 코드를 작성하기 위해 코드를 작성하는 일이 나쁜 것은 아닙니다. 빠른 개발을 용이하게하는 방식으로 코드를 작성하는 것을 의미합니다. 또한 전적으로 사용 사례에 따라 다릅니다. 문의 양식이있는 2 ~ 3 페이지의 웹 사이트 인 경우 PHP 프레임 워크를 사용할 필요가 없습니다. 포함과 메일러 스크립트가 몇 개 있으면 개발 속도가 빨라집니다. 대신 새로운 기능을 확장하고 추가 할 수있는 유연한 플랫폼을 만들 계획이라면 향후 개발 속도를 높이기 위해 적절히 배치하고 코드를 작성하는 데 시간을 투자 할 가치가 있습니다.

처리 시간 및 스토리지와 직접 비교할 때 더 빠른 개발 시간을 기대합니다. collectionutils 빼기 기능을 사용하는 것이 컬렉션을 빼는 가장 빠르고 효율적인 메모리 효율적인 방법입니까? 아니! 그러나 개발 시간이 더 빠릅니다. 성능이나 메모리 병목 현상이 발생하면 나중에 해결할 수 있습니다. 무엇을 최적화해야하는지 알기 전에 최적화하는 것은 시간 낭비 이며 이것이 내가 주장하는 것입니다.


4
무어의 법칙은 약 2 년 전에 끝났습니다. 동시성에 대해 생각하고 추가 코어를 사용하기 시작할 때입니다. 이것이 앞으로 저렴한 클록 사이클을 얻는 유일한 방법입니다.
Robert Harvey

3
정확히 말하자면, 무어의 법칙은 약 2 년마다 칩의 트랜지스터 수를 두 배로 늘림으로써 여전히 강력 해지고 있습니다. 이는 단일 다이에 여러 코어를 배치 할 수있게하는 것입니다. 끝 났던 것은 초당 증가하는 사이클 수의 '무료 점심'입니다.
Dominique McDonnell 5

1
"처리 및 저장 비용이 저렴합니다." CPU 캐시와 버스 속도는 다릅니다. 오늘날 주요 성능 병목 현상입니다.
mojuba

3
나는 이것에 전적으로 동의합니다. 읽을 수있는 코드를 유지 관리하고 작업에 적합한 도구를 사용하며 회사의 합의 된 표준을 준수하면 실제로 코드를 컴퓨터에 입력하는 데 소요되는 시간이 크게 줄어들어 회사에 많은 돈이 절약됩니다. 입력하는 것보다 엔지니어링에 더 많은 시간을 할애합니다.
Matt DiTrolio

1
@Bill : 또는 임베디드를 수행하는 경우 제한을 초과하여 제품 비용을 크게 올리면 제품 비용이 크게 증가 할 수 있습니다. 또는 서버 소프트웨어의 경우, 누군가가 Google 서버에서 처리를 1 % 개선 할 수 있다면 상당히 절약 할 수 있습니다.
David Thornley

12

사용자 경험.

이것이 고객에게 중요한 유일한 가치입니다.

개발 시간 은 덜 중요합니다. 완전한 기능을 갖춘 명령 줄 응용 프로그램을 GUI보다 훨씬 빠르게 작성할 수 있지만 Jane 부인이 원하는 보고서를 작성하는 방법을 알 수 없다면 쓸모가 없습니다.

유지 관리 는 덜 중요합니다. 시소를 정말 빨리 수리 할 수 ​​있지만 숲 한가운데에 있으면 사용자가 찾을 수 없습니다.

처리 시간 이 덜 중요합니다. 60 초 안에 0에서 가벼운 속도로가는 차를 만들면 사용자는 조종 할 수 없습니다.

미학 은 덜 중요합니다. 모나리자를 칠할 수 있지만 벽 뒤에 숨어 있으면 아무도 그녀를 볼 수 없습니다.

중요한 것은 사용자 경험입니다. 사용자가 원하는 방식으로 원하는 것을 정확하게 수행하는 응용 프로그램을 만드는 것이 궁극적 인 성과입니다.


미안 Joeri, 나는 약간의 편집에서 쫓겨났다.
Malfist

무언가를위한 커뮤니티 위키입니다. ;)
Joeri Sebrechts

8

최적화해야 할 것은 하나 뿐이며 다음과 같습니다.

고객이 원하는 것

고객에게 가장 빠른 프로그램이 필요하십니까? 속도를 최적화하십시오.

고객에게 절대적인 안정성이 필요합니까? 이를 위해 최적화하십시오.

내일 배달해야합니까 아니면 쓸모가 없습니까? 개발 속도를 최적화하십시오.

엄청나게 작은 리소스 제한 장치에서 실행하고 있습니까? 이러한 리소스를 최적화하십시오.


유일한 발견은 종종 그들이 원하는 것을 알지 못하거나 가능하거나 도움이되는 것에 대한 기대를 가지고 있다는 것입니다.
Tim Williscroft

1
그리고 일련의 객관식 질문을 받았을 때, 가장 자주 "예"를들을 것입니다 :-)
Jason Whitehorn

1
나는 쉽지 않다고 말하지 않았다. 그리고 적어도 당신이 묻는다면, 유용한 답변을 얻을 수있는 기회가 있습니다.
DJClayworth

5

처리 시간

내 사용자의 시간은 싸지 않습니다. 뿌린대로 거둔다.


작년에 사용한 애플리케이션을 방금 업그레이드했습니다. 그들은 앱을 완전히 다시 작성했으며 소년은 느 렸습니다. 나는 마침내 그것을 빨리 운영하기 위해 새로운 컴퓨터를 사야했다. 나는 그것이 싼 것이 아니라고 보증하지만 내 시간은 더 가치가 있습니다.


처리 시간이 기울어지면 흥미로워집니다. 어떤 유형의 응용 프로그램을 개발하려고하십니까? 나는 흥미 롭다.
Jason Whitehorn

1
많은 컴퓨터 에서 실행하는 경우 처리 시간이 중요 합니다. 예를 들어, 최적화를 위해 2 개월을 더 소비하거나 10,000 대의 PC를 새로운 하드웨어로 업그레이드하는 것 중에서 선택하는 경우, 개발자의 시간이 끝나지 않습니다 . 그러나 물론 타협입니다. 6 개 서버에서만 실행하는 경우 개발자의 시간이 그럴 가능성이 높습니다.
Dean Harding

1
@Jason, Excel 및 VBA를 사용하여 스프레드 시트 그룹에서 빠르게 작업하고 있습니다. 내 사용자는 다음 방에서 일하며 문제가 있는지 알려줍니다. 저의 관점은 30 년 동안 컴퓨터를 사용하는 것에서 비롯되며, 계속해서 응용 프로그램이 계속 부풀어 오르는 것을보고 업그레이드도 보상합니다. 개발자가 더 잘할 수 있다는 것을 알고 효율적인 코드를 작성하는 습관을 들여야합니다.

효율적인 코드의 경우 +10 특히 모듈 식 프로그래밍에서는 간과되는 경우가 너무 많습니다. 모든 모듈은 적당한 속도로 작동하지만 전체의 합은 엄청나게 느릴 수 있습니다.
Joris Meys

4

메모리 소비 및 할당을 제한하는 경향이 있습니다. 나는 그것이 오래된 학교라는 것을 알고 있지만 :

  • 내가 작성하는 비 투성 코드의 대부분은 크게 평행합니다. 이는 과도한 메모리 할당 및 가비지 콜렉션 활동이 병렬화 가능한 많은 코드를 직렬화한다는 것을 의미합니다. 또한 공유 메모리 버스에 대한 많은 경합이 있음을 의미합니다.
  • 내 주요 언어는 D이며 아직 64 비트를 제대로 지원하지 않습니다 (이것은 수정되고 있습니다).
  • 나는 상당히 큰 데이터 세트를 정기적으로 사용합니다.

bloatware를 방지하기 위해 노력 +1 메모리 호깅 프로그램은 잘못된 프로그램입니다.

메모리 호깅 프로그램은 64 비트 시스템에서 전체적으로 실행될 수 있습니다. 그것이 우리 앱 중 하나가 메모리 문제에 부딪쳤을 때 우리가 한 일입니다 (합법적으로 대량의 메모리를 사용합니다). 성능이 중요 할 때 첫 번째 글 머리 기호가 중요합니다.
David Thornley

2

효율성을 개발 시간, 향후 유지 관리 가능성, 사용자 경험 및 소비되는 리소스 간의 절충으로 정의하면서 효율성을 향해 최적화한다고 말하고 싶습니다. 개발자는 균형을 유지하기 위해이 모든 것을 저글링해야합니다.

그 균형을 어떻게 달성합니까? 먼저, 최종 기한, 응용 프로그램이 실행될 하드웨어 및 사용하는 사람의 유형과 같은 몇 가지 상수를 설정해야합니다. 이를 알지 못하면 올바른 균형을 잡고 필요한 곳의 우선 순위를 정할 수 없습니다.

예를 들어, 강력한 시스템에서 서버 응용 프로그램을 개발하는 경우 성능 효율성을 절충하여 최종 기한을 맞출 수 있습니다. 그러나 개발자가 사용자 입력에 빠르게 응답해야하는 응용 프로그램 (비디오 게임을 생각할 경우)의 경우 입력 루틴이 지연되지 않도록 입력 루틴의 우선 순위를 정해야합니다.


2

내가 사용하는 가상화 기술

512MB 이상의 RAM을 가진 시스템이 최첨단으로 여겨 졌던 시절을 기억하십니까? 나는 이전의 코드를 작성하는 데 하루를 보낸다.

주로 Xen 환경의 권한있는 도메인에서 실행되는 저수준 프로그램에서 작업합니다. 권한있는 도메인의 한도는 512MB이며 나머지 RAM은 고객이 사용할 수 있도록 남겨 둡니다. 권한있는 도메인을 단 하나의 CPU 코어로 제한하는 것도 일반적입니다.

그래서 여기에 새로운 $ 6k 서버에서 실행될 코드를 작성하고 있으며 각 프로그램은 100kb 할당 한도 내에서 (이상적으로) 작동하거나 동적 메모리 할당을 완전히 피해야합니다.

간결하게, 나는 다음을 위해 최적화한다.

  • 메모리 풋 프린트
  • 정렬 (내 코드의 대부분이 대부분의 시간을 소비하는 곳)

또한 잠금 대기, I / O 대기 또는 일반적인 대기 시간에 관해서는 매우 부지런해야합니다. 상당한 시간을 들여 기존의 비 블로킹 소켓 라이브러리를 개선하고보다 실용적인 잠금없는 프로그래밍 방법을 모색하고 있습니다.

저는 기술의 발전 으로 지난 달에 구입 한 시스템에서 15 년 전에했던 것처럼 코드를 작성하는 것이 약간 아이러니하다는 것을 알게되었습니다 .

임베디드 플랫폼을 사용하는 모든 사람에게 일반적이지만, 대부분의 경우 1GB 이상을 처리해야합니다. Jason이 지적했듯이 모바일 장치에서 실행할 프로그램을 작성할 때도 일반적입니다. 목록은 키오스크, 씬 클라이언트, 사진 프레임 등입니다.

하드웨어 제한으로 인해 실제로 소비하는 것을 신경 쓰지 않고 무언가를 만들 수있는 사람들과 프로그래머를 분리한다고 생각하기 시작했습니다. 나는 다양한 분야의 프로그래머들 사이에서 공유하는 상식의 집단 풀에 유형과 메모리 검사를 완전히 추상화하는 언어가 무엇인지 걱정합니다 (필요한 경우 저에게 투표하십시오).


1
메모리 풋 프린트 각도의 경우 +1 나는 당신이 다루고있는 특정 제약에 대해 코딩,하지만 젠에 대해 이야기 첫 번째 섹션을 제거하고 아이폰과 그 교체하고 난 당신이 :-) 어디에서 오는지 정확히 알 수 없어요
제이슨 와이트 혼

2

연구 결과

학업으로서, 내가 최적화 한 것을 공유해야한다고 생각했습니다. 이는 짧은 개발 시간을 최적화하는 것과는 다릅니다. 종종 연구 결과가 일부 연구 문제를 뒷받침 할 수 있지만, 전달 가능하고 세련된 제품이 아닐 수도 있습니다. 이것은 품질의 문제로 여겨 질 수 있으며, 많은 사람들이 (학계) 컴퓨터 과학자들이 "실제"경험이 없다고 말하는 이유를 설명 할 수 있습니다. (예 : "다른 방법으로 제공 가능한 제품을 개발하는 방법을 알지 못했습니까?" )

괜찮습니다. 임팩트 측면에서 다른 사람들이 자신의 작업을 사용하고 인용하기를 원하며 Joel의 빙산 효과 가 시작됩니다. 약간의 광택과 빛이 먼 길을 갈 수 있습니다. 그러나 다른 프로젝트를 기반으로하지 않으면 배달 가능한 제품을 만드는 데 소비 된 시간을 정당화하지 못할 수도 있습니다.


1
  1. 디자인
    • 저 커플 링, 모듈 식
    • 간결하고 잘 정의 된 기능 영역
    • 잘 기록 된
    • 부스러기에 대한 지속적인 리팩터링
  2. 유지 보수
    • 재현 가능한 빌드 및 디버그
    • 단위 테스트
    • 회귀 테스트
    • 소스 컨트롤

... 그 후에 다른 모든 것

... 마지막으로 성능 최적화 ;-)


1

품질 / 테스트

개발 일정에 테스트를위한 시간, 단위 테스트 및 기능 / 단계별 테스트가 모두 포함되도록 품질을 최적화하십시오.


1

프로그램의 필요에 따라 다릅니다.

내가하는 일의 대부분은 처리 기능과 메모리에 의해 크게 제한되지만 평균 연도에 많은 변화가 발생하지는 않습니다.

과거에는 코드가 자주 변경되는 프로젝트에서 작업했기 때문에 유지 관리 성이 더 중요해졌습니다.

또한 과거에는 스토리지의 디스크에서도 데이터의 양이 가장 중요한 문제인 시스템에서 작업했지만 데이터를 전체적으로 또는 느리게 이동해야 할 때 크기가 더 문제가됩니다. 링크.


1

우아함 .

코드가 잘 설계되어 있으면 몇 가지 효과가 있습니다.

  1. 유지 관리가 쉬워 질 것입니다 (고객 비용 절감)
  2. JIT 또는 전체 컴파일러의 경우 더 쉽게 최적화 할 수 있습니다.
  3. 교체하기가 더 쉬울 것입니다 (더 나은 솔루션을 생각할 때)


0

IBM 메인 프레임에서 PC에 이르는 모든 유형의 시스템에 설치하기 때문에 먼저 호환성, 크기, 속도를 최적화합니다.


0

때에 따라 다르지

실시간 임베디드 비디오 처리 시스템에서 작업하는 경우 처리 속도를 최적화합니다. 워드 프로세서로 작업하는 경우 개발 시간을 최적화합니다.

그러나 모든 경우에 코드가 작동해야하며 유지 관리가 가능해야합니다.


0

내 의도의 표현력.

내 코드를 읽는 사람이 도메인에서 호출하려는 작업을 쉽게 볼 수 있기를 바랍니다. 마찬가지로 스캔을 쉽게하기 위해 의미가 아닌 정크 (중괄호, js의 'function'키워드 등)를 최소화하려고합니다.

물론 유지 관리 성을 통해 균형을 유지해야합니다. 나는 함수와 모든 종류의 고급 기술을 반환하는 함수를 작성하는 것을 좋아하고 내 목표를 더 나아가지만, 이점이 적 으면 견고한 JR 프로그래머가 익숙 할 기술을 고수하는 측면에서 실수를 저지를 것입니다.


-6

그들 모두

처리 시간

오늘날의 컴퓨터는 빠르지 만 충분하지 않습니다. 스트리밍 미디어 서버를 사용하는 경우 성능이 중요한 여러 가지 상황이 있습니다.

저장

고객에게 1TB의 큰 디스크가있을 수 있습니다. 충분히 멀리 떨어져있는 서비스를 원한다면 1000 HD 영화로 찍을 수있는 것은 무엇입니까?

개발 시간

글쎄요, 이것이 "최적화"라고 생각하는지 모르겠습니다. 제가하는 일은 C ++ 대신 Java를 사용하고 개발 속도가 10 배 빨라집니다. 앞으로 완전히 바위!

BTW 개발 속도를 높이기 위해 개발 프로세스를 단축해야한다고 생각합니다. 자바를 선택해야합니다. 파이썬과 같은 쓰레기를 사용하지 마십시오 .DEV 시간을 단축 할 수 있다고 주장합니다.


이 읽기 흥미를 찾을 수 있습니다 paulgraham.com/avg.html를 - 그것은 프로그래밍 언어의 힘에 대해 설명합니다.

3
제한된 시간과 예산으로 모든 시간을 소비 할 수는 없습니다. 우선 순위가 있어야합니다.
JBR 윌킨슨

@JRBWilkinson 글쎄요, 사례가되어야합니다
tactoth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.