كيفية تسريع Swift: تحليل الأداء وتحسين الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا يبطئ Swift؟ نفهم الأداء

\n\n

هل سبق لك أن شغّلت تطبيق Swift الخاص بك وشعرت أنه يعمل... مثل الحلزون في ساعة الذروة؟ الشاشة تتجمد، والرسوم المتحركة تتقطع، والمستخدمون مستعدون لوضع تقييم 1 نجم في App Store. ألم مألوف؟ مرحباً بك في النادي!

\n\n

Swift لغة سريعة. لقد وعدت Apple بذلك، وفي 90% من الحالات هذا صحيح. لكن هناك فارق بسيط: حتى أقوى لغة يمكن "خنقها" بمعمارية سيئة، أو تسربات ذاكرة، أو خوارزميات غير فعالة. في هذه المقالة، لن نلقي محاضرات مملة. بدلاً من ذلك، سأعرض لك أدوات وتقنيات حقيقية ستحول تطبيقك من سلحفاة إلى فهد.

\n\n

هل أنت مستعد؟ لننطلق!

\n\n

أدوات تحليل الأداء: أشعة إكس للكود الخاص بك

\n\n

قبل تحسين أي شيء، عليك فهم ما الذي يبطئ بالضبط. التخمين على القهوة استراتيجية سيئة. هنا يأتي دور تحليل أداء كود Swift.

\n\n

Xcode Instruments - صديقك الرئيسي

\n\n

في Xcode هناك مجموعة أدوات مدمجة - Instruments. إنها مثل التصوير بالرنين المغناطيسي لتطبيقك: تظهر كل حركة، كل استدعاء دالة، وكل بايت من الذاكرة. يتم تشغيلها ببساطة: Product > Profile (أو Cmd + I).

\n\n

إليك ثلاثة من أكثر القوالب فائدة:

\n\n
    \n
  • Time Profiler - يظهر أي الدوال تستهلك معظم وقت المعالج.
  • \n
  • Allocations - يتتبع تخصيص وتحرير الذاكرة.
  • \n
  • Leaks - يكتشف تسربات الذاكرة (نعم، تحدث أيضاً في Swift!).
  • \n
\n\n

مثال: تشغيل Time Profiler، تقوم بالتمرير في جدول - وترى أن 70% من الوقت يذهب إلى tableView(_:cellForRowAt:). هذه إشارة: حان وقت تحسين الخلايا.

\n\n

Signposts و os_log: تحليل الأداء بدون Instruments

\n\n

Instruments أداة قوية، لكنها ليست دائماً في متناول اليد. أحياناً تحتاج لقياس الأداء بسرعة مباشرة في الكود. هنا تساعد Signposts (iOS 12+):

\n\n
import os.signpost\n\nlet log = OSLog(subsystem: "com.yourapp.networking", category: .pointsOfInterest)\nlet signpostID = OSSignpostID(log: log)\n\nos_signpost(.begin, log: log, name: "fetchData", signpostID: signpostID)\n// كود تحميل البيانات الخاص بك\nos_signpost(.end, log: log, name: "fetchData", signpostID: signpostID)\n
\n\n

ثم تفتح Instruments، تختار os_signpost - وترى الطوابع الزمنية. جميل، أليس كذلك؟

\n\n

تحسين كود Swift: من البسيط إلى المعقد

\n\n

الآن بعد أن عرفنا أماكن الاختناقات، دعنا نصلحها. قسمت النصائح إلى ثلاثة مستويات: للمبتدئين، وللمتقدمين، وللمحترفين.

\n\n

1. المستوى الأساسي: ما يمكن للجميع فعله

\n\n

لنبدأ بالواضح، لكن المنسي غالباً.

\n\n

استخدم أنواع القيم (struct) بدلاً من أنواع المراجع (class)

\n\n

هذا كلاسيكي في Swift. Struct يُخزّن في المكدس، class في الكومة. المكدس سريع، الكومة بطيئة (تحتاج لتخصيص ذاكرة، عد المراجع). إذا كان كائنك صغيراً ولا يحتاج إلى وراثة - اجعله بنية (struct) بثقة.

\n\n
// سيء (class)\nclass User {\n    var name: String\n    var age: Int\n    init(name: String, age: Int) {\n        self.name = name\n        self.age = age\n    }\n}\n\n// جيد (struct)\nstruct User {\n    var name: String\n    var age: Int\n}\n
\n\n

التهيئة الكسولة (lazy)

\n\n

لماذا تنشئ كائناً إذا قد لا تحتاجه؟ استخدم lazy var:

\n\n
class DataManager {\n    lazy var networkService = NetworkService() // سيتم إنشاؤه فقط عند أول استخدام\n}\n
\n\n

تجنب النسخ غير الضرورية

\n\n

في كل مرة تمرر فيها مصفوفة إلى دالة، قد ينسخها Swift (إذا كانت Array - نوع قيمة). استخدم inout أو UnsafeMutablePointer للبيانات الكبيرة.

\n\n

2. م

المدونات

توصيات الكتب