Swift：macのメモリパフォーマンスを取得する

#ソースと使用例

```swift:ソース
import Darwin

public class Memory {
    
    private let gigaByte: Double = 1073741824
    private let hostVmInfo64Count: mach_msg_type_number_t!
    private let hostBasicInfoCount: mach_msg_type_number_t!
    
    init() {
        hostVmInfo64Count = UInt32(MemoryLayout<vm_statistics64_data_t>.size / MemoryLayout<integer_t>.size)
        hostBasicInfoCount = UInt32(MemoryLayout<host_basic_info_data_t>.size / MemoryLayout<integer_t>.size)
    }
    
    public var maxMemory: Double {
        var size: mach_msg_type_number_t = hostBasicInfoCount
        let hostInfo = host_basic_info_t.allocate(capacity: 1)
        let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int()) { (pointer) -> kern_return_t in
            return host_info(mach_host_self(), HOST_BASIC_INFO, pointer, &size)
        }
        let data = hostInfo.move()
        hostInfo.deallocate()
        return Double(data.max_mem) / gigaByte
    }
    
    private func vmStatistics64() -> vm_statistics64 {
        var size: mach_msg_type_number_t = hostVmInfo64Count
        let hostInfo = vm_statistics64_t.allocate(capacity: 1)
        let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { (pointer) -> kern_return_t in
            return host_statistics64(mach_host_self(), HOST_VM_INFO64, pointer, &size)
        }
        let data = hostInfo.move()
        hostInfo.deallocate()
        return data
    }
    
    public func usageMemory() -> (app: Double, wired: Double, compressed : Double, cache: Double, pressure: Double) {
        let load = vmStatistics64()

        let active      = Double(load.active_count) * Double(PAGE_SIZE) / gigaByte
        let speculative = Double(load.speculative_count) * Double(PAGE_SIZE) / gigaByte
        let inactive    = Double(load.inactive_count) * Double(PAGE_SIZE) / gigaByte
        let wired       = Double(load.wire_count) * Double(PAGE_SIZE) / gigaByte
        let compressed  = Double(load.compressor_page_count) * Double(PAGE_SIZE) / gigaByte
        let purgeable   = Double(load.purgeable_count) * Double(PAGE_SIZE) / gigaByte
        let external    = Double(load.external_page_count) * Double(PAGE_SIZE) / gigaByte
        
        let using        = active + inactive + speculative + wired + compressed - purgeable - external
        let app          = using - wired - compressed
        let cache        = purgeable + external
        let pressure     = 100.0 * (wired + compressed) / maxMemory
        
        return (app, wired, compressed, cache, pressure)
    }
    
}
```

```Swift:使用例
let memory = Memory()
Timer.scheduledTimer(withTimeInterval: 3.0, repeats: true) { (t) in
    let res = memory.usageMemory()
    // 単位はGB
    Swift.print("物理メモリ: \(memory.maxMemory)")
    Swift.print("アプリケーションメモリ: \(res.app)")
    Swift.print("確保されているメモリ: \(res.wired)")
    Swift.print("圧縮: \(res.compressed)")
    Swift.print("使用済みメモリ: \(res.app + res.wired + res.compressed)")
    Swift.print("キャッシュされたファイル: \(res.cache)")
    Swift.print("メモリプレッシャー: \(round(10.0 * res.pressure) / 10.0)%")
}
```

スワップ使用領域の算出方法だけわからなかった...

#参考
[获取Mac端的内存使用情况](https://www.jianshu.com/p/74ee9ed5546c)