CS 학생으로서 나는 컴퓨터의 기초를 이해하려고 노력하고 있습니다. 내가 this website을 우연히 만났을 때, 나는 그 성능 처벌을 혼자서 테스트하려고했습니다. 나는 그가 무슨 말을하는지, 왜 이런 일이 일어나야하는지 이해해야한다. 내 CPU & RAM이 너무 엄청나게 빠른 경우잘못 정렬 된 데이터의 성능 저하
int main(void)
{
int i = 0;
uint8_t alignment = 0;
uint8_t size = 1024 * 1024 * 10; // 10MiB
uint8_t* block = malloc(size);
for(alignment = 0; alignment <= 17; alignment++)
{
start_t = clock();
for(i = 0; i < 100000; i++)
Munge8(block + alignment, size);
end_t = clock();
printf("%i\n", end_t - start_t);
}
// Repeat, but next time with Munge16, Munge32, Munge64
}
잘 모르겠지만, 4 개 기능의 출력 (Munge8 : 어쨌든
, 여기 내 나는 그가 쓴 그 함수를 호출하는 데 사용되는 코드입니다 , Munge16, Munge32 및 Munge64)은 항상 3 또는 4 (임의, 패턴 없음)입니다.이것이 가능합니까? 100000 회 반복해야 할 일이 많이 있어야합니다, 아니면 내가 잘못입니까? 저는 Windows 7 Enterprise x64, Intel Core i7-4600U CPU @ 2.10GHz에서 작업하고 있습니다. 모든 컴파일러 최적화가 해제됩니다 (예 :/Od).
그래서 모든 관련 질문에 대답하지 않았다 내 솔루션가 작동하지 않습니다.
내가 뭘 잘못하고 있니? 어떤 도움이라도 대단히 감사합니다.
편집 : 우선 : 정말 고마워요.
while(data32 != data32End)
{
data32++;
*data32 = -(*data32);
}
지금, 12 25/26 상대적으로 안정적인 출력을 받고 있어요 : uint32_t
에 uint8_t
에서 크기의 종류를 변경 한 후 나는 두 개의 별도의 줄에 테스트 함수의 정의되지 않은 동작을 일으키는 모든 내부 루프를 변경/13, 6 및 3 틱으로 100 회 반복의 평균을 계산합니다. 이것은 논리적 인 결과입니까? 이는 내 아키텍처가 정렬 된 액세스를 정렬 된 액세스와 같이 빠르게 (또는 느리게) 처리한다는 의미입니까? 부정확하게 시간을 측정합니까? 또는 10으로 나눌 때 정확도에 문제가 있습니까? 새로운 코드 :
int main(void)
{
int i = 0;
uint8_t alignment = 0;
uint64_t size = 1024 * 1024 * 10; // 10MiB
uint8_t* block = malloc(size);
printf("%i\n\n", CLOCKS_PER_SEC); // yields 1000, just for comparison how fast my machine 'ticks'
for(alignment = 0; alignment <= 17; alignment++)
{
start_t = clock();
for(i = 0; i < 100; i++)
singleByte(block + alignment, size);
end_t = clock();
printf("%i\n", (end_t - start_t)/100);
}
// Again, repeat with all different functions
}
일반 평론은 물론 인정 받고 있습니다. :)
'uint8_t size = 1024 * 1024 * 10; // 10MiB' : uint8_t의 범위 : 0 - 255. – BLUEPIXY
링크 된 아티클을 보면, 함수는 모두'* data8 ++ = - * data8; '와 같은 라인으로 정의되지 않은 동작을 포함합니다. 또한 호출하는 방법은 할당 된 블록의 끝을 지나서 메모리에 액세스하게합니다. – interjay
@interjay 왜'* data8 ++ = - * data8'가 정의되지 않은 행동입니까? –