50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

نحوه بهینه نوشتن کد برای محاسبات ریاضی؟

با سلام و خسته نباشید خدمت اساتید گرامی.

برنامه ایی رو داشتم مینوشتم که به مشکل خوردم.(ممنون میشم راهنمایی بفرمایید).

سوال:

 
int count = 10000;
            double x = 0.0;
            for (int i = 0; i < count; i++)
            {
            x += 0.000001;
            }

مشکلم:

این قطعه کد (تو اصل برنامه محاسبات چند خطی بیشتره) بشدت cpu رو درگیر میکنه.

میخواستم بدونم راههای دیگه ایی هست (الگوریتمی ، روش خاصی ....)?

این کد gc رو خیلی درگیر میکنه .

دلیل سوالمم اینه که یک راهکارو دیدم تو دات نت که بسیار بهینه بود ،گفتم شاید همچین کاریم برای اعداد انجام داده باشن.

راهکار دات نت برای الحاق رشته:

string x=null
for(I=0;i<1000;i++)
{

x=x+"a";

}

این کد زمان اجراش بالاترست از کد زیر

 StringBuilder x = new StringBuilder();
            for (int i = 0; i < 1000; i++)
            {
                x.Append("a");
            }

اینجور چیزی داریم تو دات نت برا اعداد؟

پرسیده شده در 1395/11/14 توسط

3 پاسخ

0

ممنون که پاسخ دادین.

اینکارو انجام دادم و قطعه کد پر استفاده من دقیقا همین قطعه کد است.

به نظر شما برم سراغ cuda?

یا خودم یه نوع mutable بسازم؟اصلا شدنیه؟

پاسخ در 1395/11/16 توسط
0

واقعیت بنده با زبان Cuda کار نکردم و آشنایی ندارم، اما می دونم که زبان پایتون برای محاسبات ریاضی خیلی استفاده میشه. در مورد Immutable، نوع های Immutable باعث کاهش بازدهی میشن، چون با هر بار تغییر کار تخصیص حافظه جدید باید انجام بشه و البته امکان ایجاد نوع های Immutable در سی شارپ نسخه 6 به پایین وجود نداره، تو سی شارپ 7 قرار هست اضافه بشه که هنوز نسخه نهایی ارائه نشده.

پاسخ در 1395/11/16 توسط
0

سلام،

من ابتدا در مورد کد آخر توضیح بدم، کد آخر شما که از StringBuilder استفاده شده به این دلیل سریع تر از حالت استفاده از string هست که string یک نوع Immutable هست، یعنی با هر بار مقدار دهی یا تغییر در رشته، یک رشته جدید در حافظه ایجاد شده و مقدار جدید در آن قرار میگیرد، با StringBuilder این موضوع برعکس شده و رشته ای که داخل StringBuilder تغییر داده می شود نیاز به مقدار دهی خانه های جدید در حافظه ندارد.

در مورد کد اول شما از Value Type ها استفاده می کنید و Value Type ها داخل حافظه Stack ذخیره میشن، در حالی که GC برای پاک سازی حافظه Heap استفاده میشه، شما یکبار کدتون رو با نرم افزارهای Profiler بررسی کنید ببینید دلیل استفاده زیاد CPU از کجاست. چون من نمونه کد شما رو اجرا کردم و مشکلی نداشتم (منظورم کد اول هست)،

پاسخ در 1395/11/16 توسط

پاسخ شما