2016-07-01 2 views
1

dub 아래에 최적화 된 바이너리를 빌드하려면 오름차순이란 무엇입니까? (예를 들어 ... 디버그 < 일반 < 출시 ...)D의 최적화 수준은 무엇입니까?

$ dub build -h 
... 
     -b --build=VALUE  Specifies the type of build to perform. Note that 
          setting the DFLAGS environment variable will override 
          the build type with custom flags. 
          Possible names: 
           debug (default), plain, release, release-debug, 
           release-nobounds, unittest, profile, profile-gc, 
           docs, ddox, cov, unittest-cov and custom types 
... 

dub build -b release-noboundsdmd -O -release -boundscheck=off에서 파생 된 것 같다, 그래서 fastest executables를 구축하기 dub에 대한 동등한은 무엇인가?

답변

8

이러한 옵션은 실제로 최적화에 관한 것이 아닙니다. (그리고 나는 dub 자체가 8 개의 독립적 인 스위치입니다 ...), 많은 사람들이 의미하는 바를 혼동합니다 그래서 DMD 스위치 이름을 사용하여, 나에게 목록을 보자

  • -debug는 단순히 코드 예에서 debug 문에서 컴파일 debug writeln("foo");-debug으로 컴파일 된 경우에만 foo를 작성합니다. 그것은 다른 것을하지 않습니다! 중요한 점은 디버거에 대한 정보가 포함되어 있지 않다는 것인데, 이는 -g으로 끝납니다 (더빙은이 두 옵션을 결합 할 수도 있음).

  • -g은 기능 이름을 알기 위해 gdb과 같은 프로그램에 대한 기호 디버깅 정보를 추가합니다. 이 같은 정보는 예외 스택 추적 인쇄에도 사용되므로 스택 추적에 함수 이름이 표시됩니다.

  • -release

    assertin, outinvariant 계약을하지 않도록, 자동 배열 @system 함수 (BTW 기본되는)의 경계를 확인. 즉, 최적화를 활성화하지도 않고 -debug의 반대를 의미하지도 않으며 단지 assert 관련 항목을 건너 뜁니다. (assert(0);은 특별한 경우이며 비활성화되지 않습니다 참고하지만, 어쨌든 결코 일어나지 않을한다 -.이 프로그램을 죽이는)

  • -unittestunittest 블록을 컴파일, 오른쪽 main을 실행하기 전에 실행 (다음 main 여전히 것 나중에 정상적으로 실행).

  • -profile은 기능 전후에 시간 정보를 추가하고 프로그램이 완료되면 해당 정보를 로그 파일에 기록합니다. 단일 스레드 프로그램에서만 작동하며 로깅은 프로그램 자체를 상당히 느리게 할 수 있습니다. 이 함수를 사용하여 가장 많이 호출되는 함수와 최적화 작업을 수행 할 수있는 부분을 파악하는 데 가장 느린 함수를 파악할 수 있습니다.

  • -cov 실제로 실행 된 프로그램 행과 실행되지 않은 행을 알려주는 정보를 테스트 로그에 추가합니다.

  • -profile=gc GC 특정 프로파일 링을 수행하고 타이밍 정보가 기록 된 로그를 기록합니다.

  • -D은 컴파일하는 동안 코드의 ddoc 정보에서 HTML 파일을 생성합니다. 더브는 이걸 docs라고 부릅니다. ddox은 비슷하지만 기본 dmd html 생성기 대신 더빙 사용자 지정 문서 생성기를 사용합니다. 이 ddoc의 출력 : http://dlang.org/phobos/std_algorithm.html 이것은 ddox의이다 : 배열 범위 검사가 컴파일되지 않는 경우

  • -boundscheck=xxxxhttp://dlang.org/library/std/algorithm.html 결정 - 아무 곳에도 안전 기능, 모든 기능을, 또는.이전 버전에서는이 스위치가 -release 스위치에 연결되었지만 이제는 별도로 수행 할 수 있습니다. -release의 기본값은 @safe이며 다른 모든 곳의 기본값은 모든 기능입니다. 그 중에 -O 또는 -inline 없었다고

공지 사항! 즉, -O은 코드를 최적화하는 것을 의미하고 -inline은 인라인 함수를 의미합니다 (때때로 인라이닝이 디버거를 망칠 수 있기 때문에 별도로 수행합니다.) 다른 컴파일러 인 gdc 및 ldc는 -O 옵션을 사용하여 자동으로 인라인하고 일반적으로 . 어쨌든 DMD보다 그것의 더 나은 일)

는 개인적으로, 나는 -boundscheck-release를 사용에 대해 강력하게 추천 - 사람들은 단지 최종 속도에 차이가 큰 것을하지 않고 대부분의 경우 버그를 숨 깁니다. 어떤 엄격한 루프에서 경계 검사가 전체 프로그램에서 -boundscheck으로 죽이는 대신 속도가 느려지는 경우 느린 특정 액세스에을 사용하십시오 (어떤 함수를 최적화 할 것인지 알아 내기 위해 -profile을 사용할 수 있습니다). 더 많은 주말에 여기 : http://arsdnet.net/this-week-in-d/dec-06.html

-release 당신이 값 비싼 어설 션의 톤을 수행하는 경우에만 큰 차이가 있습니다 ... 그리고 다시, 나는 모든 것을 비활성화 대신 비싼 것들을 개별적으로 버전 화하는 것을 선호합니다. 합법적으로 일반적인 버그를 잡는 정말 빠른 검사를 포함합니다.

최적화 된 dmd 빌드의 경우 -O-inline으로 진행하는 것이 좋습니다. 많은 (그러나 모든 프로그램이 아님) btw의 경우, gdc -Oldc -O은 모든 dmd 스위치 조합보다 더 잘합니다. CPU가 제한적이라면 시도해보십시오.


등을 맞댄. 패키지 형식의 문서를 체크 아웃 : http://code.dlang.org/package-format?lang=json

빌드 타입 release을, 그래서 dub build -b release DMD하는 -O -release -inline을 전달합니다. 유형 release-nobounds도 nobounds 스위치를 추가합니다. 그것이 dmd 문서가 가장 빠른 실행 파일이라고 부르는 것과 내가 버그가있는 실수라고 부르는 것입니다.

I (나는 실제로 그것을 자신을 사용하지 않는) 무엇을 볼 수에서 최고의 더빙 옵션을 제공하는 더빙 설정 파일 (dub.json 또는 dub.sdl)

optimizebuildOptions를 추가하는 것입니다 당신은 -O이고, 그 다음은 기술을 사용하거나 version을 값 비싼 assert에 사용하여 나머지 프로그램에서 안티 버그 기능을 손상시키지 않고 핫스팟을 선택적으로 빠르게 할 수 있습니다. 여기

더 읽기 더빙 문서 :

http://code.dlang.org/package-format?lang=json#build-options

+0

는 D의 컴파일 및 최적화 전략에 대한 귀하의 철저한 분석을위한 많은 감사드립니다. – sof

관련 문제