در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
برای مثال، برنامههای نوشته شده با ++C سرعت خیلی خوبی دارند و در مقابل برنامههای نوشته شده بهزبان جاوا یا زبانهای تحت net. همچون C# چون با کدهای میانی کار میکنند، نسبت به ++C کندتر هستند. مستقل از نوع زبان، قصد داریم به عواملی که برنامهنویس برای بهبود سرعت برنامهخود باید رعایت کند بپردازیم و برخی از این نکات را به برنامهنویسان یادآور شویم. البته این نکات به همین تعداد خلاصه نمیشود و عوامل بسیار دیگری نیز در سرعت برنامه موثرند که برنامهنویس بهمرور زمان به تجربه آنها را درخواهد یافت.
استفاده از دستورات کمتر
اولین چیزی که برای بهبود سرعت یک برنامه به ذهن هر کس میرسد، استفاده از تعداد دستورات کمتر است. مسلما هر دستور برای اجرا، زمانی از وقت سیستم را بهخود اختصاص میدهد. هر چه تعداد دستورات کمتر باشد، به همان نسبت از زمان اجرای دستورات کاسته شده و سرعت نرمافزار زیاد خواهد شد. البته در زمان کاهش دستورات، باید به این نکته توجه داشت که گاهی کاستن از دستورات، خوانایی برنامه را پایین میآورد و درک کد را مشکلتر میسازد.
با سرعت رایانههای امروزی، وجود 10 یا 100 دستور اضافه یا کمتر که قرار است تنها یک بار اجرا شوند، بهواقع تاثیر محسوسی در سرعت برنامه نخواهد داشت. اما این نکته باید در ذهن باشد که هر دستور زمانی از وقت پردازنده را خواهد گرفت. اما چه زمانی باید در بهکاربردن دستورات اضافه خودداری کنیم و چه زمانی باید عمدا آن را بهکار ببریم و از وجود آنها چشمپوشی کنیم؟
کاهش دستورات زمانگیر
همانطور که گفتیم، دستوراتی که قرار است در طول بهکارگیری برنامه یک بار یا تعداد کمی اجرا شوند، تاثیر چندانی در سرعت برنامه نخواهند گذاشت. آن دستوراتی در سرعت اجرای کل تاثیر دارند که یا خود دستورات زمانگیری باشند و یا قرار است به دفعات زیادی اجرا شوند.
فرض کنید یک دستور انتساب 0= a در ابتدای یک برنامه وجود دارد که قرار است تنها یک بار اجرا شود. یا حلقهای وجود دارد که یک آرایه 20تایی از اعداد صحیح را مقدار دهی اولیه میکند و آن نیز یک بار اجرا میشود. البته منظور از اجرای یک بار، دقیقا یک بار نیست. ممکن است چندین بار نیز اجرا شود. اما چون به فواصل زیاد و بهتعداد کم و محدود اجرا میشود، از آن صرفنظر میشود. در صورتی که دستوری چنین خاصیتی داشته باشد، وجود آن به برنامه صدمهای نخواهد زد. البته اگر واقعا زاید باشد، بهتر است که حذف شود. اما اگر بیتاثیر است و به خوانایی کد و درک بهتر برنامه کمک میکند، بهتر است بهحال خود رها شود و هیچ نگران کند شدن برنامه نیز نباشیم.
اما یک دستور ممکن است خود ذاتا زمانگیر باشد. مثلا دستور (20)a = Hanoi قرار است مساله برج هانوی را برای 20 دیسک حل کند و در پایان، در صورت موفقیت، مقدار true و در صورت عدم موفقیت مقدار false را در a قرار دهد. البته این دستور کمی اغراقآمیز است و ممکن است بهواقع دستوری به این زمانگیری در برنامههای معمول کمتر رخ دهد. اما قصد ما این است که بگوییم یک دستور ممکن است یک انتساب ساده با زمان در حد میکروثانیه یا نانوثانیه باشد و دستور دیگر که خود موجب فراخوانی یک تابع میشود، ممکن است دقیقهها یا ساعتها بهطول بیانجامد (مساله برج هانوی مسالهای است که تعدادی دیسک به ترتیب کوچک به بزرگ قرار است با کمک یک میله، از میلهای به میلهای دیگر انتقال یابد بدون آن که در طول زمان بازی، دیسک بزرگ روی دیسک کوچک قرار گیرد. این مساله که به 1 - 2nحرکت برای جابهجا کردن n دیسک نیاز دارد، از مسائل قدیمی و معروف است و با افزایش تعداد دیسکها به میزان چشمگیری افزایش زمان خواهیم داشت) تشخیص این که یک دستور چقدر زمانگیر است و آیا بهتر است وجود داشته باشد یا حذف شود، بهعهده برنامهنویس خواهد بود.
کاهش دستورات تکرار شونده
یک دستور، هر قدر هم که ساده و کوچک باشد و سرعت اجرای آن بسیار زیاد باشد، زمانی که به دفعات بسیار تکرار شود، سرعت برنامه را کم میکند. بنابر این باید دقت شود که تا حد امکان در بهکار بردن دستورات تکرار شونده صرفهجویی کنیم. معمولترین حالت تکرار دستورها چرخههای تکرار است. اما چرخههای تکرار تنها حالت برای تکرار دستورها نیست. بهعبارت دیگر، اگر در چرخههای تکرار دقت کنیم، میبینیم که نمیتوان مطمئن بود که دیگر دستورات تکرار شوندهای وجود ندارد. با ذکر یک مثال، حالت دیگری از دستورات تکرار شونده را بیان خواهیم کرد:
در زبانهای برنامهنویسی چند نوع چرخه تکرار وجود دارد. از جمله میتوان به for، while و repeat اشاره کرد. هر کدام از این چرخهها به تعداد معین و یا تا برقراری شرط خاصی، دستورات داخل خود را تکرار میکنند. حال اگر دستور اضافهای در مجموعه دستورات داخل چرخه وجود داشته باشد، آن هم بههمان تعداد تکرار خواهد شد. حذف دستورات اضافه و یا جایگزین کردن چند دستور با تعداد دستورات کمتر و سریعتر داخل چرخهها میتواند بهنحوی چشمگیر در سرعت اجرای برنامه تاثیر بگذارد. البته این کار باید تا حدی انجام شود که از قابلیت برنامه کم نشده و در کار کرد آن تاثیر نداشته باشد و همچنین آن را از حالت استانارد و قانونمندی خارج نکند.
در صورتی که تصمیم گرفتید دستوری را از داخل یک چرخه تکرار حذف کنید، اما میدانید که آن دستور میتواند به خوانایی برنامه کمک کند، میتوانید طبق قوانین نحوی زبان با تبدیل آن دستور به توضیحات یا کامنت (Comment)از کامپایل شدن آن دستور جلوگیری کنید و کاری کنید که کامپایلر با رسیدن به دستور مورد نظر، آن را نادیده بگیرد. با این کار هم از خوانایی برنامه کم نمیشود و هم یک دستور از دستورات برنامه کم شده است.
البته توجه داشته باشید که اگر خواستید یک دستور غلط را حذف کنید، آن را نباید کامنت کنید. زیرا در دفعات بعد ممکن است شما را به اشتباه بیندازد. در این حالت بهتر است بهطور کامل آن دستور را پاک کنید. تبدیل کردن به کامنت تنها زمانی توصیه میشود که اگر دستور را از حالت کامنت خارج کردید، تغییری در منطق و کارکرد برنامه صورت نگیرد.
تکرار در رویدادها
رویدادها یا Events حالت دیگری از تکرار دستورات را موجب میشود که این بار به تعداد خاص یا برقراری شرط صورت نمیگیرد. بلکه یک رویداد زمانی فراخوانی میشود که اتفاق خاصی در برنامه بیفتد. مثلا کلیک کردن روی یک عنصر رویداد کلیک آن عنصر را فراخوانی میکند یا بیکار شدن برنامه، رویداد idle یا بیکاری برنامه را فراخوانی میکند. رویدادهای مختلفی در یک برنامه برای اجزای گوناگون تعریف میشوند که هر یک از آنها با اختیار یا بدون اختیار کاربر میتوانند فراخوانی شوند. بنابر این گاهی ممکن است یک رویداد بدون خواست کاربر بهدفعات زیادی فراخوانی شود و در صورتی که دستورات مربوط به آن زمانگیر باشند، میتواند باعث کندی برنامه و کاهش کارایی آن شوند. بنابر این برای بهبود کارکرد یک برنامه باید به رویدادهای آن نیز توجه کافی داشت.
در آینده سعی خواهیم کرد به مسائل دیگری که سرعت یک برنامه را تحت تاثیر قرار میدهند، بپردازیم.
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: