بررسی کارایی زبانهای برنامهنویسی اسکریپتی
شنبه, ۴ آذر ۱۳۹۱، ۱۱:۱۵ ب.ظ
در اینجا میخواهیم کارایی زبانهای اسکریپتی را مقایسه کنیم. در این مقایسه، زبانهای مطرح اسکریپتی را با زبانهای غیر اسکریپتی مانند ++C مقایسه میکنیم. این مقایسهها روی یک الگوریتم روی زبانهای متفاوت روی یک کامپیوتر Intel® Q6600® quad-core
با ورودی یکسان اجرا شده است. بناربراین تنها وجه تمایز، زبان پیادهسازی است. (طبیعتا اگر غیر از این بود مقایسه از اعتبار ساقط میشد.) سیستم عامل این کامپیوتر نیز اوبونتوی x64 است.
اولین الگوریتمی که بررسی میکنیم، مربوط است به تحلیل اجسام آسمانی هنگامی که در حال حرکتاند. در این تست، همان طور که انتظار می رود ++C سریعتر از بقیه است. در جدول زیر میتوانیم زبانهای مهم مورد بحث را ببینیم. در این تست، عملیات اعشاری به کار رفته است.
زبان | زمان اجرا(ثانیه) | حافظه(کیلو بایت) | طول کد(بایت) | توزیع روی پردازندهها |
++C | ۱۰.۷۹ | ۸۲۴ | ۱۷۴۹ | ۰٪ ۰٪ ۰٪ ۱۰۰٪ |
Java | ۲۲.۴۹ | ۱۷۲۶۰ | ۱۴۲۴ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
Racket | ۵۵.۸۳ | ۲۶۵۲۸ | ۱۶۸۹ | ۰٪ ۰٪ ۰٪ ۱۰۰٪ |
PHP | ۱۱ دقیقه | ۳۲۴۸ | ۱۰۸۲ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
Python | ۱۶ دقیقه | ۶۲۴۸ | ۱۱۸۱ | ۰٪ ۲۴٪ ۴۶٪ ۳۰٪ |
Perl | ۱۶ دقیقه | ۲۶۹۲ | ۱۴۰۱ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
Ruby | ۲۴ دقیقه | ۴۸۹۲ | ۱۱۳۷ | ۰٪ ۰٪ ۰٪ ۱۰۰٪ |
در این جا یک الگوریتم محاسباتی سنگین را میبینیم که همان طور که انتظار میرود ++C و Java به ترتیب در آن اول و دوم هستند. البته از نظر حافظه، میدانیم که جاوا بسیار اسراف کار است که در این جدول نیز مشخص است.
تست بعدی مربوط به محاسبهی ارقام عدد پی است. این تست یک تست الگوریتمی است. در این تست از اعداد اعشاری استفادهای نشده است و محاسبات فقط با اعداد صحیح صورت گرفته است.
زبان | زمان اجرا(ثانیه) | حافظه(کیلو بایت) | طول کد(بایت) | توزیع روی پردازندهها |
++C | ۲.۳۰ | ۱۶۴۴ | ۶۸۲ | ۰٪ ۰٪ ۰٪ ۱۰۰٪ |
Java | ۴.۴۸ | ۶۴۸۱۲ | ۱۸۲۶ | ۷۳٪ ۴۳٪ ۴۰٪ ۷۳٪ |
Racket | ۲.۳۶ | ۲۴۰۸۸ | ۱۱۲۲ | ۰٪ ۰٪ ۱٪ ۱۰۰٪ |
PHP | ۳.۵۹ | ۴۶۶۸ | ۵۳۷ | ۰٪ ۰٪ ۱٪ ۱۰۰٪ |
Python | ۲.۴۴ | ۷۰۲۸ | ۲۵۵ | ۰٪ ۰٪ ۱۰۰٪ ۱٪ |
Perl | ۴.۴۷ | ۴۰۱۲ | ۲۶۱ | ۰٪ ۰٪ ۵٪ ۹۵٪ |
Ruby | ۸.۹۲ | ۱۲۷۰۴ | ۲۴۲ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
در این تست نیز مشاهده میشود که Java و Racket بیشترین حافظه را مصرف میکنند. تنها نکتهی شگفتانگیزی که وجود دارد پیشی گرفتن PHP از Java است در این تست!
تست بعدی، مربوط به برنامهسازی همروند است. در این تست ۵۰۳ thread ساخته خواهد شد که به هم به طور حلقهای متصل میشوند (به هم reference خواهند داشت). سپس با هم بازی «هپ» را انجام میدهند به این صورت که یک عدد را به اولین thread میدهیم و سپس این thread این عدد را یکی کم میکند و به بعدی میدهد و الی آخر. هنگامی که این عدد صفر شود برنامه خاتمه مییابد. این تست زمان جابهجایی میان threadها را مشخص میکند.
زبان | زمان اجرا(ثانیه) | حافظه(کیلو بایت) | طول کد(بایت) | توزیع روی پردازندهها |
++C | ۲۵۹.۹۱ | ۴۶۰۴ | ۵۸۸ | ۳۰٪ ۳۰٪ ۶٪ ۶٪ |
Java | ۶ دقیقه | ۲۸۹۵۰۰ | ۵۳۰ | ۴۴٪ ۲٪ ۲٪ ۴۴٪ |
Racket | ۱۷۵.۴۶ | ۶۷۰۴۸ | ۲۶۲ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
PHP | --- | --- | --- | --- |
Python | ۶ دقیقه | ۱۰۳۷۶ | ۲۸۸ | ۴۹٪ ۱٪ ۱٪ ۴۹٪ |
Perl | ۹ دقیقه | ۷۰۲۳۶۰ | ۴۸۹ | ۲۸٪ ۲۸٪ ۲۷٪ ۲۷٪ |
Ruby | ۱۹ دقیقه | ۱۷۲۳۶ | ۲۱۵ | ۵۸٪ ۶٪ ۱۱٪ ۵۸٪ |
نکتهی جالب این است که Racket عملا برنامه را به صورت موازی اجرا نمیکند!
تست آخر روی زمان اجرا و حافظهی مورد استفادهی برنامههای نوشته شده تحت این زبانها است برای انجام کارهای مربوط به پردازش متن. همان طور که میتوان انتظار داشت، زبانی مانند Perl که به هدف انجام پردازش روی متن طراحی شدهاست، باید در این حوزه بسیار موفق ظاهر شود.
زبان | زمان اجرا(ثانیه) | حافظه(کیلو بایت) | طول کد(بایت) | توزیع روی پردازندهها |
++C | ۴.۱۱ | ۱۶۳۹۵۶ | ۶۹۵ | ۳۶٪ ۷۶٪ ۲۳٪ ۲٪ |
Java | ۶.۳۹ | ۶۲۱۷۱۲ | ۱۴۱۰ | ۸۷٪ ۸۷٪ ۸۶٪ ۹۶٪ |
Racket | ۴۰.۵۰ | ۶۴۰۲۴۰ | ۵۲۷ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
PHP | ۲۶.۷۳ | ۲۲۳۹۹۲ | ۴۵۹ | ۰٪ ۰٪ ۱۰۰٪ ۰٪ |
Python | ۱۲.۸۸ | ۲۵۵۷۲۴ | ۴۷۸ | ۴۱٪ ۳۳٪ ۹۹٪ ۳۲٪ |
Perl | ۱۰.۴۰ | ۱۳۹۶۷۶ | ۵۲۷ | ۶۹٪ ۷۱٪ ۷۱٪ ۹۰٪ |
Ruby | ۱۳.۹۹ | ۲۷۹۰۹۲ | ۵۰۱ | ۴۱٪ ۴۰٪ ۴۱٪ ۱۰۰٪ |
همان طور که دیده میشود Perl با وجود این که یک زبان اسکریپتی است در این حوزه در حدود جاوا کارایی دارد.
منابع:
۹۱/۰۹/۰۴