07/01/2019 তারিখে মোজভেভ 10.4.6 এ এক্সকোড 11 এ পরীক্ষা করা হয়েছে।
পূর্ববর্তী সমস্ত উত্তরই ভুল ফলাফল দেয় ।
অ্যাপলের কুইন "দ্য এস্কিমো" দ্বারা লিখিত প্রত্যাশিত মানটি কীভাবে পাবেন তা এখানে রয়েছে।
এই ব্যবহার phys_footprint
থেকে Var Darwin > Mach > task_info
এবং ঘনিষ্ঠভাবে Xcode এর ডিবাগ ন্যাভিগেটর মেমরি গেজ মান সাথে মেলে ।
প্রত্যাশিত মানটি বাইটে হয়।
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 টি উল্লেখযোগ্য দশমিক স্থান দেয়।