2010-06-13 3 views
14

그래서 코드를 작성할 때마다 항상 성능에 대한 영향을 생각합니다. 필자는 성능면에서 다른 기능에 비해 memcopy를 사용하는 데 "비용"이 무엇인지 궁금해했습니다.C/C++에서의 Memcopy의 성능 비용

예를 들어 정적 버퍼에 일련의 숫자를 쓰고 버퍼 내의 프레임에 집중할 수 있습니다. 버퍼의 끝에 도달하면 프레임을 유지하기 위해 모든 것을 memcopy 할 수 있습니다. 시작 부분에 또는 계산을 상각하는 알고리즘을 구현할 수 있습니다.

+11

성능에 대해 생각하고 측정 한 적이 있습니까? –

+0

나는 memcopy가 아니라. – Cenoc

+6

항상 성능에 대해 생각하는 것은 진절머리 나게 느린 코드를 작성하는 좋은 방법입니다. –

답변

18

memcpy는 대용량 사본의 메모리 대역폭을 최대화하기 위해 일반적으로 최적화됩니다. 물론, 복사를 완전히 피하는 것만 큼 빠르지는 않습니다. 고정 크기의 짧은 사본의 경우, memcpy가 홀수 길이를 다루는 추가 코드를 가지고 있기 때문에 직접 할당이 더 빠를 수도 있습니다.

그러나 메모리 블록을 복사해야 할 때 memcpy를 이길 수 없습니다. 이식성이 매우 뛰어나며 대부분의 컴파일러는 SIMD 명령어를 사용하든 인라인을 사용하든 관계없이 신속하게 작업 할 수 있습니다.

+1

memcpy는 C++에서 사용하지 마십시오. "멍청한"복사본이고 나쁜 결과가 발생할 수 있습니다. 할당 연산자/복사 생성자는 확실히 교대로 사용해야합니다. 또한 프로파일을 먼저 실행하여 문제점을 판별해야합니다. – Puppy

+13

@DeadMG : 많은 C++ 프로그램이 C++ 표준에 의해 "평범한 오래된 데이터"라고 불리는 "멍청한"데이터에서 작동하며 memcpy를 사용하는 것이 안전합니다. 내 경험상, POD가없는 프로그램 유형은 상위 수준 언어로 작성하는 것이 좋습니다. –

+2

예. * memcpy를 사용하여 POD가 아닌 유형으로 프로그램을 완전히 망칠 수 있습니다. 또는 할당 연산자를 사용할 수 있습니다. 그러면 궁극적으로 POD 유형에 대한 memcpy와 비 POD 유형에 대해 작동하는 프로그램이 생깁니다. – Puppy

1

음, 첫째 - 당신은 메모리 복사가 병목(그리고 정말 드문 경우입니다) 경우에만 성능에 대해 생각해야한다.

두 번째로 memcpy은 어셈블러를 사용하여 구현되며 (memcpy.asm 참조) 가장 빠른 메모리 복사 솔루션입니다.

또한 일반적으로 C++의 raw memcpy 호출은 피해야하며 더 추상화 된 래퍼와 루틴을 사용하십시오.

+0

간단한 할당은 CPU 레지스터를 사용하여 구현 될 수 있지만 memcpy의 사용은 그렇지 않습니다. 할당이 너무 큰 경우 컴파일러는 어쨌든 memcpy로 돌아가므로 할당을 더 잘 사용하십시오 (적용 가능한 경우 ...) – MindTailor

1

memcpy()은 원본에서 dest로 메모리 내용을 복사합니다. 복사는 소스의 요소 양에 비례합니다. 요소의 최적 크기를 구성하는 것은 기계 의존입니다. 어쨌든 많은 컴파일러 otimization black magic이 작업의 컨텍스트에 따라 적용될 수 있습니다. C++에서는 일반적으로 memcpy을 피하고 할당 또는 복사 생성자를 사용하는 것이 현명합니다.

+0

현대 아키텍처에서는 메모리 아키텍처와 캐시 효과를 고려하여 거의 확실하게 복사가 선형이 아닙니다 요소 수. memcpy 및 복사 생성자가 사과와 오렌지를 비교합니다. –

4

성능에 미치는 영향을 고려해도 좋지만 좋은 깨끗한 코드를 작성한다는 진정한 목표에서 벗어나지 마십시오. 당신이 더 잘 알았을 때조차도 성능에 집착하는 경향이 있다면 높은 수준의 함의에 집중하고 memcpy과 같은 bit-by-bit를 무시하십시오. 그러면 컴파일러와 라이브러리 작성자가이를 최적화 할 수 있습니다.

일반적으로이 저수준 종류의 시간을 소비하고 효과가 전체 프로그램을 감염시키기 때문에 조기에 최적화되지 않도록하십시오. 측정을하지 않으면 성능 향상을 기대할 수 없습니다.

1

McCormick의 'Code Complete'책을 살펴보십시오. 거기에서 부끄러움을 훔쳐서 ---

  1. 알고리즘 개선은 대개 성능면에서 가장 큰 투자 회수기입니다.

  2. 간단한 구문을 사용하면 컴파일러에서 효과적으로 최적화 할 수 있습니다. 이것들은 프로그래머 비용이 적다. 일반적으로 가독성이 높아집니다. 그들은 저비용 기본 '어쨌든'입니다.

앞서 언급 한 바와 같이 memcpy은 이미 조정되었으며 대용량 메모리 블록에서 종종 효과적입니다.따라서 상황에 따라 데이터를 보관해야하는 이유가 무엇입니까?

일반적으로 아무 이유없이 최적화하지 마십시오. 거대한 데이터 세트에 대한 보고서를 작성한다고 가정합니다. 이 시나리오에서는 사용자가 즉각적인 응답을 기대하지 않습니다. 그들은 일을 시작하고 간식을 먹습니다. 따라서 코드가 10 분 또는 3 분이면 문제가되지 않습니다. 그들에게. 너는 알아 차리지 못할 것이다. 그리고 ... 그들은 당신의 월급을 씁니다.

프로그래머 최적화는 엄청난 비용입니다. 따라서 필요한 곳에 만 비용을 지출하십시오.

+1

사실, 스티브 맥코넬의 코드 완성입니다 –

+0

IT는 맥코넬입니다. 나는 교정했다. –