2017-11-22 13 views
7

학교 임무 때문에 C++ 코드를 어셈블리 (ARMv8)로 변환해야합니다. 그런 다음 GCC의 -O0, -O1, -O2, -O3 및 -O 최적화를 사용하여 C++ 코드를 컴파일하고 시간을 기록한 다음 내 어셈블리 코드의 실행 시간과 비교해야합니다. 나는 -O3이 -O1과 -O2보다 빠르다는 것을 알고 있다고 생각합니다. 하지만, -O2가 가장 빠르다가 -O1, -O3, -Os, -O0이됩니다. 그거 보통입니까? (계산 된 시간은 약 30 초입니다).최적화 된 실행 시간

+2

[GCC : -O3과 -Os의 차이점] (https://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os)의 가능한 복제본 – Bilkokuya

+0

질문을 추가해야합니다. 나는 특별히 -O2에 관해 묻지 않는다고 표시했다. – Bilkokuya

+2

질문 제목은 컴파일 시간을 말하지만 질문 텍스트는 실행 시간에 더 관심이있는 것처럼 보입니다. 이는 동일한 것은 아닙니다. – lurker

답변

1

예, 일반적입니다. -Ox 최적화를 가이드 라인으로 사용하십시오. 평균적으로 광고 최적화 기능을 제공하지만 컴파일러 자체뿐만 아니라 코드 작성 스타일, 메모리 레이아웃에 따라 많은 영향을받습니다. 때때로 최적의 코드를 얻기 전에 여러 번 시도하고 실패해야합니다. 실제로 대부분의 경우 최적의 최적화를 제공합니다.

+0

감사! 나는 오직 -O0만을 전달했으며, 나의 어셈블리 코드는 57에서, -O1-3은 33에서 실행된다. 그게 좋은가요? – Monstermania

+0

예, 좋습니다. 추가 최적화를 위해서는 많은 시간과 노력이들 것입니다. C++ 코드는 일반적으로 C 코드와 비교하여 최적화하기가 더 어렵습니다. 가능한 경우 스택 및 힙의 크기를 변경하여 메모리 최적화를 시도 할 수 있습니다. 때로는 도움이됩니다. – VladP

2

GCC는 기타 많은optimization flags입니다.

-O3-O2보다 빠른 코드를 제공한다는 보장은 없습니다. 컴파일러는 더 많은 최적화 과정을 적용 할 수 있지만, 모두 발견 적이며 실패 할 수도 있습니다 (또는 특정 코드를 약간 느리게 할 수도 있음). 따라서 -O3-O2 (다소 특정 입력 코드)보다 약간 느린 코드를 제공합니다.

최신 버전의 GCC를 시도 할 수 있습니다 (최신 - 2017 년 11 월 - GCC 7, GCC 8은 몇 개월 만에 나옵니다). better-march= 또는 -mtune= 옵션을 사용해 볼 수도 있습니다. 당신의 GCC plugin와 마침내

는, 당신은 당신의 자신의 최적화 패스를 추가하거나 응용 최적화의 순서 (및 설정) 변경 될 수 있습니다 전달 (수백 가지 최적화는 GCC에서 통과가). 그러나 GCC를 확장하려면 많은 일 (아마도 1 년 또는 2 년)이 필요합니다.

최적화 매개 변수를 조정할 수 있으며 일부 프로젝트 (MILEPOST)는 개선을 위해 기계 학습 기술을 사용했습니다.

내 (구형) GCC MELT documentation의 슬라이드 및 참조를 참조하십시오.