Int 및 Float 필드에 큰 계산을 저장하지 않는 한, 상당한 오버 헤드가 썽크로 가득한 많은 사소한 계산에서 축적 될 수 있습니다. 예를 들어, 데이터 유형의 lazy Float 필드에 1을 반복적으로 추가하면 실제로 필드를 강제 계산하여 계산할 때까지 더 많은 메모리를 사용합니다.
종종 필드에서 값 비싼 계산에 저장하려고합니다. 그러나 사전에 그런 일을하지 않을 것이라는 것을 알게되면 필드를 엄격하게 표시하고 수동으로 seq
을 추가하지 않아도 원하는 효율성을 얻을 수 있습니다. 플래그를 지정하면 추가 보너스로
는
-funbox-strict-fields
GHC 직접 그들이 항상 평가 될 것입니다 알고 있기 때문에 가능한 데이터 형식 자체에 엄격한 필드 데이터 유형의
1 압축을 풀 것이며, 따라서 더 썽크에 없습니다 할당된다. 이 경우 막대 값은 데이터를 포함하는 썽크에 대한 두 개의 포인터를 포함하지 않고 메모리의 막대 값 바로 안에있는 Int 및 Float을 구성하는 기계 단어를 포함합니다.
게으름은 매우 유용하지만 일부는 시간이 흐르면서 계산을 방해합니다. 특히 작은 필드는 항상보고 (따라서 강제로) 또는 자주 수정되지만 매우 비싼 계산. 엄격한 필드는 데이터 유형의 모든 용도를 수정할 필요없이 이러한 문제를 해결하는 데 도움이됩니다.
게으른 필드보다 일반적인지 여부는 읽는 코드의 유형에 따라 다릅니다. 예를 들어, 게으르다는 이점 때문에 기능적 트리 구조가 엄격한 필드를 광범위하게 사용하는 것을 볼 가능성이 없습니다.
의 당신이 중위 작업의 생성자를 가진 AST 있다고 가정 해 봅시다 :
data Exp = Infix Op Exp Exp
| ...
data Op = Add | Subtract | Multiply | Divide
당신은 그 전체 AST 평가되는 것을 의미 할 것 같은 정책을 적용하는 한, Exp
필드를 엄격하게하고 싶지 않아요을 당신이 게으름으로부터 이익을 얻고 자하는 것이 아닌, 최상위 노드를 볼 때마다. 그러나 Op
필드에는 나중에 계산할 값 비싼 계산이 포함되지 않으므로 깊숙이 중첩 된 구문 분석 트리가 있으면 중개 연산자 당 썽크의 오버 헤드가 높아질 수 있습니다. 따라서 중위 생성자의 경우 Op
필드를 엄격하게 설정하고 두 개의 Exp
필드는 그대로 두는 것이 좋습니다.
단일 생성자 유형 만 압축을 풀 수 있습니다.
마찬가지로 AST는 엄격하지 않아야합니까? – Lanbo
예를 들어 대서양 표준시를 사용하여 정교화하여 답변을 확장했습니다. – ehird