यह 07/01/2019 को Mojave 10.4.6 में Xcode 11 पर परीक्षण किया गया है।
पिछले सभी उत्तर गलत परिणाम देते हैं ।
यहां बताया गया है कि एप्पल के क्विन "द एस्किमो!" द्वारा लिखित अपेक्षित मूल्य कैसे प्राप्त करें।
यह Xcode के डीबग नेविगेटर में मेमोरी गेज से वैल्यूphys_footprint
से Darwin > Mach > task_info
और बारीकी से मिलान का उपयोग करता है ।
लौटाया गया मान बाइट्स में है।
https://forums.developer.apple.com/thread/105088#357415
मूल कोड इस प्रकार है।
func memoryFootprint() -> mach_vm_size_t? {
// The `TASK_VM_INFO_COUNT` and `TASK_VM_INFO_REV1_COUNT` macros are too
// complex for the Swift C importer, so we have to define them ourselves.
let TASK_VM_INFO_COUNT = mach_msg_type_number_t(MemoryLayout<task_vm_info_data_t>.size / MemoryLayout<integer_t>.size)
let TASK_VM_INFO_REV1_COUNT = mach_msg_type_number_t(MemoryLayout.offset(of: \task_vm_info_data_t.min_address)! / MemoryLayout<integer_t>.size)
var info = task_vm_info_data_t()
var count = TASK_VM_INFO_COUNT
let kr = withUnsafeMutablePointer(to: &info) { infoPtr in
infoPtr.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { intPtr in
task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), intPtr, &count)
}
}
guard
kr == KERN_SUCCESS,
count >= TASK_VM_INFO_REV1_COUNT
else { return nil }
return info.phys_footprint
}
स्विफ्ट विधियों के वर्ग स्तर सेट बनाने के लिए इसे थोड़ा संशोधित करना प्रदर्शन के लिए एमबी में वास्तविक बाइट्स और स्वरूपित आउटपुट की आसान वापसी की अनुमति देता है। मैं इसे एक ही परीक्षण के कई पुनरावृत्तियों से पहले और बाद में उपयोग की जाने वाली मेमोरी को लॉग करने के लिए एक स्वचालित यूआईस्टेस्ट सूट के हिस्से के रूप में उपयोग करता हूं, यह देखने के लिए कि क्या हमारे पास कोई संभावित लीक या आवंटन हैं जिन्हें हमें देखने की आवश्यकता है।
// Created by Alex Zavatone on 8/1/19.
//
class Memory: NSObject {
// From Quinn the Eskimo at Apple.
// https://forums.developer.apple.com/thread/105088#357415
class func memoryFootprint() -> Float? {
// The `TASK_VM_INFO_COUNT` and `TASK_VM_INFO_REV1_COUNT` macros are too
// complex for the Swift C importer, so we have to define them ourselves.
let TASK_VM_INFO_COUNT = mach_msg_type_number_t(MemoryLayout<task_vm_info_data_t>.size / MemoryLayout<integer_t>.size)
let TASK_VM_INFO_REV1_COUNT = mach_msg_type_number_t(MemoryLayout.offset(of: \task_vm_info_data_t.min_address)! / MemoryLayout<integer_t>.size)
var info = task_vm_info_data_t()
var count = TASK_VM_INFO_COUNT
let kr = withUnsafeMutablePointer(to: &info) { infoPtr in
infoPtr.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { intPtr in
task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), intPtr, &count)
}
}
guard
kr == KERN_SUCCESS,
count >= TASK_VM_INFO_REV1_COUNT
else { return nil }
let usedBytes = Float(info.phys_footprint)
return usedBytes
}
class func formattedMemoryFootprint() -> String
{
let usedBytes: UInt64? = UInt64(self.memoryFootprint() ?? 0)
let usedMB = Double(usedBytes ?? 0) / 1024 / 1024
let usedMBAsString: String = "\(usedMB)MB"
return usedMBAsString
}
}
का आनंद लें!
नोट: एक उद्यमी कोडर वर्ग के लिए एक स्थिर फ़ॉर्मेटर जोड़ना चाह सकता है ताकि usedMBAsString
केवल 2 महत्वपूर्ण दशमलव स्थान लौटें।