크고 복잡한 소프트웨어 제품을 느리게 만드는 것은 무엇입니까? [닫은]


16

크게 관련이없는 이유로, 나는 오랫동안 Delphi 7을 다시 한번 설치했습니다. 나는 한동안 말하지 않은 방식으로 완전히 날아갔습니다. 이것은 내가 물건을 전혀 기억하는 방법이 아닙니다. 설치하는 데 약 30 초가 걸렸습니다. 발사하는데 2 초가 걸렸으며 즉시 사용할 수있었습니다. 시작한 후 두 번째로 "실행"을 누를 수 있으며, 1 초 미만 후에 빈 프로그램이 이미 표시되어 실행 중입니다. 컴퓨터가 점점 빨라지고 있습니다!

그러나 내가 이렇게 날아간 이유는 일반적으로 Visual Studio 2010을 사용하기 때문입니다. 부여, 델파이 7은 비주얼 스튜디오 2010에 비해 훨씬 작은 시스템이지만, 가지고 모양 이 모두 정말 필요한 일을 갖는 : 제어 팔레트, 폼 디자이너, 코드 완성과 코드 편집기를. 언어가 더 간단하고 코드 완성이 훨씬 강력하지 않으며 IDE가 확장 가능하고 기능이 풍부하지는 않지만 여전히 (메카니즘을 통해) 어떻게 작동하는지 이해하지 못합니다. 많은 추가 기능 (아직 트리거하지 않았을 수도 있음)으로 인해 Visual Studio와 같은 시스템은 항상 느리게 느껴집니다.

시스템 작업 경험이있는 사람들에게 Visual Studio의 규모를 물어보고 싶습니다. 속도를 늦추는 것은 무엇입니까? 인간의 이해 능력 내에서 코드베이스를 유지하는 데 필요한 추상화 계층의 계층입니까? 실행해야하는 코드의 양입니까? 클럭 사이클 / 메모리 사용 부서에서 (마음이 큰) 비용으로 프로그래머 시간 절약 방식에 대한 현대적인 경향입니까?


7
단순성 : 질량이 증가함에 따라 관성을 극복하기 위해 더 많은 힘이 필요합니다.
Shog9

누군가가 한 번 관리자에게 말했지만 전혀 믿지 않습니다.
MIchael Grassman

1
이것이 필자가 여전히 델파이 프로그래밍에 D7을 주로 사용하는 이유의 큰 부분입니다.
GrandmasterB

가장 빠른 코드는 실행되지 않는 코드입니다.
Henry

4
@romkyns : 현대 시대에 많은 소프트웨어가 종종 부풀어 오르고 불필요하게 크고 불분명하다는 것을 알았습니다. 많은 소프트웨어가 이제 20 년 전이나 심지어 20 년 전에 해결 된 것과 동일한 문제를 일부 전력과 공간으로 해결합니다. 더 이상 그렇지 않더라도 왜 여전히 이전보다 심하게 지연됩니까? 비효율과 팽창.
Orbling

답변:


20

건축 우주

Visual Studio 2010은 Windows Presentation Foundation을 기반으로합니다. WPF 의 Button 클래스 를 살펴보십시오 . 기본 수업의 9 번째 자녀입니다. 약 5 페이지의 속성, 메서드 및 이벤트가 있습니다. 장면 뒤에는 아름답게 둥근 모서리와 마우스 커서가 움직일 때 미묘한 애니메이션 전환을 설명하는 또 다른 5 페이지의 스타일 정의가 있습니다. 이것은 기본적으로 일부 텍스트 또는 그림을 표시하고 마우스 버튼이 내려가는 것을 감지하면 클릭 이벤트를 생성하는 것입니다.

임의의 지점에서 Visual Studio와 같은 프로그램을 중지하십시오. 스택 추적을보십시오. 호출 스택의 깊이가 20 레벨이고 5 개의 DLL이로드되어있을 가능성이 매우 높습니다.

이제이 두 가지를 델파이와 비교하십시오. 델파이 버튼에는 20 개의 속성, 메소드 및 이벤트가 있습니다. Delphi IDE에는 5-7 레벨 깊이의 스택 추적 만 있습니다. 컴퓨터가 느릴 때 IDE를 시작하는 데 40 분이 걸리지 않으면 Visual Studio 2010의 오버 헤드를 사용할 수 없었습니다.

하나는 다른 것보다 낫습니까? 글쎄, 나는 일반적으로 델파이 프로그램이 평평하게 보이고 색상이 뮤트되어 (8 비트?), 미묘한 음영이나 애니메이션이 없기 때문에로드 할 때 알 수 있습니다. 나는 요즘 '저렴한'느낌. 싸지 만 빠릅니다.

