다른 libc 문자열 기능을 비교하는 일련의 벤치 마크를 실행 중입니다. 문제는 함수가 "pure"와 "const"로 표시 되었기 때문에 GCC와 Clang이 루프에서 계산을 최적화하고 있다는 것입니다. 최적화를 끄거나 주변을 돌아 다니는 방법이 있습니까?GCC와 Clang : 순수한 최적화 해제
답변
해결했습니다. 해결책은 고약했지만 작동했습니다 :
volatile int x;
for (...)
{
// ...
x = (int)f(args);
}
캐스트는 문제가되지 않으므로 결코 사용하지 않습니다. 더 나은 아직, 지금 나는 return value of function declared with pure attribute
를 사용하지 않는 것에 관해서 오류를 얻지 않는다.
해결책에 컴파일러의 다음 버전이나 현재 버전이 루프를 'int i = (int) f (args);로 변환하지 못하게하는 어떤 것도 없습니다. for (...) x = i;' –
@PascalCuoq :'x'를 ['volatile'] (http://en.wikipedia.org/wiki/Volatile_variable)로 선언 했으므로 컴파일러는 ' 건드리지 마라. – refi64
'x'를'volatile'로 선언 했으므로 컴파일러는 소스 코드에서와 마찬가지로 객체 코드에 접근 할 수 있어야한다는 것을 알고 있습니다. 'volatile'한정자는'(int) f (args)'에 적용되지 않기 때문에 컴파일러는 그것을 루프에서 꺼낼 수 있습니다. 그것은 고전적인 최적화이며 적어도 하나의 기존 컴파일러가 이미 코드에 적용 할 수 있다면 놀라지 않을 것입니다. 그렇게하지 않는 컴파일러는 아직 순수 함수와 관련된 최적화의 전체 범위를 구현하지 않았습니다. –
clang을 사용하면 수행 할 패스를 gcc로 선택할 수 있습니다. 확실하지 않습니다. –
이러한 사항을 벤치마킹하는 가장 좋은 방법은 결과를 사용하는 것입니다. 출력에서 하나의 번호 만 출력하면됩니다. – Mysticial
순수/const 함수를 사용하면 결과를 사용하려고하지만 매번 다른 인수로 호출하거나 컴파일러에서 단일 호출을 수행 할 수도 있습니다. 컴파일러 패스 (@Marco 물론 gcc가 허용 함)를 사용하지 않도록 설정하면 (-O0을 사용하지 않는 한) 너무 연약합니다. 표준 헤더를 포함하지 않고 직접 libc 함수를 선언하고 -fno-builtin으로 컴파일하여 컴파일러가 함수가 순수/const인지 알 수 있지만 Mysticial의 조언을 따르는 것이 좋습니다. –