"GADT가 성능에 중요한 이유"에 회신
12770 단어 ocamlprogramminggadtperformance
기사에서 Yaron Minsky는 처음에 GADT를 사용하는 것과 종료 기록을 사용하는 것을 비교했습니다. 클로저가 자주 생성되는 경우 클로저 레코드가 메모리 비용이 많이 들 수 있음을 알 수 있습니다. Minsky의 예는 다음과 같습니다. 그는 "가난한 사람의 물건[들]"이라고 부릅니다.
module Compact_array = struct
type 'a t = { len: unit -> int
; get: int -> 'a
; set: int -> 'a -> unit
}
let of_string s =
{ len = (fun () -> String.length s)
; get = (fun i -> String.get s i)
; set = (fun i x -> String.set s i x)
}
let of_array a =
{ len = (fun () -> Array.length a)
; get = (fun i -> Array.get a i)
; set = (fun i x -> Array.set a i x)
}
let length t = t.len ()
let get t i = t.get i
let set t i x = t.set i x
end
그러나 개체를 클로저 기록으로 모델링하는 것은 메모리 효율적인 개체가 수행되는 방식이 아닙니다. 클로저 대신 일반 함수를 사용할 수 있습니다. 이로 인해 기본적으로 v-tables을 구현하게 됩니다.
module Compact_array = struct
type ('in_, 'out) ops =
{ len : 'in_ -> int
; get : 'in_ -> int -> 'out
}
let bytes_ops = { len = Bytes.length; get = Bytes.get }
let array_ops = { len = Array.length; get = Array.get }
let of_bytes s = s, bytes_ops
let of_array a = a, array_ops
let length (t, ops) = ops.len t
let get (t, ops) i = ops.get t i
end
Minsky가 제공하는 GADT 솔루션은 더 길지만 GADT가 더 관용적인 코드로 이어지고 easier-to-read signatures 더 많은 작업이 추가되면 유형 변수의 폭발을 피할 수 있다고 생각합니다.
module Compact_array = struct
type 'a t =
| Array : 'a array -> 'a t
| Bytes : bytes -> char t
let of_bytes x = Bytes x
let of_array x = Array x
let length (type el) (t : el t) =
match t with
| Array a -> Array.length a
| Bytes s -> Bytes.length s
let get (type el) (t : el t) i : el =
match t with
| Array a -> Array.get a i
| Bytes s -> Bytes.get s i
let set (type el) (t : el t) i (v : el) =
match t with
| Array a -> Array.set a i v
| Bytes s -> Bytes.set s i v
end
따라서
Compact_array
예제에 대한 GADT의 주요 이점은 인체 공학입니다.There are other use cases for GADTs that are quite different from the
Compact_array
example, they can add safety and reduce boilerplate:
Reference
이 문제에 관하여("GADT가 성능에 중요한 이유"에 회신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maxheiber/reply-to-why-gadts-matter-for-performance-k6n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)