우리는 더 나아 졌습니까? 그것은 코더가 아닌 철학자들에게 질문입니다.


4
델파이 프로그램은 평평하게 보이지 않습니다. 오히려 프로그래머 는 평평하게 보이도록 프로그램 을 프로그래밍 합니다 . C # 또는 C ++에서와 마찬가지로 Delphi로 멋지고 현대적인 풀 컬러 인터페이스를 만들 수 있습니다.
GrandmasterB

2
이것은 통찰력있는 답변입니다. 그러나 나는 그것이 확실하지 않다. Visual Studio 2008 (2010 이전 버전)에는 WPF가 없으며 여전히 Delphi 7보다 속도가 느립니다. 호출 스택 깊이와로드 된 DLL 수에 대해 여전히 같은 말을 하시겠습니까?
Timwi

3
@Timwi 네, 물론입니다. 필자의 요점은 WPF의 악에 관한 것이 아니라 (실제로 WPF를 좋아한다) 선택이 주어 졌을 때 소프트웨어 추상화 계층에 계층을 추가하는 방법에 대한 것이다. 아마도 Visual Studio 2008은 오버 헤드가 많지 않았지만 충분히 언급했듯이 :-)
Jay Beavers

@GrandmasterB, 나는 가정이 적고 라이브러리가 간단하기 때문에 Delphi를 비난하지 않습니다. WPF는 GPU 하드웨어 가속이 더 깊은 색상, 빈번한 애니메이션, 알파 블렌딩, 그림자 등을 사용할 수 있다고 가정하여 설계되었습니다. 델파이는 이러한 가정을 할 수 없었던 시점에 설계되었습니다. 이 모든 것을 델파이에서 다시 구현할 수 있습니까? 물론 WPF 버튼의 동작을 얻으려면 많은 코딩을해야합니다. 또한 델파이 버튼에는 CPU, 메모리 및 GPU 요구 사항이 포함되어 있지 않으며 WPF 버튼에는 @OP의 질문 중 하나가 있습니다.
Jay Beavers

10
플랫 및 일반 UI에 대한 귀하의 주장은 Windows 10의 새로운 'Modern'UI에 의해 완전히 무효화됩니다. 이제 우리는 30 년 전과 마찬가지로 평평하고 정사각형의 일반 버튼을 만들기 위해 모든 오버 헤드를 갖습니다.
gbjbaanb

11

시스템 작업 경험이있는 사람들에게 Visual Studio의 규모를 물어보고 싶습니다. 속도를 늦추는 것은 무엇입니까? 인간의 이해 능력 내에서 코드베이스를 유지하는 데 필요한 추상화 계층의 계층입니까? 실행해야하는 코드의 양입니까? 클럭 사이클 / 메모리 사용 부서에서 (마음이 큰) 비용으로 프로그래머 시간 절약 방식에 대한 현대적인 경향입니까?

나는 당신이 그중 많은 것을 추측했다고 생각하지만 상당히 큰 코드베이스에서 작업 한 가장 큰 요인으로 생각하고 싶습니다 (Visual Studio만큼 큰지 확실하지 않습니다-수백만 줄의 코드에 있음) 약 10 년 동안 카테고리 및 약 1,000 개의 플러그인)을 관찰하고 현상을 관찰합니다.

API 나 언어 기능 또는 이와 유사한 것에 빠지지 않기 때문에 논란의 여지가 적습니다. 그것들은 "지출"보다는 토론을 낳을 수있는 "비용"과 관련이 있으며, "지출"에 집중하고 싶습니다.

느슨한 조정 및 레거시

내가 관찰 한 것은 느슨한 조정과 긴 유산은 많은 축적 된 폐기물을 초래하는 경향이 있다는 것입니다.

예를 들어,이 코드베이스에서 약 100 개의 가속 구조를 발견했는데, 그중 다수는 중복입니다.

우리는 하나의 물리 엔진을 가속화하기위한 KD 트리를 원했고, 다른 하나는 종종 오래된 것과 병렬로 실행되는 새로운 물리 엔진을 위해, 또 다른 메시 알고리즘을위한 수십 개의 옥트리 구현, 렌더링을위한 또 다른 KD 트리를 가지고있었습니다. , 피킹 등 등등. 이들은 모두 검색을 가속화하는 데 사용되는 크고 부피가 큰 트리 구조입니다. 각각의 개인은 평균 크기의 입력을 위해 수백 메가 바이트에서 기가 바이트의 메모리를 사용할 수 있습니다. 항상 인스턴스화되어 사용되는 것은 아니지만 주어진 시간에 4 개 또는 5 개가 동시에 메모리에있을 수 있습니다.

