مرجع تخصصی برنامه نویسان

بزرگترین انجمن برنامه نویسان فارسی زبان

آموزشگاه برنامه نویسان

کوتاه کردن زمان اجرای حلقه for با تقسیم کردن آن به چند قمست

ﺳﻪ شنبه, 21 آذر 1396 18:02

کوتاه کردن زمان اجرای حلقه for با تقسیم کردن آن به چند قمست

با سلام،
در برنامه من با استفاده از یک حلقه for چندین دستور ممکن است تا 1 میلیون بار اجرا شوند که این باعث افزایش بسیار زیاد و غیر قابل قبول زمان اجرای برنامه می شود. برای حل این مشکل چندین راه حل را امتحان کردم که نتایج هر کدام یا بدتر از نتیجه اولیه بود یا مساوی با آن. این راه حل ها عبارتند از:

1. تقسیم حلقه for صفر تا 1 میلیون به 5 حلقه با محدوده های:
صفر تا 200 هزار
200 هزار تا 400 هزار
400 هزار تا 600 هزار
600 هزار تا 800 هزار
800 هزار تا 1 میلیون
و تعریف پنج thread که هر در هر یک از thread ها حلقه for ای با یکی از محدوده های بالا فراخوانی شده اند.
در این حالت با وجود این که تمامی thread ها همزمان اجرا می شوند پیشرفتی در زمان به وچود نیامد.

2. استفاده از Parallel.For  که در این حالت هم پیشرفتی حاصل نشد.

3. استفاده از پنج Parallel.For (همانند قسمت 1) و پنج thread که در این مورد زمان طولانی تر شد.

4. استفاده از 5 task منختلف که این مورد هم پیشرفتی حاصل نکرد.

برای رفع این مشکل چه راه حلی را پیشنهاد می کنید؟ با توجه به این که ترتیب اجرا شده حلقه for اصلا مهم نیست استفاده از Parallel.For هم موردی ندارد ولی آنچه برای من مهم است کم کردن زمان پردازش است.

نمونه ای کد را در زیر می توانید ببینید:

تابع Func1:

static void Func1()
        {
            Parallel.For(0,100000,i =>
            {
                Console.Write("y");
            }
                );
        }
...

به همین ترتیب تا Func5  ادامه دارد. و به صورت زیر فراخوانی می شود:

Thread t1 = new Thread(Func1);
            t1.Start();

و تا t5 ادامه می کند.

آکادمی برنامه نویسان تلگرام برنامه نویسان
چهارشنبه, 22 آذر 1396 00:44

نقل قول : کوتاه کردن زمان اجرای حلقه for با تقسیم کردن آن به چند قمست

من فکر میکنم بهتر هست شما به فکر اصلاح کد و کم کردن پیچیدگی زمانی باشید با توضیحاتی که دادین و این حجم از حلقه تکرار این بهترین راه حل هست. استفاده از پردازش های موازی ، چند نخی و Parallel.For همیشه راه حل مناسبی برای کم کردن زمان محاسبه نیست. به خاطر داشته باشین که سیستم زمانی رو به سازماندهی درخواست ها(برای پردازش) موازی اختصاص میده، که این خودش اتلاف هزینه های زمانی هست این روش بیشتر برای حجم کار بالا و درخواست کم مناسب هست.

کسانی که از این پست تشکر کرده اند :
چهارشنبه, 22 آذر 1396 10:39

نقل قول : کوتاه کردن زمان اجرای حلقه for با تقسیم کردن آن به چند قمست

در هر صورت باید این عملیات اجرا بشه و شما باید این پردازش رو انجام بدید

سرعت پردازش بستگی به منابع سیستمتون داره

تنها کاری که میتونید بکنید اینه که از Thread ها استفاده کنید که برنامه در حین انجام هنگ نکنه

میتونید در صد پیشرفت کار رو به کاربر نیز نمایش دهید

کسانی که از این پست تشکر کرده اند :

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید