2010-03-10 3 views
8

저는 프로세서의 작동 방식에 대해별로 전문적 지식이 없지만, 0이 아닌 값보다 메모리 덩어리를 0으로 설정하는 것이 더 쉽다고 생각할 수 있습니다.0으로 채우는 것보다 0이 아닌 값으로 메모리를 채우는 것이 더 빠릅니까?

+0

어떻게 0으로 그 덩어리를 설정할 계획입니까? –

+0

@neil, ermmm memset()? 그러나 나는 제안에 개방적이다. – Mick

+0

정말 질문에 대답하려면 memset 버전의 소스 코드와 컴파일러가 생성 한 어셈블러를 살펴 봐야합니다. –

답변

8

유일한 차이점은 메모리에 저장할 값이있는 레지스터를 설정하는 것입니다. 일부 프로세서에는 0으로 고정 된 레지스터가 있습니다 (예 : ia64). 그럼에도 불구하고, 레지스터를 세우는 데 필요한 최소한의 간접비가 메모리에 쓰는 것으로 극도로 왜소해질 것입니다.

실제로 메모리에 쓸 시간은 내가 익숙한 모든 아키텍처에서 동일하게 기록됩니다.

1

가상 메모리 시스템을 사용하여이 작업을 수행 할 수 있으면 0이 아닌 페이지보다 빠르게 0이 아닌 할당되지 않은 페이지를 가져올 수 있습니다. 이러한 최적화는 일반적으로 C++ 응용 프로그램 (예 : 표준 라이브러리 구현)에서는 사용되지 않으므로 0으로 채워진 std :: vector 할당과 다른 값을 할당하는 것 사이에 어떤 차이도 기대하지 마십시오.

1

많은 요인이 있기 때문에 잘 모르겠지만 두 가지 방법으로 코드를 작성하고 벤치마킹하는 방법을 찾아야합니다.

Windows VirtualAlloc 함수는 새로 할당 된 메모리를 0으로 초기화하지만 Microsoft 디버그 C++ 런타임은 이후에 더미 값으로 다시 설정하지만주의해야합니다. 0으로 초기화 된 메모리의 빠른 소스를 원한다면 OS로 직접가는 것이 좋습니다.

+2

내가 말하는 Windows 할당 기능을 모르지만 GlobalAlloc 인 경우 기본적으로 제로 설정 메모리를 할당하지는 않지만 요청할 수는 있습니다. –

+0

@Neil : VirtualAlloc (MEM_COMMIT)은 채워진 메모리를 0으로 할당합니다. –

+0

Windows 초기화 작업을 수행 하시겠습니까? 프로그램이 그것을 필요로하든 그렇지 않든간에 메모리의 상당 부분을 설정하는 것은 상당한 힘과 시간이 걸릴 것입니다. 그렇지 않습니까? – Seb

0

메모리 셀을 0으로 설정하는 cpu 명령이 있으면 더 빠를 것입니다. 그러나 아무도 없다.

-1

인텔 아키텍처에서 매우 일반적인 최적화는 두 피연산자가 동일한 메모리 위치 인 xor a,b 연산을 사용하는 것입니다. 레지스터에 값을 저장하고 이동 작업을 수행 할 필요가 없습니다. 따라서 라이브러리가이 최적화를 사용하면 0을 작성하는 것이 더 빠릅니다.

두 피연산자가 모두 등록 된 경우에만 XOR을 사용합니다.

+3

음, 메모리 읽기, xor 연산, 메모리 쓰기가 필요하지 않습니까? 그것은 매우 느릴 것입니다. – Tronic

+0

@ 트로닉, 나는 당신이 옳다고 생각합니다. 어셈블리를 읽었을 때, 두 피연산자가 모두 XMM 레지스터 일 때만 보이고 xor – Anycorn

3

이론적으로는 실제로 더 빠를 수도 있습니다.

먼저 하드웨어 플랫폼은 메모리를 0으로 설정하는 전용 CPU 명령을 제공 할 수 있습니다.

둘째, 제로에 실제로 설정 메모리의 행위, 즉 구체적으로 게으른 작업으로 OS/하드웨어에 의해 지원 될 수 제로에 메모리를 설정하는 것은 정말 단순히 제로화를 위해이 메모리 영역을 표시 외에 아무것도하지 않는 첫 번째 읽습니다. 물론 OS/하드웨어 수준에서 관리되는 메모리 영역에서만 가능합니다.

실제로 후자는 calloc 기능이 존재하는 이유 중 하나입니다. 일부 플랫폼에서는 malloc보다 훨씬 효율적으로 구현 될 수 있고 그 다음에 0이 memset이됩니다. 그러한 플랫폼에서 그 효과는 "한계"가 아니라 엄청나게 클 것이다.

+1

+1을 사용합니다. 그리고 일부 운영 체제는 0이 된 페이지 풀을 유지합니다.이 풀은 여유 시간이되면 0이 될 수 있습니다. – tony

2

dcbz 캐시 명령어를 사용할 수 있기 때문에 버퍼를 정렬하면 PPC에서 더 빠를 수 있습니다. 그것은 당신이 모든 경우에 더 빠를 것이라고 기대해야하는 것이 아닙니다.이 언급

기사 : http://www.ibm.com/developerworks/power/library/pa-memory/index.html

+0

링크를 제공해 주셔서 감사합니다. 전에는 캐시 관련 명령어를 본 적이 없습니다. –

관련 문제