이제 이들 모두는 동일한 데이터를 저장하여 검색 속도를 높였습니다. 모든 필드를 한 번에 20 개의 서로 다른 중복 맵 / 사전 / B + 트리에 저장하고 동일한 키로 동일하게 구성하고 항상 모든 필드를 검색하는 유사 오래된 데이터베이스와 같이 상상할 수 있습니다. 지금 우리는 20 배의 메모리와 처리를하고 있습니다.

또한 이중화로 인해 유지 보수 가격표를 사용하여 이들 중 하나를 최적화 할 시간이 거의 없으며, 그렇게해도 이상적인 효과의 5 % 만 가질 수 있습니다.

이 현상의 원인은 무엇입니까? 느슨한 조정은 내가 본 가장 큰 원인이었습니다. 많은 팀원이 종종 고립 된 생태계에서 일하면서 제 3 자 데이터 구조를 개발하거나 사용하지만 다른 팀 구성원이 동일한 우려 사항을 똑같이 명백하게 복제하더라도 동일한 구조를 사용하지는 않습니다.

이 현상이 지속되는 원인은 무엇입니까? 레거시와 호환성은 내가 본 가장 큰 원인이었습니다. 우리는 이미 이러한 데이터 구조를 구현하는 비용을 지불했으며 많은 양의 코드가 이러한 솔루션에 의존하기 때문에 데이터 구조를 더 적은 수의 데이터 구조로 통합하는 것은 너무 위험했습니다. 이러한 많은 데이터 구조는 개념 상 중복성이 높았지만 인터페이스 디자인에서 항상 동일한 위치에있는 것은 아닙니다. 따라서 메모리와 처리 시간을 소비하게하는 것과는 대조적으로 그것들을 교체하는 것은 크고 위험한 변화였습니다.

메모리 효율

일반적으로 메모리 사용 및 속도는 최소한 벌크 레벨에서 관련되는 경향이 있습니다. 메모리가 많이 소모되는 방식으로 느린 소프트웨어를 발견 할 수 있습니다. 그것은 아니다 항상 어떤 중요한 것은 모든 시간을 액세스하는 것을 메모리 "핫"메모리 (이후, 경기 둔화에 더 많은 메모리 리드 진정한 - 프로그램이 메모리의 적재량을 사용하지만 그것의 1메가바이트 모두를 사용중인 경우 시간이 지나면 속도가 그렇게 큰 문제는 아닙니다).

따라서 많은 시간 동안 메모리 사용량을 기반으로 잠재적 호그를 발견 할 수 있습니다. 응용 프로그램을 시작할 때 수백에서 수백 메가 바이트의 메모리가 필요한 경우에는 그다지 효율적이지 않을 것입니다. 요즘 기가 바이트의 DRAM을 사용하면 수십 메가 바이트가 작게 보일 수 있지만 가장 크고 느린 CPU 캐시는 여전히 메가 바이트 범위에 있으며 가장 빠른 속도는 여전히 킬로바이트 범위에 있습니다. 결과적으로, 시작하고 아무것도하지 않고 20MB를 사용하는 프로그램은 실제로 하드웨어 CPU 캐시 관점에서 실제로 "많은"메모리를 사용하고 있습니다. 특히 해당 메모리의 모든 20MB가 반복적으로 액세스 될 경우 프로그램이 실행되는 동안 자주.

해결책

나에게 해결책은 제품을 만들기 위해보다 조율 된 소규모 팀을 찾는 것인데, "지출"을 추적하고 같은 품목을 계속해서 "구매"하는 것을 피할 수있는 팀을 찾는 것이다.

비용

나는 내가 관찰 한 "지출"현상과 함께 좀 더 논란이 많은 "비용"측면에 대해 조금만 언급 할 것이다. 언어에 객체에 대한 불가피한 가격표 (예 : 런타임 리플렉션을 제공하고 일련의 객체에 대해 연속적인 할당을 강제 할 수없는 가격표)가있는 경우 해당 가격표는 단일 Pixel또는 Boolean.

그러나 그 정도의 세분화 된 수준으로 그 비용을 지불 하는 무거운로드 (예 : 수십만에서 수백만 Pixel또는 Boolean인스턴스 처리)를 처리하는 프로그램에 대한 많은 소스 코드가 있습니다 .

객체 지향 프로그래밍은 그것을 악화시킬 수 있습니다. 그러나 그것은 "오브젝트"자체의 비용이 아니거나 심지어 OOP의 결함이 아니라, 단순히 그러한 비용이 수백만에 의해 인스턴스화 될 조그마한 요소의 세분화 된 수준으로 지불되고 있다는 것입니다.

이것이 제가 관찰하고있는 다른 "비용"과 "지출"현상입니다. 비용은 페니이지만, 대량 구매를 위해 제조업체와 협상하는 대신 백만 캔의 음료수를 개별적으로 구매하는 경우 페니가 추가됩니다.

나에게 해결책은 "대량"구매입니다. 소다 캔에 해당하는 유사체에 대해이 비용이 개별적으로 백만 배 이상 지불되지 않는 한, 각각에 대해 가격이 책정되어 있습니다.

조기 최적화

"초기 최적화"로 인해 실제 제작 프로그램이 더 빨리 진행되는 경우는 드물기 때문에 여기에 사용 된 단어 Knuth를 좋아하지 않았습니다. 일부는 Knuth가 "소프트웨어에 미치는 실제 영향을 알기 위해 적절한 지식 / 경험없이 최적화하는 것"과 같은 의미 일 때 "조기 최적화"로 해석합니다. 유지 관리 성이 저하되면 중요한 경로를 실제로 최적화 할 시간이 거의 없기 때문에 진정한 조기 최적화의 실질적인 효과로 인해 소프트웨어 속도가 느려지 는 경우가 많습니다 .

이것이 내가 관찰 한 마지막 현상인데, 개발자가 소다 캔 1 개를 구매할 때 동전을 구하기 위해, 다시는 집을 사거나 더 나쁜 집을 구입하지 않아도 페니를 꼬집어 다니는 시간을 낭비하고있었습니다. 다른 곳에서 낭비하는 수십억 달러가 있었을 때 컴파일러 또는 하드웨어 아키텍처를 이해하지 못했습니다.

시간이 매우 한정되어 있으므로 상황에 맞는 적절한 정보를 얻지 않고 절대 값을 최적화하려고하면 실제로 중요한 장소를 최적화 할 수있는 기회를 종종 빼앗기 게되므로 실질적인 효과 측면에서 "초기 최적화를하면 소프트웨어 속도가 훨씬 느려집니다. "

문제는 위에서 객체에 대해 작성한 것을 취하고 객체 지향 프로그래밍 또는 그러한 종류의 미친 것을 금지하는 코딩 표준을 설정하려고하는 개발자 유형이 있다는 것입니다. 효과적인 최적화는 효과적인 우선 순위이며, 유지 관리 문제가 발생하면 절대 가치가 없습니다.


2
다시 말해 기술 부채입니다. 결코 갚지 않는 기술 부채.
Robert Harvey

1
로버트가 맞습니다. 한 사람의 실수, --force관리자가 수백 가지의 실수 d를 내일까지 구현하지 않으면 해고 될 것입니다. 수년간의 훌륭한 소프트웨어 엔지니어링 사례, TDD, 단위 테스트 및 인간과 제정신 프로그래밍 원칙을 날려 버립니다. , 그리고 두 번 더 피곤했다.. 그는 이유없이 해고되어 코드베이스를 엉망으로 인해 회사를 떠나게 한 그 남자. 당신은 결코 업데이트하지 않은 라이브러리를 중단했다. 부풀어 오른 소프트웨어. Bon
appetit

2
특히 세분성이 과도하게 잘못 사용 된 방법에 관심이 있습니다. 나는 과거에 때때로 비슷한 일을하고 있었고 그 결과 성능이 떨어졌습니다. 이것은 며칠 전에 과도한 세분성보다 컬렉션과 벌크 알고리즘을 선호한다는 답변 과 매우 비슷합니다 . 나는 그 답에 대한 답이 더 높이 평가되지 않았다고 믿을 수 없다. 그것은 내가 수년 동안 쌓아온 여러 디자인들을 다시 생각하게합니다. 왜 이러한 기술이 더 널리 홍보되지 않는지 궁금합니다.
Mike는 Monica를 지원함

2
@ 마이크로 나는 데이터 지향적 인 사고 방식을 홍보하려고 할 때 약간의 기록이 깨졌습니다. 하드웨어의 모든 인치를 활용하려는 게임 산업에서 인기가 있습니다. 즉, 유연성을 분명히 줄입니다. 추상 픽셀 클래스가 있다면 둘 이상의 서로 다른 픽셀 형식을 혼합하는 단일 이미지를 갖는 것과 같은 미친 일을 할 수 있습니다! 그러나 중요한 경로를 다룰 때 이미지가 그 정도의 유연성에서 혜택을 얻지 못할 것이므로 성능은 이미지 및 픽셀과 관련된 모든 것이 실제로 문제가되기 시작합니다.

1
나쁜 옛날에는 그래픽 API를 우회하고 중요한 코드 조각을 위해 메모리의 픽셀에 직접 액세스하는 코드를 구현했습니다. 많은 추상화 계층과 직접 액세스의 차이점은 100x와 같았으며 그 당시 컴퓨터에서 중요했습니다. 이제 컴퓨터는 필요한만큼 많은 추상화를 훑어 볼 수있을 정도로 빠릅니다.
Michael Shopsin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.