2014-10-31 3 views
2

에서 가장 효율적인 유형 here내장 타입 효율

... 부동 소수점 숫자를 저장하는 객체를 정의 할 때, 이중 유형을 사용하는 두 번째을 ... 이중 유형입니다 플로트 타입보다 2 ~ 3 배 정도 덜 효율적입니다 ...

자체가 모순되는 것처럼 보입니까?

그리고 int를 포함하는 계산이 연산을 수행하기 위해 int로 변환 되었기 때문에 많은 컴퓨터에서 단락보다 빠르다는 것을 다른 곳 (어디에서 기억할 수 있습니까?)에서 읽었습니까? 사실입니까? 이것에 대한 링크가 있습니까?

+4

필요하다고 판단 할 때까지 코드를 미세 최적화하지 마십시오. 현대 건축물의 차이점은 무시할 수 있습니다. – clcto

+2

당신이 정말로 중요 할 경우 - 실제로는 그렇지 않을 것입니다 - 당신이 정말로 목표로 삼고있는 실제 하드웨어에서 이러한 것들을 벤치마킹해야합니다. – 5gon12eder

+0

또한 참조를 잘못 인용하고 있습니다 : * "[...] 부동 소수점 숫자를 저장할 객체를 정의 할 때'long double' 유형이 필요할 때를 제외하고는'double' 유형을 사용하십시오. 결과 집계 객체가 중간 크기 또는 큰 크기 인 경우 더 큰 정밀도가 필요한 경우를 제외하고 [...] 부동 소수점 유형을 'float'유형으로 바꿉니다. * – 5gon12eder

답변

5

링크하는 사이트에서 콘텐츠의 품질에 대해 항상 논쟁 할 수 있습니다.

... 부동 소수점 숫자를 저장하는 객체를 정의 할 때, 이중 유형을 사용 ...

:하지만 두 따옴표는 당신이 참조 ... double 형은 float 형보다 2 ~ 3 배 효율적이지 않습니다 ...

는 성능에 대한 다른 이야기하면서, 증가로 인한 정밀도로 다른 두 가지, 복식을 사용하면 훨씬 적은 문제를 줄 것이다 첫 번째 힌트를 참조하십시오. 그러나 솔직히 나는 그것에 너무 많은 관심을 기울이지 않을 것이고, 기회가 당신의 코드가 차선책으로 수행된다면 그것은 원시 데이터 타입의 잘못된 선택 이라기보다는 잘못된 알고리즘 선택 때문일 것입니다.

다음은 저의 오래된 교사 중 한 사람과 단수 및 배정도 부동 소수점의 성능 비교에 대한 인용입니다. 자신의 웹 사이트에서 많은 재미있는 독서가있는 Agner Fog : 소프트웨어 최적화에 대해 http://www.agner.org에 관심이있는 경우 마이크로 최적화를 살펴보십시오.

대부분의 경우 배정 밀도 계산에는 단 정밀도 이상의 시간이 필요하지 않습니다. 부동 소수점 레지스터를 사용할 때 단 정밀도와 배정 밀도 사이에는 속도 차이가 없습니다. 긴 배정 밀도는 시간이 약간 걸립니다. XMM 레지스터를 사용할 때는 단 정밀도, 제곱근 및 수학 함수가 배정도보다 빠르게 계산되지만 추가, 빼기, 곱셈 등의 속도는 대부분 프로세서의 정밀도와 관계없이 여전히 동일합니다 (벡터 연산이 아닌 경우). 익숙한).

소스 :http://agner.org/optimize/optimizing_cpp.pdf

다른 컴파일러 다른 유사하고, 서로 다른 프로세서가있을 수도 있지만, 하나는 그것에서 배워야 할 교훈은, 가장 가능성이 당신의 최적화에 대해 걱정할 필요가 없다는 것입니다 이 수준은 알고리즘의 선택, 원시 데이터 유형이 아닌 데이터 컨테이너조차도 고려해야합니다.

+0

예. 잘못된 알고리즘을 선택하면 (즉, 간단합니다!) 번개가 빠른 것에서부터 우주의 열사병이 끝나기 전에 성능이 쉽게 떨어집니다. 그리고 그것은 비교에서 거대하게 크기가 큰 유형을 사용하는 올바른 알고리즘입니다. – Deduplicator

+0

내 프랙탈 코드에서 한 번에 하나의 수레를 사용하여 AVX 또는 8 픽셀을 사용하여 4 픽셀을 한 번에 처리합니다. 단일 플로트 방법은 약 두 배 빠릅니다. –

4

이러한 최적화는 우주 왕복선 발사 소프트웨어를 작성하지 않는 한 무시할 수 있습니다. 정확함 코드가 보다 빠르며 코드보다 훨씬 중요합니다. 정밀도가 필요한 경우 double을 사용하면 런타임에 거의 영향을 미치지 않습니다. 방법이 더 유형 정의보다 실행 시간에 영향을

것들 :

  1. 복잡성을 - 할이 더 많은 일, 더 천천히 코드가 실행됩니다. 필요한 작업량을 줄이거 나 작고 빠른 작업으로 나눕니다.

  2. 반복 - 반복은 피할 수 있으며 필연적으로 코드 성능을 저하시킵니다. 예를 들어 값 비싼 계산이나 원격 프로 시저 호출의 결과를 캐시하지 못하는 경우가 많습니다. 재 계산할 때마다 효율성을 낭비합니다. 또한 실행 파일 크기를 확장합니다.

  3. 나쁜 디자인 - 자체 설명. 코드를 작성하기 전에 생각하십시오!

  4. 입출력 - 입력 또는 출력 (사용자, 디스크 또는 네트워크 연결)의 실행을 기다리는 동안 실행이 차단 된 프로그램이 잘못 수행 될 수 있습니다.

더 많은 이유가 있지만 가장 큰 이유가 있습니다. 개인적으로 나쁜 디자인은 대부분의 일이 일어난 곳입니다. stateless 일 수있는 상태 머신, static이 좋았던 동적 할당 등이 실제 문제입니다.

+0

그 이상으로, 복식은 항상 더 느립니다. 경우에 따라서는 더 많은 메모리가 필요하고 일반적으로 두 배나 많은 데이터를 읽거나 쓰려면 일반적으로 항상 두 배의 시간이 걸리기 때문에 문제가 발생합니다. 그러나 미가공 계산의 경우 런타임을 몇 % 이상 변경하지 못할 수도 있습니다. – StilesCrisis

+0

정확하고 빠른 코드가 더 좋습니다. – UpAndAdam

+1

@UpAndAdam 정확하고 빠르고 빠릅니다. 둘을 골라. – Deduplicator

4

double의 실제 CPU (또는 원하는 경우 FPU) 성능은 현대 CPU의 절반 속도와 동일한 속도 사이의 어딘가에 있습니다 [예를 들어 더하기 또는 빼기는 아마도 같은 속도입니다. 곱셈 또는 나눗셈은 큰 유형과 다른 경우]와 비교했을 때 float입니다.

그 외에도 "캐시 라인 당"이 적기 때문에 많은 수가있는 경우 메모리 속도가 느리기 때문에 여전히 느려집니다. 캐시 라인 당, 응용 프로그램이 완전히 메모리 바운드 인 경우 성능의 약 절반이>double 값의 절반입니다. CPU에 바운드 된 응용 프로그램에서는 훨씬 적은 요소가됩니다.

비슷하게 SSE 또는 유사한 SIMD 기술을 사용하는 경우 double은 두 배의 공간을 차지하므로 실제 명령어 수는 "명령어 당"절반이되며 일반적으로 CPU는 동일한 floatdouble에 대한 사이클 당 명령어 수 - double에 오랜 시간이 소요되는 일부 작업은 제외됩니다. 다시 말하지만 성능이 절반 정도입니다.

그래, 나는 링크의 페이지가 doublefloat 사이의 이상적인 성능 설정을 혼란스럽게 만들고 혼란스럽게한다고 생각합니다. 즉, 순수한 성능 관점에서 말입니다. float을 사용할 때 눈에 띄는 계산 오류를 얻는 것이 훨씬 쉽습니다. 추적하려면 고통이 될 수 있습니다. 따라서 성능 문제로 확인했기 때문에 으로 시작하여 float으로 전환하는 것이 좋습니다 (경험 또는 측정 중 하나임).).

그리고 네, 하나 개의 크기 정수가 존재하는 여러 아키텍처가 있습니다 - short는 32 비트 연산을 수행하여 시뮬레이션 할 것 같은 8 비트 char 및 32 비트 int, 16 비트 또는 두 개의 크기는, 값의 맨 위 부분을 h 제하십시오. 예를 들어 MIPS은 32 비트 연산 만 가지고 있지만 메모리에 16 비트 값을 저장하고로드 할 수 있습니다. 반드시 속도가 느려지지는 않지만 반드시 빠르지는 않습니다.

+0

예, 정확히 8 개 수레 대신 4 개 복식을 포장하는 것이 경우에 따라 절반으로 빠릅니다. 나는 그것을 분명히 본다. 또한 double이 single보다 더 빠른 경우도 있습니다. 수평 추가 및 내적 명령은 float보다 두 배 빠릅니다. 수평 인스트럭션이 순차적으로 구현되어서 단일 명령이 두 배의 연산을 두 번 수행해야하기 때문에 놀라운 일은 아닙니다. –