قبل از هر چیز باید بگم که دوست ندارم این پست تبدیل به جدالی بین طرفداران اندروید و آی اُ اس بشه؛ نه تنها قصدی برای شروع چنین جدالی ندارم، بلکه دلم به حال کسانی که وقت خودشون رو با چنین دشمنی هایی هدر میدن میسوزه! افرادی که با چشم و گوش بسته از یک برند خاص طرفداری میکنن و حاضرن به خاطرش با بقیه جر و بحث کنن؛ جر و بحث هایی که اغلب مواقع منجر به دلخوری میشه؛ از خودتون سوال کنید: گوگل یا اپل پولی برای رفتار شما به حساب تون واریز میکنن؟
پس حتما نکتهی بالا رو در نظر داشته باشید.
چند تا موضوع دیگه هم هست که باید توضیح بدم: اول اینکه من از طرفداران نرم افزارهای آزاد و اوپن سورس هستم. بنابراین میتونین مطمئن باشید که با یک «اپل زامبی» طرف نیستید؛ دوم اینکه من به حالت نرمال به اندازه کافی پشت کامپیوتر میشینم، بنابراین زیاد علاقه ندارم که تو وقت آزادم سرم توی گوشی باشه! زیاد هم برام مهم نیست گوشی خودم اندروید باشه یا آیفون. من با هردوتاشون راحت هستم.
متن زیر صرفا یک تشریح تکنیکی از دلایل تاثیر گذار در تفاوتِ سرعتِ اندروید و آی اُ اس (که از این به بعد برای راحتی بیشتر فقط آیفون صداش میکنم) هست.
به تناسب اینکه تعدادی از دوستان من مغازه های فروش و تعمیر اسمارت فون دارند، و من هم خیلی از مواقع مغازهی این دوستان رو پاتوق میکنم :) ، با گوشی های زیادی کار کردم. احتمالا خیلی بیشتر از اکثر شماهایی در حال خواندن این نوشته هستید. یک چیزی که همیشه برام مشهود بود، تفاوت سرعت قابل ملاحظه بین گوشی های اندروید و آیفون بوده. حالا من توی این نوشته میخوام از دید یک برنامه نویس و متخصص نرم افزار (خِیرِ سَرَم مثلا!)، براتون توضیح بدم چرا اوضاع چنین است!
پلتفرم نرم افزاری
اندروید از جاوا استفاده میکند. آیفون از آبجکتیو-سی و سوییفت بهره میبرد.
آبجکتیو-سی و سوییفت هر دو به نسبت جاوا زبان های سطح پایین تری هستند. هر چه یک زبان سطح پایین تر باشد، ممکن است زمان تولید و ساخت برنامه طولانی تر شود، ولی از آن طرف اجرای برنامه با سرعت بالاتری همراه خواهد بود.
این جاوا، آن جاوا نیست!
جاوا، یک زبان سنگین است! سنگین از نظر مصرف منابع سخت افزاری؛ ولی با اینکه یک زبان سنگین است، زبان کندی نیست! برعکس، جاوا یکی از سریع ترین زبان های برنامه نویسی است. به همین دلیل است که اغلب سرویس های بزرگ آنلاین (فیسبوک، توییتر، …) از جاوا روی سرورهای خودشان استفاده میکنند.
موضوعی که باید به آن توجه کنیم این است که سرعت جاوا فقط زمانی جلوه میکند که برنامهی شما در دراز مدت اجرا شود؛ فرضا برنامه های سرور نمونه بارز این مثال هستند که شاید ماه ها و یا حتی سال ها بدون توقف در حال اجرا باشند. اگر برنامهی جاوا عمر کوتاهی داشته باشد (فرضا برنامه ای مثل نوت پد) آن برنامه بسیار کند جلوه میکند. چرا این اتفاق می افتد؟ همراه متن باشد….
در این قسمت از نوشته، کافیست همین قدر بدانید که جاوا ای که شما میشناسید آن جاوایی نیست که روی اندروید وجود دارد. جاوا یک سیستم متسحکم و پایدار است که بیست سال است توسط سان و اوراکل و هزاران برنامه نویس فعال دیگر در حال توسعه است. اما جاوایی ای که در اندروید وجود دارد یک سیستم کاملا متفاوت و جوان است که گوگل آن را طراحی کرده و هیچ وجه مشترکی جز «اسم» و «سینتکس» مشترک با آن جاوایی که می شناسید ندارد.
بنابراین اولین مورد این است که جاوای اندروید، آن جاوای سریع و معروف نیست!
برنامه ی شما هیچ وقت اجرا نمی شود!
عبارت بالا برای خیلی ها تعجب آور است. بگذارید موضوع را کمی باز کنیم:
برنامه های کامپیوتری توسط پردازنده اجرا میشوند. زبان پردازنده، «زبان ماشین» است و هیچ زبان دیگری برایش معنا ندارد. بنابراین وقتی شما برنامه ای به جاوا یا سوییفت مینویسید، کدهای شما باید به نحوی به زبان ماشین تبدیل شوند تا برای پردازنده قابل فهم باشند.
در سوییفت، کدهای شما مستقیما به زبان ماشین تبدیل میشود. برنامه هایی که مستقیم به کد ماشین تبدیل شده اند، برنامههای «نیتیو» نام دارند.
در جاوا، کدهای شما به زبان ماشین تبدیل نمیشوند! به جایش، به یک زبان میانی به نام «بایت کد» تبدیل میشوند. بایت کدها به خودیِ خود قادر به اجرا روی پردازنده نیستند؛ برای همین درون یک سیستم نرم افزاری ثانویه به نام «ماشین مجازی» (VM) اجرا میشوند. چنین برنامه هایی که باید تحت مدیریت یک سیستم ثانویه اجرا شوند، به برنامه های «مدیریت شده» شهرت دارند. (Managed)
از همین رو، بر عکس آیفون، برنامه ای که شما برای اندروید میسازید به خودی خود اجرا نمی شود؛ در همه حال، این VM است که اجرا میگردد و کدهای شما در بهترین حالت، فقط در حال دستور دادن به سیستم VM میباشند. مانند وقتی که شما با دسته ی کنسول، در حال دستور دادن به بازیکنان بازی فیفا هستید! این واقعا شما نیستید که فوتبال بازی میکنید، شما فقط در حال دستور دادن به بازیکنان درون بازی هستید.
ممکن است سوال کنید برنامه های نیتیو هم به خودی خود کار نمیکنند و تحت سیستم عامل اجرا میشوند؛ فرض شما درست نیست! برنامه هایی که به کد ماشین ترجمه شده اند مستقیما روی پردازنده اجرا می شوند. در زمان اجرای برنامه های نیتیو، اجرای سیستم عامل کاملا متوقف می شود و پردازنده برنامه ی شما را بدون واسطه اجرا میکند. البته سیستم عامل تحت فرآیندی به نام «زمانبندی»، اجرای کدهای نیتیو و کدهای خودش را به گونه ای برای پردازنده زمانبندی میکند که پردازنده همیشه در حال سوییچ بین آن ها باشد؛ و این سوییچ کردن آنقدر سریع اتفاق می افتد که شما فکر میکنید سیستم عامل و برنامهی شما به طور هم زمان در حال اجزا هستند؛ در حالی که وقعا اینطور نیست.
توضیحی که در بالا دادیم، دقیقا به همین شکل برای نسخه های جدیدتر اندروید صدق نمیکند. با متن همراه باشید تا ذره ذره موضوع رو تشریح کنم.
سیستم VM و مشتقات آن
سیستم VM در اندروید، کارهای اساسی زیر را به عهده دارد:
- تفسیر بایت کدها و اجرای آن ها (درست شنیدید، «تفسیر»)
- سیستم کمکی زمان اجرا، ملقب به سیستم رانتایم
- سیستم مدیریت حافظه، ملقب به جی سی (GC)
- سیستم بهینه ساز زمان اجرا، ملقب به جیت (JIT)
دوباره تاکید میکنم، روند اجرای برنامه های اندروید در نسخه های جدیدتر دقیقا به این حالت نیست، اما برای روشن شدن موضوع لازم است مرحله به مرحله این مباحث را توضیح دهیم؛ پس کمی صبور باشید!
تفسیر:
اولین فرق را در همین گزینهی اول حس میکنید. با اینکه برنامه های سوییفت و جاوا هردو کامپایل میشوند، ولی جاوا برای اجرای برنامه ها بایت کدها را به شکل تفسیری اجرا میکند. عمل تفسیر در زمان اجرای برنامه صورت میگیرد بنابراین قسمتی از کند بودن برنامه به خاطر همین مرحله است که در آیفون وجود ندارد.
ران تایم:
سوییفت به نسبت جاوا زبان سطح پایین تری است و به همین دلیل ران تایم بسیار کوچک تر و سبک تری در مقایسه با جاوا دارد. دقت کنید که سیستم ران تایم، همگام با برنامه ی شما در حال اجراست. یعنی در بهترین حالت، موقع اجرا برنامه تان، در حقیقت دو برنامه کاملا مستقل در حال اجرا هستند. یکی برنامه شما که کدهایش را خودتان نوشتید، و یکی سیستم ران تایم که مدام در حال سرویس دهی به برنامه شماست. از آنجایی که ران تایم جاوا سنگین تر از سوییفت است، برنامه ها نیز به همین نسبت سنگین تر خواهند شد.
سیستم جی سی:
سیستم مدیریت حافظه، از تاثیرگذار ترین عوامل در سرعت زبان های برنامه نویسی است. سوییفت، دارای سیستم جی سی نیست! حداقل نه به آن شکلی که در جاوا وجود دارد (ARC). مدیریت حافظه در سوییفت جزو وظایف برنامه نویس است. به این معنی است که کار برنامه نویس در مدیریت حافظه سخت تر است و ممکن است با خطای بیشتری همراه باشد، اما در عوض کنترل بیشتری روی منابع حافظه و سرعت آن دارد.
در عوض در جاوا، یک سیستم جی سی کامل حضور دارد که وظیفه ی مدیریت حافظه را از دوش برنامه نویس برداشته و کار برنامه نویس را بسیار راحت کرده. این راحتی قیمت ارزانی ندارد! هر کسی که اطلاعات اندکی از سیستم های جی سی داشته باشد، به شما خواهد گفت که برای کارکرد مناسب سیستم جی سی، به طور میانگین به ۳ برابر حافظه ی بیشتر نیاز خواهد بود؛ و برای کارکرد واقعا بهینه ی آن، به ۵ تا ۶ برابر حافظه ی بیشتر نیاز است.
در زبان ساده، اگر یک برنامه ی نرمال در سوییفت نیاز به ۱۰۰ مگابایت رم داشته باشد، همان برنامه در اندروید برای اجرای بهینه نیاز به ۵۰۰ مگابایت رم دارد! برای همین است که آیفون با وجود رم کمتر، میتواند باز هم بهینه باشد ولی گوشی های اندرویدی برای زیاد کردن رم باهم مسابقه میدهند.
در حال حاضر آیفون ۷ دارای ۲ گیگ رم میباشد و گلکسی اس ۸ دارای ۴ گیگ رم است. با اینکه روی کاغذ ممکن است فکر کنید گلکسی اس رم بیشتری دارد، ولی در واقع ۶ گیگ رم کم دارد! اگر ۱۰ گیگ رم داشت، تازه رقابت مساوی میشد.
دقت کنید، توضیحاتی که دادیم دلیل بر این نیست همیشه و در همه ی اوقات این قضایا برقرار خواهد بود. فرضا ممکن است برنامه ایی در سوییفت داشته باشیم که چندین برابر بیشتر از جاوا رم نیاز داشته باشد. یا ممکن است در خیلی از موارد سیستم جی سی جاوا از فرآیند دستی کنترل حافظه در سوییف سریع تر عمل کند. چیزهایی از این دست کاملا امکان پذیر هستند ولی توضیح بیشتر درباره آن ها خارج از موضوع این نوشته است.
سیستم جیت:
در ابتدای نوشته گفتیم برنامه های جاوا سریع خواهند بود به شرطی که در مدت طولانی به اجرا درآیند (مثل برنامه های سرور). دلیل این موضوع به سیستم جیت برمیگردد. تا اینجا میدانید که برنامه ی شما به بایت کد تبدیل میشود، و نه کد ماشین؛ همچنین میدانید که بایت کد به شکل تفسیری اجرا میشود. این موضوع در سرعت برنامه تاثیر گذار است.
چیزی که باید بدانید این است که یک فرآیند دیگر همگام با اجرای برنامه شما در حال اجراست. در زمانی که برنامه ی شما اجرا میشود، یک سیستم نرم افزاری دیگر به نام جیت، مدام در حال تجزیه و تحلیل روند اجرای برنامه ی شماست. به محض اینکه جیت متوجه شود قسمتی از کدها بیشتر مورد استفاده قرار میگیرند، سعی میکند آن قسمت پر استفاده را در زمان اجرا به کد ماشین ترجمه کند. فرضا تابعی که زیاد موقع اجرای برنامه صدا زده میشود. یا حلقه هایی که چرخش طولانی دارند.
جیت با ترجمه ی این نقاط پر استفاده به کد ماشین، باعث بالا رفتن سرعت برنامه ی شما میشود. ولی نکاتی وجود دارد که باید به آن توجه کرد:
-
جیت فرآیند تجزیه و تحلیل برنامه شما را طی گذر زمان انجام میدهد. اگر برنامه ی شما زیاد عمر نکند (مثلا تلگرام را یک لحظه باز کنید، یک مسیج بخوانید، و سپس آن را ببندید)، جیت به حالتی نمیرسد بتواند نقاط پر استفاده را تشخیص دهد. برای همین برنامه های سرور که اجرای طولانی مدت دارند در گذر زمان بسیار بهینه خواهند شد. این پروسه بین جاوا کارها به « گرم شدن ماشین مجازی » شهرت دارد.
-
فرآیند تجزیه و تحلیل جیت، به موازات برنامه ی شما در حال اجراست؛ بنابراین خودش نیاز به مصرف منابع پردازنده و حافظه رم دارد و باعث سنگین شدن برنامه خواهد شد.
اگر برنامه ی شما در دراز مدت اجرا نشود، و کدهایی نداشته باشد که مدام فراخانی شوند، جیت نه تنها سرعتی به برنامه اضافه نخواهد کرد، بلکه خودش یک بار اضافی خواهد بود.
سوییفت، سیستم جیت ندارد. به همین راحتی!
آرت وارد میشود
از اندروید ۵ به بعد، روند اجرای برنامه ها تغییر کرد. برنامه ها حالا زیر نظر ART که سیستم ران تایم جدید اندروید است اجرا میشوند. آرت چه مزایایی دارد:
-
موقع نصب برنامه، بایت کدهای شما به کد ماشین ترجمه میشوند. بنابراین دیگر از عملیات تفسیر خبری نیست. همین باعث میشود زمان استارت برنامه کاهش یابد.
-
برعکس جیت که در زمان اجرای برنامه بهینه سازی انجام میداد، آرت سعی میکند تا جایی که می تواند بهینه سازی را هنگام نصب برنامه اعمال کند تا دیگر در زمان اجرای برنامه بار اضافی به برنامه تحمیل نشود. یعنی دیگر خبری از جیت نیست.
-
همچنین آرت سیستم ران تایم و جی سی بهینه تری دارد.
این موارد باعث شده اند که سرعت اندروید از نسخه ی ۵ به بالا، اصلا قابل مقایسه با نسخه های پایین تر نباشد. و این تفاوت سرعت کاملا قابل لمس است. با تمام این توضیحات، آرت باز هم آن چیزی نیست که باید باشد. ران تایم بزرگ و سنگین سر جایش است. سیستم جی سی جایی نرفته. و از همه مهم تر آرت نمی تواند به هوشمندی جیت نقاط حساس کد را بهینه کند. به همین دلیل است که از اندروید ۷ به بعد، دوباره جیت سر و کله اش پیدا شده. روز از نو و روزی از نو!
توجه بیشتر به رندر گرافیکی
پروسه ای که وظیفه ی رندر گرافیک را به عهده دارد، از اولویت بالایی در آیفون برخوردار است. یعنی آیفون زمان بیشتری از پردازنده را به این پروسه اختصاص میدهد. برای آیفون این قضیه که کدهای پشت صحنه کمی کندتر انجام شوند زیاد مهم نیست، مهم این است تا جایی که ممکن است کاربر این کندی را در رابط گرافیکی برنامه حس نکند. تا زمانی که کاربر کندی را «حس» نکند، برنامه از نظر او سریع قلمداد میشود.
بنابراین ممکن است انجام یک کاری در اندروید ۲ ثانیه طول بکشد، اما انجام همان کار در آیفون۳ ثانیه. با این فرق که کاربر کندی را در رابط کاربری آیفون کمتر از اندروید حس خواهد کرد. در اندروید با اینکه آن کار زودتر تمام شده، اما ممکن است در رابط گرافیکی افت فریم به وجود بیاید. در واقع اندروید سعی میکن «تمام وظایف» را با سرعت بالا به اتمام برساند، ولی آیفون فقط روی رندر گرافیکی حساس است و اگر بقیه وظایف کمی کندتر انجام شوند زیاد مهم نیست. مهم تر این است که کندی از «چشم» کاربر دور بماند!
پلتفرم سخت افزاری
اپل بیشتر از آنکه یک شرکت نرم افزاری باشد، یک شرکت سخت افزاری است. علاوه بر آن، از قدیمی ترین شرکت ها در ساخت سیستم عامل است.
از آن طرف گوگل به نسبت اپل، هم عمر کمتری دارد، و تجربه ی کمتری در ساخت سخت افزار و سیستم عامل. اندروید حتی جزو محصولات گوگل هم نبوده و از شرکت دیگری خریداری شد.
ممکن است بگویید شرکت بزرگی مثل گوگل که «تجربه» حالیش نمی شود! پول دارد و افراد مورد نیازش را استخدام میکند. دقت کنید منظورم از تجربه این نیست که مثل شاگرد نجار کنار استادش بشیند و یاد بگیرید. خیر؛ وقتی مانند اپل محصول اصلی شما سخت افزار و سیستم عامل باشد، پول بیشتری در این حوضه خرج میکنید. پول برای استخدام افراد. پول برای تحقیق در این زمینه ها. پول برای آزمایشات فراوان. و وقتی این کار را برای چندین دهه انجام میدهید، آن وقت رقابت با شما سخت خواهد بود.
همانطور که اگر اپل بخواهد وارد کار موتورهای جستجو شود باید راه درازی را طی کند تا به گوگل برسد، گوگل هم در زمینه سخت افزار و سیستم عامل نمیتواند به این راحتی با اپل رقابت کند. حتی مایکروسافت هم به این راحتی توانایی چنین کاری را ندارد. مایکروسافت یک شرکت نرم افزاریست. اپل جزو معدود شرکت هایی است که از صفر تا صد محصولاتش (سخت افزار و نرم افزار) را خودش توسعه میدهد.
در بالاتر گفتیم که اندروید برای بهینه بودن، به نسبت آیفون رم بالاتری نیاز خواهد داشت. که در حال حاضر این میزان رم در حدی نیست که بتواند با آیفون رقابت کند؛ حتی با اینکه رم بیشتری از آیفون دارد!
از نظر پردازنده هم اندروید نیاز دارد که به طور میانگین ۳ برابر سریع تر از آیفون باشد. متاسفانه این مورد هم پا برجا نیست. اپل همیشه سریع ترین پردازنده ها را تولید میکند. بهترین پردازنده های گوشی های اندروید همیشه یا از آیفون عقب تر هستند، و اینکه سرعت شان در حد ۱۰-۲۰ درصد بالاتر است. که خیلی با ۳ برابر بیشتر، فاصله دارد!
اندروید سعی کرده با اضافه کردن تعداد هسته های پردازنده با آیفون رقابت کند. اما هر برنامه نویسی می داند که تعداد هسته های پردازنده آنقدرها هم مهم نیست، وقتی نتوانید از آن ها استفاده کنید! برنامه نویسی همروند و موازی خودش یک مبحث مفصل در علوم کامپیوتری است و خیل عظیمی از برنامه نویسان موبایل آشنایی زیادی با آن ندارند. از طرفی، شاید نقش پردازشگر گرافیکی روی موبایل پر رنگ تر از پردازنده ی اصلی باشد. که از نظر پردازنده ی گرافیکی هم آیفون همیشه یکه تاز بوده.
چون اپل سخت افزار و نرم افزار را خودش توسعه میدهد، تمام قسمت های سیستم تحت کنترل خودش است. خیلی ها فکر میکنند فقط تعداد هسته های پردازنده و میزان رم مهم است؛ آیا مادربورد و چیپ های جانبی هیچ کدام مهم نیستند؟ وضعیت این ها در دنیای اندروید چگونه است؟ در این زمینه هر گوشی اندروید برای خودش سازی میزند! در حالی که آیفون طراحی یکپارچه ای دارد و این یکپارچگی در تمام قطعات سخت افزاری اعمال شده.
پردازنده بالاتر، رم بالاتر، و اندازه اسکرین بالاتر خرج دارد! از طرفی تولید کنندگان اندروید سعی میکنند کاستی هایش را با موارد جانبی مانند دوربین بهتر یا سیستم صوتی بالاتر جبران کنند. همه ی اینها خرج دارد! قیمت تمام شده ی این ها مسلما از آیفون بالاتر خواهد بود.
در حال حاضر، آیفون ۷ با ۱۲۸ گیگ حافظه، ۷۴۹ دلار قیمت دارد.
گلکسی اس ۸ سامسونگ، با ۶۴ گیگ حافظه، ۷۵۰ دلار است.
به عبارتی شما برای اندروید پول بیشتری میدهید، اما کیفیت بالاتری دریافت نمیکنید. این قضیه که آیفون در بازار ایران قیمت هایش الکی و روی هواست، دلیل بر این نیست که واقعا از پرچمداران اندروید گران تر است.
آیا من که گلکسی اس ۸ را مثال میزنم تا به حال آن را در دستم گرفته ام و با آن کار کرده ام که درباره آن ابزار نظر میکنم؟
خیر. اما کار نکرده میدانم که باز هم بهینگی آیفون را نخواهد داشت. و اس ۹ هم همینطور. و اس ۱۰ هم همینطور. و گوشی هایی که بعد از آن خواهند آمد! مگر اینکه در دنیای اندروید اتفاق خاصی رخ دهد… اما تا رسیدن آن روز، حداقل شما میدانید که تفاوت سرعت آیفون و اندروید به چه دلایلی است.
نظرات
comments powered by Disqus