문제

나는 숫자가 관련되어 있을 때 내 언어에서 기본 데이터 유형으로 빅넘을 사용할지 여부에 대해 이 문제에 직면했습니다.나는 이것을 직접 평가하고 그것을 편리함과 편안함으로 줄였습니다.성능-질문입니다.해당 질문에 대한 대답은 최적화되지 않은 프로그램의 성능 저하가 얼마나 큰지에 따라 달라집니다.

Fixnum이나 정수로 충분했던 곳에서 bignum을 사용하는 오버헤드는 얼마나 작습니까?최상의 구현에서는 얼마나 작을 수 있습니까?어떤 종류의 구현이 가장 작은 오버헤드에 도달하며 어떤 종류의 추가 장단점이 발생합니까?

Bignums에서 내 언어를 기본값으로 설정하면 전반적인 언어 성능에 어떤 영향을 미칠 수 있습니까?

도움이 되었습니까?

해결책

솔직히 말해서, 가장 좋은 대답은 "시도하고보십시오"입니다.

분명히 단일 CPU 레지스터에 적합한 기본 유형만큼 효율적일 수는 없지만 모든 응용 프로그램이 다릅니다. 정수 산술을 전체로드하지 않으면 오버 헤드가 무시할 수 있습니다.

다른 팁

LISP가 어떻게하는지 볼 수 있습니다. 거의 항상 할 것입니다 바로 그거죠 오른쪽 필요에 따라 유형을 암시 적으로 변환합니다. Fixnums ( "정상"정수), bignums, 비율 (2 개의 정수 세트로 표시되는 적절한 분수) 및 플로트 (크기가 다른)가 있습니다. 플로트 만 정밀 오류가 있고 전염성이 있습니다. 즉, 계산에 플로트가 포함되면 결과도 플로트입니다. "실제 공통 LISP"는이 행동에 대한 좋은 설명을 가지고 있습니다.

생각해보면...별로 흥행에 성공할 것 같지는 않습니다.

빅넘은 본질적으로 매우 큰 밑수, 예를 들어 65536 이상의 밑수는 일반적으로 전통적인 고정 숫자 및 정수에 대해 가능한 최대 값입니다.

빅넘의 베이스를 얼마나 크게 설정할지는 모르겠지만, 픽스넘버 및/또는 정수 대신 사용할 때 첫 번째 빅넘 숫자를 초과하지 않도록 충분히 크게 설정하면 작업이 수행됩니다. 일반적인 fixnums/int와 거의 동일합니다.

이는 첫 번째 빅넘 숫자 이상으로 커지지 않는 빅넘의 경우 매우 빠른 한 빅넘 숫자 작업으로 대체할 수 있는 최적화 기회를 열어줍니다.

그런 다음 두 번째 큰 숫자가 필요할 때 n자리 알고리즘으로 전환합니다.

이는 모든 산술 연산에 대한 비트 플래그 및 유효성 검사 연산으로 구현될 수 있습니다. 대략적으로 생각하면, 데이터 블록의 최상위 비트가 0으로 설정된 경우 최상위 비트를 사용하여 bignum을 나타낼 수 있으며 다음과 같이 처리할 수 있습니다. 정상적인 fixnum/ints였지만 1로 설정된 경우 블록을 bignum 구조로 구문 분석하고 거기에서 bignum 알고리즘을 사용합니다.

이는 성능 저하의 첫 번째 원인이라고 생각되는 간단한 루프 반복자 변수로 인한 성능 저하를 방지해야 합니다.

그것은 단지 나의 대략적인 생각일 뿐이며, 당신이 나보다 더 잘 알아야 하기 때문에 제안입니다 :-)

추신.죄송합니다. bignum-digit 및 bignum-base의 기술 용어가 무엇인지 잊어버렸습니다.

당신의 감소는 정확하지만 선택은 언어의 성능 특성에 따라 다릅니다. 우리는 아마 알 수 없습니다!

언어를 구현 한 후에는 성능 차이를 측정하고 프로그래머에게 기본값을 선택할 수있는 지침을 제공 할 수 있습니다.

결과가 언어에 따라, 언어 개정 당 및 CPU에 따라 다른 벤치 마크를 만들 때까지 실제 성능을 알지 못할 것입니다. 32 비트 정수가 16 비트 정수의 메모리의 두 배를 사용한다는 명백한 사실을 제외하고는이를 측정하는 언어 독립적 인 방법이 없습니다.

Fixnum 또는 Integer가 충분한 곳에서 Bignums를 사용하는 오버 헤드는 얼마나 작습니까? 소규모가 가장 잘 구현 될 수 있습니까?

나쁜 소식은 가능한 최상의 소프트웨어 구현에서도 Bignum은 크기의 순서 (즉, 요인 10에서 1000을 요인까지)에 따라 내장 된 산술보다 느리게 될 것입니다.

정확한 숫자는 없지만 정확한 숫자가 그러한 상황에서 큰 도움이 될 것이라고 생각하지 않습니다. 큰 숫자가 필요한 경우 사용하십시오. 그렇지 않다면. 당신의 언어가 기본적으로 그것들을 기본적으로 사용한다면 (어떤 동적 언어는 어떤 동적 언어가하는지…), 다른 언어로 전환하는 단점이 성능의 이득 (거의 없어야 함)에 의해 보상되는지 생각해보십시오.

(대략 번역 될 수 있습니다 : 큰 차이가 있지만 중요하지 않습니다. 만약에 (그리고 경우에만) 중요한 구현에도 불구하고 다른 언어를 사용하는 경우이 언어는이 언어가 작업에 적합하지 않기 때문입니다.)

나는 그것이 매우 도메인 별이 아니라면 그만한 가치가있을 것이라고 완전히 의심합니다.

가장 먼저 떠오르는 것은 모두 프로그램 전체에서 루프가 거의 없습니다, 작은 반복 변수가 모두 bignums일까요? 그것은 무섭다!

그러나 당신의 언어가 다소 기능적이라면 ... 아마도 그렇지 않을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top