내장 타입 효율
답변
링크하는 사이트에서 콘텐츠의 품질에 대해 항상 논쟁 할 수 있습니다.
... 부동 소수점 숫자를 저장하는 객체를 정의 할 때, 이중 유형을 사용 ...
및
:하지만 두 따옴표는 당신이 참조 ... double 형은 float 형보다 2 ~ 3 배 효율적이지 않습니다 ...
는 성능에 대한 다른 이야기하면서, 증가로 인한 정밀도로 다른 두 가지, 복식을 사용하면 훨씬 적은 문제를 줄 것이다 첫 번째 힌트를 참조하십시오. 그러나 솔직히 나는 그것에 너무 많은 관심을 기울이지 않을 것이고, 기회가 당신의 코드가 차선책으로 수행된다면 그것은 원시 데이터 타입의 잘못된 선택 이라기보다는 잘못된 알고리즘 선택 때문일 것입니다.
다음은 저의 오래된 교사 중 한 사람과 단수 및 배정도 부동 소수점의 성능 비교에 대한 인용입니다. 자신의 웹 사이트에서 많은 재미있는 독서가있는 Agner Fog : 소프트웨어 최적화에 대해 http://www.agner.org에 관심이있는 경우 마이크로 최적화를 살펴보십시오.
대부분의 경우 배정 밀도 계산에는 단 정밀도 이상의 시간이 필요하지 않습니다. 부동 소수점 레지스터를 사용할 때 단 정밀도와 배정 밀도 사이에는 속도 차이가 없습니다. 긴 배정 밀도는 시간이 약간 걸립니다. XMM 레지스터를 사용할 때는 단 정밀도, 제곱근 및 수학 함수가 배정도보다 빠르게 계산되지만 추가, 빼기, 곱셈 등의 속도는 대부분 프로세서의 정밀도와 관계없이 여전히 동일합니다 (벡터 연산이 아닌 경우). 익숙한).
소스 :http://agner.org/optimize/optimizing_cpp.pdf
다른 컴파일러 다른 유사하고, 서로 다른 프로세서가있을 수도 있지만, 하나는 그것에서 배워야 할 교훈은, 가장 가능성이 당신의 최적화에 대해 걱정할 필요가 없다는 것입니다 이 수준은 알고리즘의 선택, 원시 데이터 유형이 아닌 데이터 컨테이너조차도 고려해야합니다.
예. 잘못된 알고리즘을 선택하면 (즉, 간단합니다!) 번개가 빠른 것에서부터 우주의 열사병이 끝나기 전에 성능이 쉽게 떨어집니다. 그리고 그것은 비교에서 거대하게 크기가 큰 유형을 사용하는 올바른 알고리즘입니다. – Deduplicator
내 프랙탈 코드에서 한 번에 하나의 수레를 사용하여 AVX 또는 8 픽셀을 사용하여 4 픽셀을 한 번에 처리합니다. 단일 플로트 방법은 약 두 배 빠릅니다. –
이러한 최적화는 우주 왕복선 발사 소프트웨어를 작성하지 않는 한 무시할 수 있습니다. 정확함 코드가 보다 빠르며 코드보다 훨씬 중요합니다. 정밀도가 필요한 경우 double을 사용하면 런타임에 거의 영향을 미치지 않습니다. 방법이 더 유형 정의보다 실행 시간에 영향을
것들 :
복잡성을 - 할이 더 많은 일, 더 천천히 코드가 실행됩니다. 필요한 작업량을 줄이거 나 작고 빠른 작업으로 나눕니다.
반복 - 반복은 피할 수 있으며 필연적으로 코드 성능을 저하시킵니다. 예를 들어 값 비싼 계산이나 원격 프로 시저 호출의 결과를 캐시하지 못하는 경우가 많습니다. 재 계산할 때마다 효율성을 낭비합니다. 또한 실행 파일 크기를 확장합니다.
나쁜 디자인 - 자체 설명. 코드를 작성하기 전에 생각하십시오!
입출력 - 입력 또는 출력 (사용자, 디스크 또는 네트워크 연결)의 실행을 기다리는 동안 실행이 차단 된 프로그램이 잘못 수행 될 수 있습니다.
더 많은 이유가 있지만 가장 큰 이유가 있습니다. 개인적으로 나쁜 디자인은 대부분의 일이 일어난 곳입니다. stateless 일 수있는 상태 머신, static이 좋았던 동적 할당 등이 실제 문제입니다.
그 이상으로, 복식은 항상 더 느립니다. 경우에 따라서는 더 많은 메모리가 필요하고 일반적으로 두 배나 많은 데이터를 읽거나 쓰려면 일반적으로 항상 두 배의 시간이 걸리기 때문에 문제가 발생합니다. 그러나 미가공 계산의 경우 런타임을 몇 % 이상 변경하지 못할 수도 있습니다. – StilesCrisis
정확하고 빠른 코드가 더 좋습니다. – UpAndAdam
@UpAndAdam 정확하고 빠르고 빠릅니다. 둘을 골라. – Deduplicator
double
의 실제 CPU (또는 원하는 경우 FPU) 성능은 현대 CPU의 절반 속도와 동일한 속도 사이의 어딘가에 있습니다 [예를 들어 더하기 또는 빼기는 아마도 같은 속도입니다. 곱셈 또는 나눗셈은 큰 유형과 다른 경우]와 비교했을 때 float
입니다.
그 외에도 "캐시 라인 당"이 적기 때문에 많은 수가있는 경우 메모리 속도가 느리기 때문에 여전히 느려집니다. 캐시 라인 당, 응용 프로그램이 완전히 메모리 바운드 인 경우 성능의 약 절반이>double
값의 절반입니다. CPU에 바운드 된 응용 프로그램에서는 훨씬 적은 요소가됩니다.
비슷하게 SSE 또는 유사한 SIMD 기술을 사용하는 경우 double
은 두 배의 공간을 차지하므로 실제 명령어 수는 "명령어 당"절반이되며 일반적으로 CPU는 동일한 float
및 double
에 대한 사이클 당 명령어 수 - double
에 오랜 시간이 소요되는 일부 작업은 제외됩니다. 다시 말하지만 성능이 절반 정도입니다.
그래, 나는 링크의 페이지가 double
과 float
사이의 이상적인 성능 설정을 혼란스럽게 만들고 혼란스럽게한다고 생각합니다. 즉, 순수한 성능 관점에서 말입니다. float
을 사용할 때 눈에 띄는 계산 오류를 얻는 것이 훨씬 쉽습니다. 추적하려면 고통이 될 수 있습니다. 따라서 성능 문제로 확인했기 때문에 으로 시작하여 float
으로 전환하는 것이 좋습니다 (경험 또는 측정 중 하나임).).
그리고 네, 하나 개의 크기 정수가 존재하는 여러 아키텍처가 있습니다 - short
는 32 비트 연산을 수행하여 시뮬레이션 할 것 같은 8 비트 char
및 32 비트 int
, 16 비트 또는 두 개의 크기는, 값의 맨 위 부분을 h 제하십시오. 예를 들어 MIPS은 32 비트 연산 만 가지고 있지만 메모리에 16 비트 값을 저장하고로드 할 수 있습니다. 반드시 속도가 느려지지는 않지만 반드시 빠르지는 않습니다.
예, 정확히 8 개 수레 대신 4 개 복식을 포장하는 것이 경우에 따라 절반으로 빠릅니다. 나는 그것을 분명히 본다. 또한 double이 single보다 더 빠른 경우도 있습니다. 수평 추가 및 내적 명령은 float보다 두 배 빠릅니다. 수평 인스트럭션이 순차적으로 구현되어서 단일 명령이 두 배의 연산을 두 번 수행해야하기 때문에 놀라운 일은 아닙니다. –
- 1. 문제 서브 클래스 내장 타입
- 2. 서브 클래스 내장 타입 - 파이썬 2와 3
- 3. Java 효율
- 4. 효율 차이
- 5. 데이터베이스 효율
- 6. 쿼리 효율
- 7. jQuery를 효율
- 8. 효율 최적화
- 9. 수집 효율
- 10. 루프 처리 효율
- 11. Python if 문 효율
- 12. 루프 효율 - C++
- 13. MySQL 효율 시나리오
- 14. 개체의 메모리 효율
- 15. OpenGL 줌 효율
- 16. mysql 질의 효율
- 17. 효율 키/값 표
- 18. 정렬 알고리즘 효율/성능
- 19. AVL 트리 로테이션 효율
- 20. 1x 단색 이미지 효율
- 21. C# GroupJoin 효율
- 22. 간단한 2 불리언 효율
- 23. NSString 비교 효율
- 24. C# 구조체 할당 효율
- 25. 등급 시스템 이미지 효율
- 26. Linq에서 테이블 조인 효율
- 27. 읽기/쓰기 효율
- 28. 어디 Linq 효율 조항?
- 29. MySQL SELECT 효율
- 30. SQL-lite 효율
필요하다고 판단 할 때까지 코드를 미세 최적화하지 마십시오. 현대 건축물의 차이점은 무시할 수 있습니다. – clcto
당신이 정말로 중요 할 경우 - 실제로는 그렇지 않을 것입니다 - 당신이 정말로 목표로 삼고있는 실제 하드웨어에서 이러한 것들을 벤치마킹해야합니다. – 5gon12eder
또한 참조를 잘못 인용하고 있습니다 : * "[...] 부동 소수점 숫자를 저장할 객체를 정의 할 때'long double' 유형이 필요할 때를 제외하고는'double' 유형을 사용하십시오. 결과 집계 객체가 중간 크기 또는 큰 크기 인 경우 더 큰 정밀도가 필요한 경우를 제외하고 [...] 부동 소수점 유형을 'float'유형으로 바꿉니다. * – 5gon12eder