나는 가지고있다이 C89 애플릿- 그것이 무엇을 하는지, 어떻게 작동하는지, 그리고 정의되지 않은 동작은 중요하지 않습니다. 단, 하나의 스레드에서 일부 긴 메모리와 수학 연산만 수행한다는 점은 다릅니다.
x, c, * b, m, t, i, a;
g (n) {
for (b = malloc(0); c < n; b[c - 1] = x++, t = 1) {
char s[9];
for (i = m = 0; i < sprintf(s, "%d", x); m += a, t *= a) a = s[i++] - 48;
b = m * t ? x % m + x % t ? b : realloc(b, 4 * ++c) : b;
}
return b[c - 1];
}
main (j) {
printf("%d\n", g(--j));
}
다음과 같이 컴파일하세요: gcc -std=c89 tt.c -o tt -O3
.
그런 다음 루프에서 쉘 스크립트를 사용하여 실행하여 시간이 얼마나 걸리는지 확인합니다.
#!/bin/bash
echo "using input $1"
for _ in `seq 1 10`; do
( time ./tt $(seq 1 $1) ) 3>&1 1>/dev/null 2>&3 \
| grep real \
| cut -f2
# sleep 5
done
다음 출력이 표시됩니다.
$ ./tt.sh 50
using input 50
0m0.016s
0m0.008s
0m0.008s
0m0.007s
0m0.007s
0m0.007s
0m0.008s
0m0.008s
0m0.007s
0m0.007s
또는 다음과 같습니다:
$ ./tt.sh 34
using input 34
0m0.007s
0m0.004s
0m0.004s
0m0.004s
0m0.005s
0m0.004s
0m0.003s
0m0.003s
0m0.003s
0m0.004s
첫 번째 호출 이후 프로그램은 초기 가속으로 실행 real
되고 이후의 모든 호출은 이 잘못된 가속으로 실행됩니다.
# sleep 5
쉘 스크립트에서 이 줄의 주석 처리를 제거 하면 다음이 표시됩니다.
using input 50
0m0.008s
0m0.020s
0m0.018s
0m0.012s
0m0.009s
0m0.006s
0m0.013s
0m0.012s
0m0.009s
0m0.012s
using input 34
0m0.006s
0m0.007s
0m0.004s
0m0.007s
0m0.008s
0m0.003s
0m0.004s
0m0.004s
0m0.005s
0m0.007s
이러한 시간은 더 예상되고 정확해 보이며, 그 차이는 그 순간 프로세서의 무작위 상태에 기인해야 합니다(즉, 작은 자연적 변화).
프로그램의 평균 실행 시간을 얻으려면 이 숫자의 평균을 구해야 하지만 sleep 5
각 호출 사이에 10개의 테스트에 총 50초가 소요됩니다. 이것이 이 동작을 중지할 수 있는 유일한 방법이지만 몇 초도 걸리지 않습니다. 20개의 테스트.
나는 긴 작업(긴밀한 루프)을 반복해서 수행하는 단일 스레드 프로그램에서 이전에 이러한 "재생 캐시" 동작을 본 적이 있으며 99.9%의 경우 이것이 바람직하다는 것을 알고 있습니다.
이것이 하드웨어 수준의 일부 Intel Magic™의 결과가 아니라고 가정하면 Linux 커널이나 Bash가 의도적으로 수행하는 작업입니까? 어떻게 막을 수 있나요?
sleep 5
캐시의 영향을 받는 시간이 매번 콜드 스타트를 나타내지 않기 때문에 ing 없이 "콜드 스타트"에서 라이브러리 로드 및 페이징을 포함하여 내 프로그램이 재현 가능한 런타임을 갖기를 원합니다 .
답변1
내 의견에서 말했듯이 :
아마도 도움이 되지 않을 것입니다. 그러나 각 호출 전에 "echo 3 > /proc/sys/vm/drop_caches"를 시도하십시오.
tt
질문자의 답변:
예, echo 1 | sudo tee /proc/sys/vm/drop_caches가 바로 제가 원하는 것입니다(대신 echo 3은 이상한 결과를 제공합니다). 이것을 대답으로 넣어야합니다
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches