2012-07-03 3 views
0

매우 빠른 프로그램을 개발하고 있습니다.C++ 프로그램에서 _asm 코드를 사용하면 차이가 있습니까?

나는 C++로 만들 것이고 XOR과 같은 논리적 연산을 많이하거나 2 진수에서 1의 수를 계산해야하기 때문에 _asm{}을 사용하는 것이 좋습니다. 이러한 작업을 더 빠르게 수행 할 수있는 코드 일부. 그들은 때때로 수백만 번 처형 될 것입니다.

하지만 실제로 효과를 발휘할만한 가치가 있는지는 알 수 없습니다.

누군가가 시험해보기 전에 그 주제에 대한 지식을 높이 평가 해주시기 바랍니다.

고마워요.

+6

* 조기 최적화는 모든 악의 뿌리입니다. * - Donald Knuth. :) 첫째, C++에서 작동하도록하십시오. 그런 다음 프로파일 링하여 병목 현상을 찾습니다. 그런 다음 코드를 알고리즘 적으로 향상시키는 방법을 살펴보십시오. 그리고 그것이 충분하지 않으면, asm을 시도하십시오. –

+0

숫자에 설정된 비트 수를 계산하려면 조회 테이블을 사용해야합니다. – jxh

+0

논리 연산의 경우 일반적으로 차이가 없습니다. 이진수로 1의 수를 세는 명령이 있지만 CPU가 명령을 지원하는지 여부에 따라 달라 지므로이를 달성하기 위해 비트 피딩 해킹을 사용하는 것이 좋습니다. – nhahtdh

답변

4

프로세서 클럭이 초당 수십억 개일 때 백만 오 프는 종종 큰 문제가되지 않습니다.

그래서 간단한 C/C++로 코딩하십시오. 그것을 테스트하십시오. 프로파일 링하십시오. 속도가 너무 느리고 프로필에 핫스팟이 표시되면 해당 지점에 대한 최적화를 최대화하고 다시 테스트하십시오. 여전히 너무 느린 경우 최적화 된 코드를 분해하고 으로 생각한다면 컴파일러보다 더 잘 할 수 있습니다. 그렇게 생각하면 _asm {}을 삽입하십시오. 이 조심스럽게 만들어진 코드가 더 느리게 실행되도록 준비하십시오. 그것은 많이 발생합니다. 이 필요한 속도 향상을 얻는다면 어셈블러를 #ifdef에 넣으십시오. 그러면 다음 프로세서 rev가 발행 될 때 고정시킬 수 있습니다. 읽기 : 어셈블리 코드는 작성하고 유지하는 데 너무 비싸서 거의 항상 나쁜 생각입니다. 단지 정말 조금 어셈블러를하고 내 경험에

+0

답변과 의견을 보내 주셔서 감사합니다. 조숙 한 최적화에 대한 조언을 주셔서 감사합니다. – Martin

0

좋은 생각이 아닙니다. 그것은 크게 속도를 향상시키지 않을 것이지만, 당신의 성능을 해칠 X64 프로세서에 직접 컴파일하는 능력을 죽일 것입니다. 정말로 Asm을 사용하려면 x86/x64를 지원하는 Asmjit을 조사하십시오.

+0

C++에서 인라인 어셈블리가있는 경우 x64 용으로 컴파일 할 수없는 이유는 무엇입니까? – David

+0

인라인 ASM은 타입 안전하지 않으며 포인터가 맹 글링됩니다. – Lusitanian

+2

@Dave : Visual C++는 적어도 x86 용 인라인 asm 만 지원합니다. – ildjarn

0

현대 컴파일러는 컴파일 된 대상 기계에 대한 C++ 코드를 상당히 간결한 어셈블리 지침으로 축소합니다.

나는 대부분의 프로그램에서 순수한 성능 관점에서 볼 때 투자 가치가 없을 것이라고 말합니다.

기본 하드웨어를 더 잘 이해할 수있는 좋은 기회가 될 수 있습니다!

1

당신이 SSE 기능, 또는 실제로 내가 unreadability에 상승 프로젝트에서 popcount 또는 CRC

같은 특정 새 명령을 사용할 수있을 때 도움이;

normal code to ASM = 10% faster, 50 times more unreadable code 
suited code to SSE = 500% faster, 75 times more unreadable code 

그래서 나는 경우에만 모든 사람이 실제로 느리고 일부 ASM/SSE를 시도 실패 무엇을 찾아, 먼저 신청을하는 것이 좋습니다 것입니다.

+0

감사합니다. – Martin

+0

gcc에는 모든 SSE 기능을위한 내장 기능이 있습니다. 이것들은 _asm 섹션보다 깨끗합니다. – dave

관련 문제