저는 프로세서의 작동 방식에 대해별로 전문적 지식이 없지만, 0이 아닌 값보다 메모리 덩어리를 0으로 설정하는 것이 더 쉽다고 생각할 수 있습니다.0으로 채우는 것보다 0이 아닌 값으로 메모리를 채우는 것이 더 빠릅니까?
답변
유일한 차이점은 메모리에 저장할 값이있는 레지스터를 설정하는 것입니다. 일부 프로세서에는 0으로 고정 된 레지스터가 있습니다 (예 : ia64). 그럼에도 불구하고, 레지스터를 세우는 데 필요한 최소한의 간접비가 메모리에 쓰는 것으로 극도로 왜소해질 것입니다.
실제로 메모리에 쓸 시간은 내가 익숙한 모든 아키텍처에서 동일하게 기록됩니다.
가상 메모리 시스템을 사용하여이 작업을 수행 할 수 있으면 0이 아닌 페이지보다 빠르게 0이 아닌 할당되지 않은 페이지를 가져올 수 있습니다. 이러한 최적화는 일반적으로 C++ 응용 프로그램 (예 : 표준 라이브러리 구현)에서는 사용되지 않으므로 0으로 채워진 std :: vector 할당과 다른 값을 할당하는 것 사이에 어떤 차이도 기대하지 마십시오.
많은 요인이 있기 때문에 잘 모르겠지만 두 가지 방법으로 코드를 작성하고 벤치마킹하는 방법을 찾아야합니다.
Windows VirtualAlloc
함수는 새로 할당 된 메모리를 0으로 초기화하지만 Microsoft 디버그 C++ 런타임은 이후에 더미 값으로 다시 설정하지만주의해야합니다. 0으로 초기화 된 메모리의 빠른 소스를 원한다면 OS로 직접가는 것이 좋습니다.
내가 말하는 Windows 할당 기능을 모르지만 GlobalAlloc 인 경우 기본적으로 제로 설정 메모리를 할당하지는 않지만 요청할 수는 있습니다. –
@Neil : VirtualAlloc (MEM_COMMIT)은 채워진 메모리를 0으로 할당합니다. –
Windows 초기화 작업을 수행 하시겠습니까? 프로그램이 그것을 필요로하든 그렇지 않든간에 메모리의 상당 부분을 설정하는 것은 상당한 힘과 시간이 걸릴 것입니다. 그렇지 않습니까? – Seb
메모리 셀을 0으로 설정하는 cpu 명령이 있으면 더 빠를 것입니다. 그러나 아무도 없다.
인텔 아키텍처에서 매우 일반적인 최적화는 두 피연산자가 동일한 메모리 위치 인 xor a,b
연산을 사용하는 것입니다. 레지스터에 값을 저장하고 이동 작업을 수행 할 필요가 없습니다. 따라서 라이브러리가이 최적화를 사용하면 0을 작성하는 것이 더 빠릅니다.
두 피연산자가 모두 등록 된 경우에만 XOR을 사용합니다.
이론적으로는 실제로 더 빠를 수도 있습니다.
먼저 하드웨어 플랫폼은 메모리를 0으로 설정하는 전용 CPU 명령을 제공 할 수 있습니다.
둘째, 제로에 실제로 설정 메모리의 행위, 즉 구체적으로 게으른 작업으로 OS/하드웨어에 의해 지원 될 수 제로에 메모리를 설정하는 것은 정말 단순히 제로화를 위해이 메모리 영역을 표시 외에 아무것도하지 않는 첫 번째 읽습니다. 물론 OS/하드웨어 수준에서 관리되는 메모리 영역에서만 가능합니다.
실제로 후자는 calloc
기능이 존재하는 이유 중 하나입니다. 일부 플랫폼에서는 malloc
보다 훨씬 효율적으로 구현 될 수 있고 그 다음에 0이 memset
이됩니다. 그러한 플랫폼에서 그 효과는 "한계"가 아니라 엄청나게 클 것이다.
+1을 사용합니다. 그리고 일부 운영 체제는 0이 된 페이지 풀을 유지합니다.이 풀은 여유 시간이되면 0이 될 수 있습니다. – tony
dcbz 캐시 명령어를 사용할 수 있기 때문에 버퍼를 정렬하면 PPC에서 더 빠를 수 있습니다. 그것은 당신이 모든 경우에 더 빠를 것이라고 기대해야하는 것이 아닙니다.이 언급
기사 : http://www.ibm.com/developerworks/power/library/pa-memory/index.html
링크를 제공해 주셔서 감사합니다. 전에는 캐시 관련 명령어를 본 적이 없습니다. –
- 1. Devexpress.LookUpEdit을 설정 값으로 채우는 방법?
- 2. 어느 것이 더 빠릅니까?
- 3. 어느 것이 더 빠릅니까?
- 4. Excel 셀 내부의 숫자를 0으로 채우는 방법
- 5. 사소한 초기 값으로 벡터를 채우는 방법은 무엇입니까?
- 6. malloc()으로 할당 된 메모리를 채우는 효과
- 7. 저장 프로 시저가있는 tableadapter를 채우는 것이 SQL의 저장 프로 시저를 실행하는 것보다 훨씬 더 걸립니다.
- 8. 데이터 보관함 값으로 텍스트 상자를 채우는 방법
- 9. 어느 것이 더 빠릅니까? 연합인가?
- 10. 이전보기에서 iPhone tableview 배열을 채우는 것이 좋습니다.
- 11. 문자열이나 바이트 배열을 비교하는 것이 더 빠릅니까?
- 12. 이 표를 정규화하는 것이 더 빠릅니까?
- 13. TextBlock 내부에 Grid를 채우는 것이 가능한가요?
- 14. 세션이 데이터베이스를 쿼리하는 것보다 빠릅니까?
- 15. 길이가 0인지 확인하는 것이 빈 문자열과 비교하는 것보다 빠릅니까?
- 16. 데이터베이스에서 selectManyListbox를 채우는 방법
- 17. sql에서 두 문자열을 연결하고 한 문자열을 0으로 채우는 방법은 무엇입니까?
- 18. XMLWriter와 SimpleXML. 어느 것이 더 빠릅니까?
- 19. DrawDib StretchDIBits 어느 것이 더 빠릅니까?
- 20. SQL 효율성 - 어느 것이 더 빠릅니까?
- 21. jQuery : 선택기에 컨텍스트를 추가하는 것이 선택기를 수정하는 것보다 훨씬 빠릅니까?
- 22. mysql 데이터베이스를 채우는 것
- 23. 세션에서 데이터베이스를 채우는 방법?
- 24. 왜 fsock_open()을 사용하는 것보다 file_get_contents()가 더 빠릅니까?
- 25. 숨겨진 필드를 MVC에서 동일한 값으로 채우는 것을 봅니다
- 26. hpricot 요소를 html로 채우는
- 27. 풀다운 메뉴를 채우는 방법?
- 28. 드롭 다운 메뉴를 채우는 방법
- 29. 배열의 값으로 다른 배열의 키를 채우는 방법은 무엇입니까?
- 30. IntPtr 매개 변수를 float 값으로 채우는 방법은 무엇입니까?
어떻게 0으로 그 덩어리를 설정할 계획입니까? –
@neil, ermmm memset()? 그러나 나는 제안에 개방적이다. – Mick
정말 질문에 대답하려면 memset 버전의 소스 코드와 컴파일러가 생성 한 어셈블러를 살펴 봐야합니다. –