programing

순기능의 이점

prostudy 2022. 5. 4. 21:33
반응형

순기능의 이점

오늘 나는 순기능에 대해 읽고 있었는데, 순기능의 용도와 혼동되었다.

함수는 동일한 입력 집합에 대해 동일한 값 집합을 반환하고 관측 가능한 부작용이 없는 경우 순수하다고 한다.

예)strlen()는 동안 순수한 기능이다.rand()불순한 것이다.

__attribute__ ((pure)) int fun(int i)
{
    return i*i;
}

int main()
{
    int i=10;
    printf("%d",fun(i));//outputs 100
    return 0;
}

http://ideone.com/33XJU

위의 프로그램은 다음이 없는 경우와 같은 방식으로 동작한다.pure신고서

함수를 다음과 같이 선언할 경우의 이점은 무엇인가?pure[출력에 변화가 없다면]?

pure컴파일러가 함수에 대해 특정한 최적화를 할 수 있다는 것을 알 수 있도록 한다: 다음과 같은 약간의 코드를 상상해 보십시오.

for (int i = 0; i < 1000; i++)
{
    printf("%d", fun(10));
}

순수한 함수로 컴파일러는 평가해야 한다는 것을 알 수 있다.fun(10)천 번이 아니라 한 번, 한 번뿐입니다.복잡한 기능으로는 그것이 큰 승리다.

어떤 기능이 '순수하다'고 말할 때, 당신은 그것이 외부적으로 눈에 보이는 부작용이 없다고 보장하고 있다. (그리고 코멘트가 말하듯이, 만약 당신이 거짓말을 한다면, 나쁜 일들이 일어날 수 있다.)함수가 '순수'라는 것을 알면 컴파일러에 이점이 있으며, 이는 이 지식을 사용하여 특정 최적화를 수행할 수 있다.

GCC 문서에는 다음과 같은 내용이 수록되어 있다.pure속성:

순수의

많은 함수는 반환 값을 제외하고 효과가 없으며 반환 값은 파라미터 및/또는 전역 변수에 의해서만 결정된다.그러한 함수는 산술 연산자와 마찬가지로 공통적인 하위표현 제거와 루프 최적화의 대상이 될 수 있다.이러한 함수는 순수한 속성으로 선언해야 한다.예를 들면.

          int square (int) __attribute__ ((pure));

필립의 대답은 기능이 '순수'라는 것을 아는 것이 어떻게 루프 최적화에 도움이 될 수 있는지를 이미 보여준다.

다음은 일반적인 하위 표현식 제거를 위한 것이다(예:foo순수:

a = foo (99) * x + y;
b = foo (99) * x + z;

다음이 될 수 있음:

_tmp = foo (99) * x;
a = _tmp + y;
b = _tmp + z;

가능한 런타임 혜택 외에도, 순수한 함수는 코드를 읽을 때 추론하기가 훨씬 쉽다.또한, 반환 값이 모수의 값에만 의존한다는 것을 알기 때문에 순수 함수를 테스트하는 것이 훨씬 쉽다.

비순수 함수

int foo(int x, int y) // possible side-effects

순수한 함수의 연장선과 같다.

int bar(int x, int y) // guaranteed no side-effects

명시적 함수 인수 x, y 이외에도 우주의 나머지 부분(또는 컴퓨터가 통신할 수 있는 모든 것)을 암시적 잠재적 입력으로 가지고 있다.마찬가지로 명시적인 정수 반환 값 외에 컴퓨터가 쓸 수 있는 모든 것은 암시적으로 반환 값의 일부분이다.

순수함수보다 순수함수에 대해 추론하는 것이 왜 더 쉬운지 분명해야 한다.

추가 기능으로서, 나는 C++11이 constexpr 키워드를 사용하여 사물을 어느 정도 코드화한다는 것을 언급하고 싶다.예:

#include <iostream>
#include <cstring>

constexpr unsigned static_strlen(const char * str, unsigned offset = 0) {
        return (*str == '\0') ? offset : static_strlen(str + 1, offset + 1);
}

constexpr const char * str = "asdfjkl;";

constexpr unsigned len = static_strlen(str); //MUST be evaluated at compile time
//so, for example, this: int arr[len]; is legal, as len is a constant.

int main() {
    std::cout << len << std::endl << std::strlen(str) << std::endl;
    return 0;
}

constexpr의 사용 제한은 그것을 가능하게 순수하게 만든다.이렇게 하면 컴파일러는 더 공격적으로 최적화할 수 있고(꼬리 재귀만 사용하는지 확인해주십시오!) 실행 시간 대신 컴파일 시간에 기능을 평가할 수 있다.

그래서, 당신의 질문에 답하자면, 만약 당신이 C++ (C라고 말한 것을 알고 있지만, 그것들은 관련이 있다)를 사용하고 있다면, 정확한 스타일로 순수한 함수를 쓰는 것은 컴파일러가 기능 :-)로 모든 종류의 멋진 일들을 할 수 있게 해준다.

일반적으로 순수함수는 컴파일러가 이용할 수 있는 불순함수보다 3가지 장점이 있다.

캐싱

순기능을 가지고 있다고 하자.f그것은 100,000번이라고 불리고 있는데, 그것은 결정론적이고 그것의 매개변수에만 의존하기 때문에, 컴파일러는 그것의 값을 한 번 계산하고 필요할 때 그것을 사용할 수 있다.

병렬주의

순수한 함수는 공유 메모리에 읽거나 쓰지 않으므로 예기치 않은 결과 없이 별도의 스레드에서 실행될 수 있음

참조로 전달

A함수f(struct t)논점을 얻다.t가치에 의해, 그리고 다른 한편으로는 컴파일러는 통과할 수 있다.t에 관하여f의 가치를 보증하면서 순수하다고 선언된다면.t변경되지 않고 성능 향상


컴파일 시간 고려사항 외에도 순수한 함수는 매우 쉽게 테스트할 수 있다. 바로 호출한다.

DB/파일 시스템에 오브젝트를 구성하거나 모의 연결을 설정할 필요가 없음.

참조URL: https://stackoverflow.com/questions/11153796/benefits-of-pure-function

반응형