در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
مساله ایجاد استاندارد، سبب افزایش چشمگیر اعتباراین زبان در جامعه برنامهنویسان شده است و به نظر میرسد که برنامهنویسان حرفهای در آینده و به مرور زمان سرمایهگذاری گستردهای روی آن انجام دهند. این هفته میخواهیم کارایی (Performance) زبان گرووی را با برخی زبانهای مشابه مقایسه کنیم.
آزمایش کارایی کد
بهترین روش برای آزمودن کارایی یک زبان و مقایسه آن با زبانهای دیگر، نوشتن کد یک پروژه خاص به آن زبانها و مقایسه برخی از پارامترهای کدها با یکدیگر است. اما اینکه کد مورد بحث باید شامل چه بخشهایی باشد، و اینکه چگونه میتوان با نوشتن کمترین کد، در کوتاهترین زمان ممکن دو زبان را با یکدیگر مقایسه کرد، موضوعی تخصصی است.استیو مک کانل، که از متخصصان برجسته مهندسی نرمافزار است دست کم سه نوع آزمون را برای این منظور پیشنهاد میکند.
نخستین آزمون عبارت است از ایجاد یک شیء و صدا کردن چند متد درون این شی. در آزمون دوم میتوان آرایههای یک بعدی و دو بعدی را ایجاد و آنها را مقداردهی کرد و آخرین روش مقایسه دو عدد صحیح با یکدیگر است. هر آزمون را حداقل هزار بار و حداکثر صد هزار بار اجرا میکنیم.
نتایج مقایسه گرووی و جاوا نشان میدهد که زمان اجرای متدهایی که از درون دو شی جاوا و گرووی صدا زده میشوند تقریبا یکسان و بسیار بالا است. آرایهها در گرووی سریعتر از جاوا هستند با این حال در هر دو زبان این زمان قابل ملاحظه است. مقداردهی به اعداد تقریبا هیچ زمانی نمیگیرد.
نتایج این آزمونها نشان میدهد که گرووی زمانی که آزمونها تنها یک بار تکرار شوند، کند است، در حالی که اگر تعداد تکرار آزمونها زیاد باشد این مشکل پیش نمیآید.
دلیل این امر وجود فیلدهای استاتیک است که وقتی از یک کلاس گرووی برای اولین بار یک شیء ایجاد میکنیم باید مقداردهی اولیه شوند. زمانی که آزمون نخست را برای بار اول انجام میدهیم، زمان اجرا بسیار بالاست و سپس این زمان به میزان قابل ملاحظهای کاهش مییابد. سپس هنگامی که این آزمون را برای هزارمین بار تکرار میکنیم زمان اجرا مانند اولین بار بسیار زیاد است. این نتایج به خوبی مساله را توجیه میکنند.
از سوی دیگر زمانی که تعداد تکرارآزمونها بیش از هزار بار باشد، جاوا تقریبا هزار بار سریعتر از گرووی است و این مساله در مورد همه آزمونها صدق میکند.
بهبود در خوانایی، سرعت در تولید کد؟
علاوه بر آزمونهای یاد شده، یکی از مواردی که در بررسی کارایی کد مورد نظر قرار میگیرد، خوانایی کد است. شیب منحنی یادگیری برای برنامهنویسانی که به زبان جاوا مسلط باشند کاملا مسطح است و این به آن معنی است که تفاوتهای قابل ملاحظهای بین دستور زبان این دو زبان وجود ندارد. از سوی دیگر نوشتن کد به زبان گرووی به مراتب کمتر از نوشتن همان کد به زبان جاوا زمان میگیرد.
به اعتقاد بسیاری از برنامهنویسان حرفهای خوانایی، قدرت و سرعت تولید کد از جمله عواملی هستند که در برنامهنویسان انگیزه لازم برای استفاده از گرووی بوجود میآورند. در مجموع بهنظر میرسد که اگرچه گرووی بهمراتب کندتر از جاوا است، نتایج آزمونهای انجامشده نشان میدهد که آینده گرووی درخشان است. آزمون ایجاد یکی از اجزای جاوا (Java bean)نشان میدهد که حتی اگر صد هزار عدد از این اجزا را با استفاده از گرووی ایجاد کنیم، زمان اجرا از نیم ثانیه کمتر است.
اگرچه در برنامهنویسی واقعی ما هرگز به ایجاد تعداد بسیار زیادی از اجزا نیاز نداریم، اما این موضوع یکی از نقاط قدرت گرووی است که استفاده از آن را بجای جاوای عادی بسیار مناسب میکند. نکته مهم دیگر این است که گرووی توابع getter و setter را به طور خودکار اجرا میکند. از سوی دیگر، در هر موردی که کد گرووی از کارایی کافی برخوردار نباشد میتوان آن را به سادگی با کد جاوا جایگزین کرد.
نتایج حاصل از ایجاد یک آرایه و مقداردهی آن نیز بهتر از جاوا است. از سوی دیگر، تاکنون نتایج هیچیک از آزمونهای پیچیدهتری که از موضوع بحث ما خارج هستند، موردی را که حاکی از عدم کارایی گرووی در مقایسه با جاوا باشد نشان نداده است. به این ترتیب میتوان نتیجه گرفت که جایگزین کردن کد جاوا با کد گرووی در اکثر موارد امکانپذیر است.
مقایسه گرووی با روبی
در آزمون مشابهی پیادهسازی، سرعت و میزان مصرف حافظه توسط گرووی با JRuby مقایسه شد. نتایج حاصل از این مقایسه نشان داد که در همه موارد فوق بدون استثنا، گرووی بهتر از جیروبی عمل میکند.
از دلایلی که سبب این برتری میشود اپتیمایز شدن بهتر حلقههای تکرار در گرووی است. با توجه به این که جیروبی سریعتر از روبی است و گرووی از هر دو آنها سریعتر است. در مجموع میتوان گفت که در مورد همه زبانهایی که روی JVM اجرا میشوند، گرووی بیشترین میزان کارایی را دارد. از آنجایی که گرووی میتواند کدهای جاوا را نیز کامپایل و اجرا کند، قدرت مانور بیشتری نسبت به دیگر زبانهای این گروه دارد. ضمن اینکه در مواردی که کارایی آن به هر دلیلی افت میکند، میتوان آن را با جاوا جایگزین کرد. در حال حاضر گرووی در برخی از بخشهای مرتبط با سختافزار سیستم مانند مکملهای اعداد، از برخی کاستیها رنج میبرد اما با گذشت زمان خلا موجود در این زبان به سرعت در حال پر شدن است.
مقایسه گرووی با جایتون
آخرین عضو از خانواده زبانهایی که روی ماشین مجازی جاوا اجرا میشوند Jython است. این زبان در واقع یک درگاه برای تبدیل کدهای جاوا به کد پایتون است و کندترین زبان در این خانواده محسوب میشود. بخشی از این مشکل ناشی از این مساله است که پایتون تفاوتهای قابل ملاحظهای با جاوا دارد.
مقایسه گرووی با پایتون
در مقایسه با پایتون، گرووی چندان پویا و دینامیک نیست. یک زبان دینامیک زبانی است که بسیاری از محاسبات را در زمان اجرا و نه در هنگام کامپایل شدن انجام میدهد. این امر علاوه بر افزایش سرعت و کارایی برنامه، از بروز برخی از انواع خطاها نیز جلوگیری میکند. از سوی دیگر، در حال حاضر جزییات انجام برخی از محاسبات در گرووی بر برنامهنویسان پوشیده است، در حالی که در Python هیچ چیز پوشیده و مخفی نیست. با این وجود نقطه قوت گرووی در برابر پایتون، برخورداری از مجموعه گستردهای از کتابخانهها است. در واقع دسترسی گرووی به همه apiهای جاوا آن را بهقدری قدرتمند میسازد که برخی حتی گرووی را تهدیدی برای آینده جاوا میدانند. کارایی گرووی و پایتون در مورد پیادهسازی متدها و توابع با هم برابری میکند. از دیدگاه مقایسه سرعت گرووی دست کم دو برابر سریعتر از پایتون است.
مقایسه گرووی با PHP
اگرچه این امر شگفت انگیز به نظر میرسد، اما PHP تنها از جایتون سریعتر است و از همه زبانهای دیگری که در مورد آنها صحبت کردیم، از جمله گرووی کندتر است.
مقایسه بر مبنای اندازه کد
یکی از مسایلی که بر کارایی کد، سرعت آن و سرعت توسعه کد توسط برنامهنویسان اثر مستقیم میگذارد، اندازه کد یا به عبارت دیگر تعداد خطوط کد است. برای آزمودن کارایی زبانها بر مبنای این معیار، حل یکی از مسایل مشهور برنامهنویسی با استفاده از زبانهای مختلف بررسی شد. این مساله، مساله ژوزف فلاویوس نامیده میشود.
ژوزف فلاویوس یک تاریخ نگار رومی در قرن اول پس از میلاد بود. ژوزف و تعدادی سرباز که جمعا 40نفر بودند در یک غار حبس شده و در محاصره نیروهای دشمن که با روم در جنگ بودند قرار داشتند. آنها تصمیم گرفتند که دور یک حلقه بایستند و شروع به شمردن کنند. شمارش از یک آغاز میشد و به 3 ختم میشد و سپس مجددا از یک از سر گرفته میشد.
هر فردی که شماره3 به او تعلق میگرفت باید خود را تسلیم نیروهای دشمن میکرد تا جان عده باقیمانده نجات یابد. ژوزف که نمیخواست بمیرد در جایی ایستاد که آخرین نفر نجات یافته باشد. حالت کلی این مساله این است که تعداد سربازان n باشد و سربازان از یک تا n شماره گذاری شوند. هر سرباز Kام باید تسلیم دشمن شود. هدف محاسبه شماره آخرین فرد نجات یافته است.
نتایج حاصل از پیادهسازی کد با زبانهای مختلف نشان میدهد که کد جاوا 100 خط و زمان اجرای آن 6/1 میکرو ثانیه است. کد++ C دارای 124 خط و زمان 3 میکروثانیه، کد گرووی 81 خط اما زمان اجرای آن 100 میکرو ثانیه و کد PHP دارای 85 خط با زمان اجرای 593 میکرو ثانیه است. کدهای پایتون و روبی به ترتیب 41 و 63 خط بوده و زمان اجرای آنها به ترتیب حدود 630 و 380 میکرو ثانیه است. به این ترتیب کد گرووی نسبتا کوتاه و خلاصه اما زمان اجرای آن اندکی طولانی است. به این ترتیب با ترکیب کد جاوا و گرووی میتوان به یک سیستم متعادل و کارا دست یافت.
آوید افضل
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: