순기능의 이점
오늘 나는 순기능에 대해 읽고 있었는데, 순기능의 용도와 혼동되었다.
함수는 동일한 입력 집합에 대해 동일한 값 집합을 반환하고 관측 가능한 부작용이 없는 경우 순수하다고 한다.
예)strlen()
는 동안 순수한 기능이다.rand()
불순한 것이다.
__attribute__ ((pure)) int fun(int i)
{
return i*i;
}
int main()
{
int i=10;
printf("%d",fun(i));//outputs 100
return 0;
}
위의 프로그램은 다음이 없는 경우와 같은 방식으로 동작한다.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
'programing' 카테고리의 다른 글
기존 멀티페이지에서 jQuery를 VueJS 2로 교체할 때 가장 좋은 방법.NET MVC 응용 프로그램 (0) | 2022.05.04 |
---|---|
Vue.js 클래스 이름으로 프로펠러 값 사용 (0) | 2022.05.04 |
Java Map이 컬렉션을 확장하지 않는 이유 (0) | 2022.05.04 |
Apache에서 vue 기록이 있는 https 강제 적용 (0) | 2022.05.04 |
vuexfire로 쿼리하는 방법 (0) | 2022.05.04 |