응용 프로그램에서 카운터 값을 여러 호출간에 유지해야하므로 응용 프로그램이 다시 시작될 때마다 카운터 값이 다시 읽혀지고 거기에서부터 계속 카운팅됩니다. 이 값은 사람이 읽을 수있는 형식으로 저장해야하므로 쉽게 검사 할 수 있으므로 필요에 따라 값을 변경해야하며 원자 적으로 업데이트해야 이전의 지속 값이 실패하지 않습니다.심볼릭 링크를 사용하여 데이터 저장
평범한 오래된 텍스트 파일을 사용하는 것은 너무 지루해 보였습니다. 따라서 창의적인 사고가 발생하면 카운터를 심볼 링크 대상으로 저장하여 동일한 목표를 달성 할 수있었습니다.
기본적으로, 프로토 타입 언어로 쉬를 사용하는 대신
echo $counter > file.tmp && mv file.tmp file || rm -f file.tmp
을하고 내가
ln -s $counter file.tmp && mv file.tmp file || rm -f file.tmp
에게 후자의 접근 방식의 장점을 할 것입니다 것은 나는 쓰기를 하나의 시스템 콜을 필요로한다는 것입니다 파일과 대조적으로 은 적어도 3입니다. 쉘에서 ls -l
을하고 추가 보너스로
$ ls -l the.counter.is
lrwxrwxrwx 1 fabio fabio 4 mar 7 01:08 the.counter.is -> 1234
을 내 PC 표준 접근 방식보다 약 7 배 빠른 symlink 접근법을 사용하여 기대치와 일치하는 결과를 얻습니다. (이 테스트에서는 원 자성에 대해 신경 쓰지 않습니다.)
$ uname -a && ./linkfile 10000 4095 /tmp/test
Linux Fabio-Asus 4.8.0-40-generiC#43-Ubuntu SMP Thu Feb 23 16:01:19 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Starting test... [10000, 4095]
writeToFile: 155.537ms
writeToLink: 23.4132ms
그러나 on coliru 나는 약간 표준 접근 방식에 찬성, 다른 결과를 얻을 :
uname -a && g++ -O3 -o test main.cpp && sync && ./test 10000 4095 x
Linux stacked-crooked 4.4.0-57-generiC#78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Starting test... [10000, 4095]
writeToFile: 21.8001us
writeToLink: 33.9217us
시험은 자신의 실행 시간을 각각의 반복에서 4095 바이트를 작성하고 평균, 각 방법에 대한 10000 반복으로 구성되어 있습니다.
4095 바이트의 이유는 symlink
시스템 호출이 ENAMETOOLONG
과 함께 실패하는 이유 때문입니다.
그래서, 질문은 다음과 같습니다
- 전에 데이터를 저장하는 미친 나, 지금까지 사용이 방법을 제외하고, 사람을 했습니까?
- 예인 경우 어떤 유스 케이스입니까? 내 PC가
i7-6500U CPU @ 2.50GHz
스포츠를 염두에 - 베어링, 당신은 현재의 어떤 생각을 할 이유 표준 접근 방식을 coliru에 그래서 훨씬 더 빨리 내 PC보다, 모두 심볼릭 링크 접근 관련 절대 시간 ? 캐시 때문에 캐시가 문제가되지 않는다면 왜 내 PC에 영향을 미치지 않을 것이며, 왜 symlink 접근에 긍정적 인 영향을 미치지 않을까요?
당신의 성능 테스트 결과가 극도로 파일 시스템이고 하드웨어에 달려 있다고 생각합니다. 로컬로 어떤 파일 시스템을 사용하고 있습니까? 어떤 디스크 하드웨어입니까? –