2009-12-15 2 views
0

오늘 우리는 가비지 콜렉션이 얼마나 오래 필요가 있는지 논의했습니다. 또한 1 기가 바이트의 메모리를 지우는 데 얼마나 오래 걸릴지 궁금해졌습니다. 무엇이 필요할까요? 내 컴퓨터에1GB의 메모리를 지우려면 얼마나 걸립니까?

+7

피자를 먹는 데 얼마나 걸립니까? 그것은 누가 그것을 먹고 있고, 어떤 크기와 종류의 피자인지에 달려 있습니다. 귀하의 질문에 똑같은 문제가 적용됩니다. – jball

+1

아,하지만 아시다시피, 규모의 순서는 흥미로울 것입니다. 더 일 또는 나노초인가요? 그냥 느낌을 얻으려고. – Jack

+2

memset을 호출하고 프로파일 러를 시작하는 데 몇 초의 노력이 필요합니다. –

답변

15

, 약 1 초 :

#include <stdlib.h> 
#include <stdio.h> 


const long long int NUM = 1024*1024*1024/8; 

int main(void) { 
    long long int* ptr = malloc(NUM * sizeof ptr); 
    printf("Gigabytes: %lld\n",NUM * sizeof ptr/1024/1024/1024); 
    for(int i=0;i<NUM;i++) { 
     ptr[i]=1l; 
    } 
} 

내가 다음 (다음 실행 마지 못해 할당 시간을 측정, 너무 :

$ gcc -O3 -std=c99 mem.c -o mem 
$ time ./mem 
Gigabytes: 1 

real 0m1.056s 
user 0m0.205s 
sys 0m0.845s 
+7

플러스 15 초, 분명히 그것을 할 프로그램을 입력합니다. +1 –

+0

루프 풀기를 시도 할 수도 있습니다. – RickNZ

+1

0x01의 7 바이트와 0x01 패턴의 1 바이트가 필요한 특별한 이유가 없으면 memset()을 사용하는 것이 좋습니다. –

2

하나는 그 1 GIG를 반환하는 기대 무료 풀에 메모리를 다시 사용하면 간단한 포인터 조작이 가능합니다 .GC는 일반적으로 반환 된 메모리를 지우지 않습니다.

1GB 메모리를 할당하는 데 소요되는 시간은 O를/S에서 시간에 무슨 일이 일어나고 있는지 - 당신은 페이지 테이블 등을 설정해야합니다 ...

11

여기에 많은 요소를 고려해야합니다. 범용 가비지 컬렉터가 링크를 해제 할 때 메모리를 정리하는 것은 의심 스럽습니다. 시간 낭비 일 것입니다. 플러스 가비지 콜렉션은 O (N)이되지 않는 경향이 있습니다. 가비지 수집은 일반적으로 실행되는 몇 가지 루틴을 가지고 있습니다. 여기에서 언급 할 수있는 가장 간단한 것은 압축이고, 압축 자체는 할당 된 메모리 분포 통계를 기반으로합니다.이

가 선택한 답은 가까이 그 느낌에 당신을 데려하지 않습니다 - - 아래의 댓글 후와 문제의 편집 - 사실 그것은 전적으로 오해의 소지가 다른 단계는

가 이

.. 비슷한 복잡성을해야합니다 - 메모리 내 데이터 구조를 반복하지 않기 때문에. 그것은 가비지 컬렉터의 일이 아닌 단지 엄숙하게 메모리를 닦는 것입니다.

더 정확한 답변을

당신은 내가 .NET 또는 Java 응용 프로그램을 작성하고 무작위로 다음 객체의 크기를 다른 메모리의 공연 +를 초기화하고 제안 가비지 컬렉터에 대한 진정한 느낌을 얻을하고 싶다면 100-300MB의 물체를 떨어 뜨린 다음 다시 임의의 크기로 다시 만들 수 있습니다. 물건을 섞어주는 몇 번의 통과를 위해 이것을하십시오. 수집기를 사용하지 않고 개체의 가치를 떨어 뜨린 다음 수동 컬렉션을 강요하면됩니다. 이 마지막 수동 수집은 벤치마킹하려는 것입니다.이 작업을 100 번 정도 수행하고 결과를 계획하려고합니다.

주의 사항 20 일 MS

은 그게 당신이 원하는 어떤 경우 실시간 패턴으로 행동하는 콜렉터을 극복 할 수있는 방법이있다 확신합니다. 수집기는 전체 스윕을 수행 할 필요가 없으며 원자 적 연산 모음으로 수행하도록 작성 될 수 있으며 실시간 시간 초과 (예 : 20ms)에 수집 단계를 비활성화 할 수 있습니다. 이 경우 여전히 유용 할 부분 컬렉션을 수행했을 것입니다.

20ms에서 수행 할 수있는 양을 측정하려면 전술 한 전략을 조정해야합니다. 수집되는 양은 개체의 크기가 아니라 개체의 양에 더 의존적이라는 것을 이해해야합니다. 따라서 GC를 정식으로 테스트하기로 결정한 경우 두 값을 모두 캡처하는 것이 좋습니다.

2

필자는 얼마 전에 최근의 여러 데스크탑 모델에서 버스트 전송으로 테스트 한 메모리 대역폭을 측정하여 대략 초당 5 기가 바이트라는 일관된 숫자를 산출했습니다. Niko의 수와 아주 잘 어울리는데, 공연 시간은 0.205 초입니다. 0.845 초의 시스템 시간은 메모리를 사용할 수있게 만들 때 레코딩됩니다.하드 드라이브의 속도, 페이징 파일의 상태 및 메모리 대역폭보다 RAM에로드되는 다른 프로그램 페이지의 수와 관련이 있습니다.

즉, 측정하는 항목이 400 % 이상 벗어날 가능성이 있습니다. 때로는 훨씬 더.

+0

(+1) 좋은 조언 : D. @jack은 테스트를 실행하기 전에 hd 스왑 영역 (Windows의 페이지 파일)을 비활성화하고 컴퓨터에 충분한 램을 가지고 있습니다. –

관련 문제