کدام زبان برنامهنویسی انرژی کمتری مصرف میکند؟
کیفیت خروجی زبانهای برنامهنویسی، بسته به نوع آنها و حتی مهارت برنامهنویس، با هم تفاوت دارد. مصرف برق، یکی دیگر از فاکتورهای دخیل در کارایی سیستمعاملها است که برخی اوقات، دستکم گرفته میشود. اکنون این سؤال ایجاد میشود که آیا مصرف انرژی، نشاندهندهی کیفیت یک زبان برنامهنویسی هست یا خیر؟
گروهی متشکل از محققان ۳ دانشگاه مختلف در پرتقال، سال گذشتهی میلادی تحقیقی را برای پاسخ به سؤال فوق انجام دادند که منجر به مقالهای بهنام Energy Efficiency Across Programming Languages شد. آنها آزمایش خود را روی ۱۰ مسئلهی نرمافزاری بین ۲۷ زبان برنامهنویسی انجام دادند و در حین اجرای نرمافزار حاصل، مقدار مصرف برق هریک از آنها را بررسی کردند. بهعلاوه، سرعت و مقدار اشغال حافظهی رم نیز مورد بررسی قرار گرفت.
محققان پروژهی تحقیقاتی، ۱۰ مسئلهی آزمایشی را در سرویس Computer Language Benchmark Game اجرا کردند. آن سرویس، یک پروژهی نرمافزاری آزاد است که برای مقایسهی کارایی زبانهای برنامهنویسی استفاده میشود و تعدادی مسئلههای الگوریتمی در خود دارد. بهعلاوه، فریمورکی برای اجرای آزمایشها نیز به کاربر عرضه میشود.
سرویس مورد استفاده، قبلا بهنام The Great Computer Language Shootout شناخته میشد. محققان اعتقاد دارند استفاده از سرویس بنچمارک، به آنها امکان داد تا تعدادی برنامهی قابل مقایسه و توسعهیافته را در دسترس داشته باشند. بهعلاوه، سرویس، نسخههای مختلف کامپایلر و راهکارهای متعدد اجرا را نیز در اختیار آنها قرار میداد.
پیادهسازی انواع مختلف بنچمارک، برای آزمایش کارایی و مصرف برق، حیاتی بود. درواقع، نتایج آزمایشها بسته به نوع تست، تغییر میکرد و باید گسترهای جامع مورد آزمایش قرار میگرفت. بهعنوان مثال، زبان برنامهنویسی C از لحاظ کلی، سریعترین زبان با مصرف بهینهی برق بود، اما در آزمایشی شامل اسکن پایگاه دادهی DNA برای یافتن ژنتیک خاص، زبان Rust نتایج بهتری داشت و C در رتبهی سوم مصرف انرژی قرار گرفت.
در همان آزمایش DNA، انتخاب بهترین زبان، به معیارهای آزمایش نیز بستگی داشت. در معیار سرعت، C پس از Rust در رتبهی دوم قرار گرفت، اما در معیار اشغال حافظهی رم، Rust سقوطی ۹ پلهای داشت. زبان فورترن، در بررسی براساس معیار مصرف انرژی، رتبهی دوم را داشت، اما با مرتب کردن نتایج براساس زمان مورد نیاز برای اجرای فرایند،۶ پله سقوط کرد.
جدول کامل مقایسهی زبانهای برنامهنویسی براساس زمان، انرژی و اشغال حافظهی رم
محققان در مقالهی خود تأکید کردند که با دقت از راهنمای استاندارد سرویس CLBG در انتخاب نسخهی کامپایلر برنامهها و روندهای بهینهسازی، پیروی کردند. مصرف برق هر آزمایش نیز توسط ابزاری از اینتل بهنام Running Average Power Limit استفاده شد. برای بهینهسازی نتایج و محاسبهی بهتر میانگین، همچنین خارج کردن فاکتورهایی همچون کش یا سریعتر بودن در اجرای اولیه، هر آزمایش ۱۰ بار تکرار شد. بههمین دلیل، محققان ادعا میکنند که نتایج، قابل اعتماد هستند.
سختافزار و سیستمعامل همهی زبانها در آزمایش، یکسان بود
فاکتور دیگری که برای بهینهسازی نتایج تنظیم شد، سیستمعامل و سختافزار مورد استفاده بود. همهی آزمایشها روی دستگاهی با ۱۶ گیگابایت رم، پردازندهی اینتل Core i5 3.20 GHz Haswell و سیستمعامل لینوکس اوبونتو سرور با کرنل نسخهی 4.8.0 انجام شد. درنهایت، نتایج تحقیقات، موارد قابل توجهی را روشن کرد. بهعنوان مثال:
زبان Lisp، بهطور میانگین ۲.۲۷ برابر C انرژی مصرف میکند (۱۳۱.۳۴ ژول). بهعلاوه، در مقایسه با پاسکال، ۲.۴۴ برابر برای اجرای یک برنامه، زمان نیاز دارد (۴۹۲۶.۹۹ میلی ثانیه) و همچنین، ۱.۹۲ برابر حافظهی رم نیاز دارد (۱۲۶.۶۴ مگابیت).
محققان، نتایج را بین زبانهای کامپایل شده و تفسیر شده هم بررسی کردند. بهعلاوه، دستهبندی مجزایی هم برای زبانهای اجرا شده در ماشینهای مجازی، در مقاله افزوده شد. دستهبندیهای دیگر در مقاله، شامل مقایسهی پاردایمهای مختلف برنامهنویسی همچون انواع شیٔگرا و اسکریپتی میشود.
مقایسهی زمان و انرژی مصرفی
آیا سرعت بهمعنای مصرف انرژی کمتر است؟
مقالهی منتشر شده، بهطور جدی با نظریهی تأثیر سرعت بر کاهش مصرف انرژی مخالفت کرد. در متن مقاله آمده بود که محاسبهی انرژی مصرفی، فرمولی فیزیکی شبیه به E=T*P نیست که انرژی را به زمان وابسته کند. بخشی از دلیل تناقض نیز، مصرف انرژی بهصورت غیرمنظم است. درواقع، نرخ ثابتی برای مصرف انرژی یک زبان برنامهنویسی، وجود ندارد. درنتیحه، نتایج تحقیق مذکور میتواند یافتههای محققان پیشین و نظریههای آنها پیرامون تأثیر سرعت بر مصرف انرژی را تحت تأثیر قرار دهد.
در یکی از آزمایشهای صورت گرفته، برنامهی نوشته شده در زبان Chapel، نسبت به برنامهای به زبان پاسکال، ۵۵ درصد زمان کمتری برای اجرا نیاز داشت. درحالیکه برنامهی زبان پاسکال، انرژی کمتری (به میزان ۱۰ درصد) مصرف کرد. درنهایت با وجود آن که بسیاری، هنوز سرعت را با مصرف انرژی مرتبط میدانند، محققان مذکور در مقالهی خود بهروشنی اعلام کردند که «یک زبان برنامهنویسی سریعتر، لزوما مصرف انرژی کمتری ندارد».
سرعت بیشتر لزوما بهمعنای مصرف پایینتر انرژی نیست
پاسخ دادن به سؤال این بخش، دشواریهای زیادی دارد، چرا که مصرف انرژی، به فاکتورهای بسیار متعددی وابسته میشود که از آن میان میتوان به کامپایلر و حتی کتابخانههای مورد استفاده اشاره کرد. محققان در بخش مهم دیگری از مقالهی خود، منبع مصرف انرژی برنامهها را نیز بررسی کردند. آنها میگویند که اکثر برق مصرفی (حدود ۸۸ درصد) توسط CPU مصرف میشود و ارتباطی هم به کامپایل شدن، تفسیر شدن یا اجرا روی ماشینهای مجازی ندارد. البته، برنامههای تفسیر شده، نتایج متفاوتی را در شرایط مختلف نشان دادند و بازهی تنوع آنها از ۸۱.۵۷ درصد تا ۹۲.۹ درصد، تفاوت داشت.
مقایسه براساس اشغال حافظهی رم
نتیجهی مهم دیگر در تحقیقات مذکور، وابستگی اوج استفاده از DRAM را به انرژی مصرفی، نقض کرد. بههرحال، با وجود تمامی یافتههای بالا، پاسخی تقریبا مثبت به سؤال این بخش داده میشود. در مقالهی منتشر شده برای این تحقیق میخوانیم:
۵ زبان برنامهنویسی اول براساس مصرف انرژی، در دستهبندی براساس زمان اجرای برنامهها نیز با تفاوتهایی جزئی در همان رتبهها قرار میگیرند.
از میان ۱۰ مسئلهی آزمایشی انجام شده، در ۹ عدد از آنها، بالاترین امتیاز از لحاظ سرعت و بازدهی، از زبانهایی بهدست آمد که بین ۳ مورد برتر از لحاظ مصرف انرژی قرار داشتند. در بخش دیگری از مقاله گفته شد:
باور عمومی بر آن است که ۳ زبان برتر برنامهنویسی یعنی C و ++C و Rust، بهبهترین نحو بهینهسازی شده و بازدهی بالایی دارند. دادههای ما در تحقیقات نیز همین باور عمومی را تصدیق میکنند.
با وجود گفتههای بالا، وقتی زبانهای برنامهنویسی دیگر را طبق فاکتورهای سرعت و مصرف انرژی مرتب کنیم، نتایج برابری مشاهده نمیشود. تنها ۴ زبان، رتبهبندی برابری در فهرست زمان و مصرف انرژی داشتند (OCaml، Haskel، Racket و Python).
دستهبندی براساس پارادایمهای برنامهنویسی
مزایای زبانهای کامپایل شده
یکی از نتایج جالب و مهم آزمایشها، دربارهی زبانهای برنامهنویسی کامپایل شده بود. آن زبانها، همیشه در بازدهی انرژی و سرعت، بالاتر از سایر تصور میشوند. نتایج مقاله نیز تاحدودی آن تصورات را تأیید کرد. بهطور میانگین، زبانهای کامپایل شده، ۱۲۰ ژول انرژی برای اجرای راهکارهای نرمافزاری مصرف کردند، درحالیکه زبانهای اجرا شده روی ماشین مجازی یا تفسیری، بهترتیب ۵۷۶ و ۲۳۶۵ ژول انرژی نیاز داشتند.
در مقایسهی زمانهای اجرای برنامهها، زبانهای کامپایل شده باز هم نتایج مثبتی نشان دادند. در نتایج آن بخش گفته شد که زبانهای کامپایل شده بهصورت میانگین ۵۱۰۳ میلیثانیه زمان نیاز داشتند. درحالیکه، زبانهای اجرا شده روی ماشین های مجازی عدد ۲۰۶۲۳ میلیثانیه را برای زمان نشان دادند و همین مقدار، برای زبانهای تفسیری به ۸۷۶۱۴ میلیثانیه رسید. درنهایت، ۴ عدد از ۵ زبان برتر هر ۲ دستهبندی زبانهای کامپایل شده بودند و تنها جاوا، مثال نقض فهرستها بود.
زبانهای کامپایل شده هم از لحاظ زمان و هم انرژی، بازدهی بیشتری داشتند
در میان زبانهای برنامهنویسی با کمترین سرعت، ۵ زبان کند فهرست، نمونههای تفسیری یعنی Lua، Python، Perl، Ruby و Typexcript بودند. بهعلاوه، زبانهای با بیشترین نرخ مصرف انرژی نیز از همان نوع بودند: Perl، Python، Ruby، JRuby و Lua. البته، در نوعی از برنامهنویسی که عبارتها بهصورت سادهسازی شده در زبانهای تفسیری استفاده شدند، ۳ عدد از آنها، Typescript، JavaScript و PHP در میان برترین زبانهای با بازدهی انرژی بالا قرار داشتند.
زبانهای کامپایل شده، در مقایسهی میزان اشغال فضای رم، مانند زمان و مصرف انرژی، بالاترین رتبهها را به خود اختصاص دادند. بهصورت میانگین، آن زبانها به ۱۲۵ مگابیت حافظه نیاز داشتند و زبانهای اجرا شده در ماشینهای محازی، ۲۸۵ مگابیت حافظه اشغال میکردند. زبانهای تفسیری در این بخش نیز امتیاز پایینی داشته و به ۴۲۶ مگابیت حافظهی رم نیاز داشتند. آن زبانها، در رتبهبندی اشغال فضای رم، پایینترین رتبهها را به خود اختصاص دادند که بهعنوان مثال میتوان JRuby، Dart، Lua و Perl را مثال زد. زبان دیگر در میان پایینترین نمونهها از لحاظ اشغال فضای رم، Erlang بود که البته، زبانی تفسیری نیست.
از لحاظ پارادایمهای برنامهنویسی، زبانهای دستوری (Imperative) به ۱۱۶ مگابیت حافظهی رم نیاز دارند. زبانهای شیٔگرا همان آزمایشها را با ۲۴۹ مگابیت، زبانهای تابعی با ۲۵۱ مگابیت و زبانهای اسکریپتی با ۴۲۱ مگابیت حافظهی رم، انجام میدهند. درواقع، زبانهای دستوری در دستهبندیهای دیگر همچون سرعت و مصرف انرژی نیز رتبههای بهتری را بهخود اختصاص دادند.
در مقایسهی پارادایمهای برنامهنویسی، فاکتورهای متعددی باید مورد بررسی قرار گیرند. کاملا مشخص است که پارادایمها و حتی زبانهای هر پاردایم، تأثیرات متفاوتی روی مصرف انرژی، زمان و حافظهی مورد نیاز دارند. بههمین دلیل، اینکه کدام فاکتور برای نتیجه مهمتر باشد، به برنامهنویس و پروژهی در دست اجرای او بستگی دارد.
برخی از پروژههای نرمافزاری، نیازمند درنظرگرفتن همزمان ۲ یا چند فاکتور هستند. بهعنوان مثال، شاید انرژی و زمان اجرا، در پروژهای اهمیت بالا داشته باشد. در چنان موردی، C بهترین گزینه خواهد بود چون در هر ۲ بخش، در صدر جدل قرار دارد. در نمونهای دیگر که زمان درکنار مصرف کمتر حافظهی رم، هدف شما باشد، زبانهای C، Pascal و Go انتخابهای مناسبی هستند. اگر هر ۳ مورد بالا یعنی زمان، انرژی و حافظهی رم برای شما اهمیت دارند، باز هم محققان همان ۳ زبان فوق را پیشنهاد میدهند.
در پایان مقاله، محققان اعلام کردند که در بررسیهای آتی، تأثیر گذر زمان بر اشغال حافظهی رم را بررسی خواهند کرد. نتایج کامل تحقیقات انجام شده، در لینک منبع موجود است و علاقهمندان میتوانند برای بررسیهای عمیقتر، از آن استفاده کنند. بهعنوان مثال، توسعهدهندههای حوزهی اینترنت اشیاء یا زمینههای مشابه، میتوانند با بررسی نتایج، زبانهایی با مصرف انرژی پایینتر را انتخاب کنند.
درنهایت، مقالهی منتشر شده هم برنامهنویسان را با ابهام رها میکند. محققان میگویند که اگر بهدنبال یک پاسخ ثابت و نسخهای نهایی برای انتخاب زبان برنامهنویسی هستید، به پاسخ نخواهید رسید. آنها میگویند با وجود اینکه نتایح، برخی زبانها را از لحاظ سرعت و مصرف انرژی بالاتر از سایر قرار میدهند، هیچگاه نمیتوان زبانی را کاملا بهتر از زبان دیگر دانست. درنهایت باید بدانیم که موقعیت و شرایطی که زبان در آن استفاده میشود، جنبهای حیاتی در بازدهی مصرف انرژی آن دارد.