نمایش نتایج 1 تا 8 از 8

نام تاپیک: کاهش سرعت سی پلاس نسبت به پایتون

  1. #1

    کاهش سرعت سی پلاس نسبت به پایتون

    سلام من یک ابزاری با پایتون نوشتم...از دو جهت اونو با سی پلاس دوباره نویسی کردم...یکی از دلایل که اهمیت کمتری داشت. افزایش سرعت بود.
    کمپانی ای که برای نرم افزارش ابزار نوشتم.تاکید می کرد که ابزار نوشته شده با سی پلاس پلاس سریعتر نسبت به پایتون.به چند دلیل که مثلا به هسته نرم افزار نزدیک تره...فارق از این کلا زیاد میشنیدم که سی پلاس سریعتر از پایتون.
    اما من وقتی با دنگ و فنگ بسیار که در سی تخصص ندارم،وقتی همون ابزار رو با سی دوباره نویسی کردم...سرعت افزایش پیدا نکرد هیچ....بلکه به دوبرابر کاهش پیدا کرد.یک ثانیه شد دو ثانیه.
    فرامین تقریبا همون پایتونه...حلقه ها و الگوریتم ها همونه...ایا این کاهش سرعت میتونه طبیعی باشه؟افقط یگم این برنامه حلقه هاش تکراراش زیاده....بیش از صد هزار گاها.ِِِِِ...به نظرتون این امر طبیعیه یا یک جای کار میلنگه؟من چندین بار کدا رو وارسی کردم...مورد اضافی ای به ذهنم نرسید.چه مواردی رو چک کنم.
    اقا این تاپیک اصلا فعال هست؟من یک تاپیک زدم بماند که کسی جواب نداد...پشت سرشم کسی سوال جدیدی مطرح نکرد.همیشه همینطوریه؟

  2. #2
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    من تخصصی در C++‎ ندارم ولی چنین چیزی نمیشه. یا کدتون مشکل داره یا از کتابخانه هایی استفاده کردید که اون مشکل داره.

    در هر صورت چون سی پلاس پلاس مستقیما اجرا میشه سریعتر هست، فارغ از اینکه کد چی باشه. پایتون تفسیر میشه موقع اجرا و این سرعت رو کاهش میده

  3. #3
    کاربر دائمی آواتار parvizwpf
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    TEH
    پست
    2,919

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    برنامه نویس رو به تعطیل شدن میره . این چیزی که میگید برای من بین سی شارپ و سی پلاس پلاس رخ داد. دلیلش رو آخرم نفهمیدم. منتها در فروم های خارجی که در میون گذاشتم گفتند به پارامترهای مختلف بستاگی داره مثل نحوه کامپایل و کامپایلر .

  4. #4

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    نقل قول نوشته شده توسط python2015 مشاهده تاپیک
    سلام من یک ابزاری با پایتون نوشتم...از دو جهت اونو با سی پلاس دوباره نویسی کردم...یکی از دلایل که اهمیت کمتری داشت. افزایش سرعت بود.
    کمپانی ای که برای نرم افزارش ابزار نوشتم.تاکید می کرد که ابزار نوشته شده با سی پلاس پلاس سریعتر نسبت به پایتون.به چند دلیل که مثلا به هسته نرم افزار نزدیک تره...فارق از این کلا زیاد میشنیدم که سی پلاس سریعتر از پایتون.
    اما من وقتی با دنگ و فنگ بسیار که در سی تخصص ندارم،وقتی همون ابزار رو با سی دوباره نویسی کردم...سرعت افزایش پیدا نکرد هیچ....بلکه به دوبرابر کاهش پیدا کرد.یک ثانیه شد دو ثانیه.
    فرامین تقریبا همون پایتونه...حلقه ها و الگوریتم ها همونه...ایا این کاهش سرعت میتونه طبیعی باشه؟افقط یگم این برنامه حلقه هاش تکراراش زیاده....بیش از صد هزار گاها.ِِِِِ...به نظرتون این امر طبیعیه یا یک جای کار میلنگه؟من چندین بار کدا رو وارسی کردم...مورد اضافی ای به ذهنم نرسید.چه مواردی رو چک کنم.
    اقا این تاپیک اصلا فعال هست؟من یک تاپیک زدم بماند که کسی جواب نداد...پشت سرشم کسی سوال جدیدی مطرح نکرد.همیشه همینطوریه؟
    واقعیت این هست که وقتی صحبت از سزعت پردازش میشه نقش اول را الگوریتم بازی میکنه به نظر من دیگه مهم نیست از چه زبانی استفاده کنید چون تو همین زبان سی پلاس پلاس هم میشه یه الگوریتم بد نوشت و انتظار داشت سرعت خوبی داشته باشه البته کلی عرض کردم!
    وگرنه صحبت از توانایی های محیط های برنامه نویسی خیلی وسیع هست خوب باالطبع هر کدوم یه ویژگی هایی دارند که و البته یکسری نقایص زبانهایی سطح بالایی مثل پایتون سعی در این دارند که کمتر کاربر درگیر لایه های زیرین برنامه نویسی کنن وبرای همین برای برخی از کارها مناسب ترند مثلا همین مباحث GIS ویا برنامه های آمار و احتمالات که وقتی پایتون باشه با ++c یکم عذاب آورتر هست نوشتن این دست برنامه ها.
    ویا تصویر کنید قدرتی که در ساختار زبان ++c هست مثلا Deep Copy Object ,Shallow Copy Object ساختن با این زبان به مراتب قوی تر از هر زبانی حتی پایتون ویا جاوا ویا سی شارپ (البته تو سی شارپ هم میتونی به همون ظرافت ++c کد بنویسی ولی یک بدی داره باید کدهای Unsafe بنویسید و اشکالات اون ...)
    به نظر من همین که شما حلقه های با این تکرار بالا دارید خودش میتونه شروع اشکال باشه حالا اگر از الگوریتم های بازگشتی هم استفاده کرده باشید که خوب بیشتر مستعد کاهش سرعت هستید.
    مثلا من یک الگوریتمی داشتم که میخواستم یک عملیات ریاضی را برای 20 میلیون رکورد انجام بدم الگوریتم اولیه من البته اینم بگم با پردازش موازی بود حدود 2 ثانیه بود و فقط با تعویض یکسری حلقه های for با حلقه های ForEach تقریبا 1 ثانیه کمتر شد!!!
    و البته اینم در نظر داشته باشید که سخت افزار هم خیلی تاثیر در اجرای الگوریتم ها میتونه داشته باشه!

  5. #5
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    البته ممکنه یه سری جزئیات هم گاهی اوقات دخیل باشه.
    چیزی که میخوام اضافه کنم شاید شاید مشکل از نحوه ذخیره سازی در حافظه و فراخوانی اونا هم باشه. به خصوص که گفتید حلقه های تکرارش زیاده یادم اومد.

    یادمه یه جایی بحث رو این بود که اگر یک آرایه دو بعدی بزرگ داشته باشیم و فرض کنیم بخوایم و جمع تمام عناصرش رو بدست بیاریم، آیا فرقی میکنه سطر به سطر بریم، ستون به ستون بریم و...؟
    شاید از نظر برنامه نویسی و الگوریتم تفاوتی نداشته باشه، اما تو سرعت میتونه تاثیر بذاره (لااقل از نظر تئوری)
    علتشم بحث سخت افزاری هست. درسته ما به حافظه اصلی (Main Memory) دسترسی تصادفی داریم و از این نظر تفاوتی نداره اما خواندن از حافظه اصلی زمان بر هست و برای همین با اولین فراخوانی از یک آدرس در حافظه اصلی بلافاصله تعداد زیادی مقادیر همجوارش هم با هم رو Cache ذخیره میشن و بعد از روی حافظه نهان (Cache) خونده میشه. حافظه نهان هم معمولا دو سطحی است. به هر حال در دسترسی اول سرعت خوبی ندارید و cache miss دارید ولی در دسترسی های بعدی در صورتی که آدرس های همجوار قبلی رو فراخوانی کنید cache hit دارید و مستقیما از حافظه نهان میخونه و دیگه کاری با حافظه اصلی نداره و سرعت به مراتب بالاتر میره. اما اگر آدرس بعدی خیلی دور باشه نسبت به آدرس اول اونوقت اون داده قبلا توی حافظه نهان قرار نگرفته و باید از حافظه اصلی بخونه و هی همین تکرار میشه که سرعت برنامه رو به شدت کاهش میده.

    خلاصه کنم اگر با چنین شرایطی مواجه هستید و از حلقه های زیادی استفاده میکنید بهتره ببینید آیا طبق چیزی که در حافظه ذخیره میشه میخونید یا نه.

    پایتون اما مدیریت حافظه متفاوتی داره و به صورت قطعی نمیتونم بگم و شاید بهینه سازی هایی رو خودش انجام میده. ولی C++‎‎‎‎‎ شفافتر میتونی بفهمی چطور ذخیره کرده

  6. #6

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    یادمه یه جایی بحث رو این بود که اگر یک آرایه دو بعدی بزرگ داشته باشیم و فرض کنیم بخوایم و جمع تمام عناصرش رو بدست بیاریم، آیا فرقی میکنه سطر به سطر بریم، ستون به ستون بریم و...؟
    شاید از نظر برنامه نویسی و الگوریتم تفاوتی نداشته باشه، اما تو سرعت میتونه تاثیر بذاره (لااقل از نظر تئوری)
    ولی این هم به نظر من خیلی تفاوت داره تو نوشتن الگوریتم پردازش آرایه دوبعدی ...
    مثلا یکی میاد با recursive مینویسه یکی هم میاد با حلقه ها مینویسه و یکی هم میاد با پردازش موازی مینویسه حالا میشه گفت که پردازش زمانی هر سه روش یکسان هست؟
    حالا اگر از بردارها بیتی استفاده شده باشه ویا اصلا از عملگرهای بیتی استفاده نشه بازهم پردازش زمانی نمیتونه فرق داشته باشه!؟
    اگر با بازگشت بنویسه باید حواسش به حافظه باشه اگر از حلقه ها استفاده کنه امکان داره از چند حلقه nested استفاده کنه که کارایی میاد پایین و پردازش موازی هم که به cpu خیلی وابسته است و احتمال کوبیدگی(حالتی که چند فرآیند متناوب به یک داده اشتراکی بخواهند دسترسی داشته باشند و کارایی سیستم دچار اختلال میشه.!) تو فرآیندها هم وجود داره!
    ولی با هر سه روش میشه انجام داد این که کدومش بهتره برنامه نویس بیشتر تشخیص میده چون میدونه برای چه ماشین هایی داره برنامه مینویسه!
    علتشم بحث سخت افزاری هست. درسته ما به حافظه اصلی (Main Memory) دسترسی تصادفی داریم و از این نظر تفاوتی نداره اما خواندن از حافظه اصلی زمان بر هست و برای همین با اولین فراخوانی از یک آدرس در حافظه اصلی بلافاصله تعداد زیادی مقادیر همجوارش هم با هم رو Cache ذخیره میشن و بعد از روی حافظه نهان (Cache) خونده میشه. حافظه نهان هم معمولا دو سطحی است. به هر حال در دسترسی اول سرعت خوبی ندارید و cache miss دارید ولی در دسترسی های بعدی در صورتی که آدرس های همجوار قبلی رو فراخوانی کنید cache hit دارید و مستقیما از حافظه نهان میخونه و دیگه کاری با حافظه اصلی نداره و سرعت به مراتب بالاتر میره. اما اگر آدرس بعدی خیلی دور باشه نسبت به آدرس اول اونوقت اون داده قبلا توی حافظه نهان قرار نگرفته و باید از حافظه اصلی بخونه و هی همین تکرار میشه که سرعت برنامه رو به شدت کاهش میده.
    ولی این که مطرح میکنید مدیریتی که خود سیستم عامل داره کنترل اش میکنه!

    خلاصه کنم اگر با چنین شرایطی مواجه هستید و از حلقه های زیادی استفاده میکنید بهتره ببینید آیا طبق چیزی که در حافظه ذخیره میشه میخونید یا نه.
    من متوجه این حرف شما نمیشم که طبق چیزی که ذخیره میشه میخونید یعنی چی دقیقا! منظور شما این هست که مثلا داریم یک متغیر تعریف میکنیم که تو Stack تعریف شده ولی برای اینکه ازش استفاده کنیم از روی Swap یا همون cache میخونیم مقدار متغیر را
    مگر برنامه نویس میتونه در زمان دریافت مقدار بگه الان متغیر کجاست؟؟
    مگه کل این فرآیندها از pip های cpu برای اجرای دستورات و همچنین دسترسی به حافظه مستقیم DMA وظایف سطح پایین سیستم عامل هست برنامه نویس میتونه دخالتی داشته باشه؟

    مثلا فرض کنید که یک فایل با ورودی 4 میلیارد داده از نوع int دارید حالا می خواهیم ببینیم که کدوم عدد دراین فایل وجود ندارد ترتیب اعداد هم از 1 تا 4،000،000،000. وفقط هم 1 گیگابایت حافظه در دسترس داریم؟
    یعنی 32^2 عدد داریم و 1 گیگابایت هم که می شود 8 میلیارد بیت بنابراین میتونیم تمام اعداد را به یک بیت مشخص نگاشت کنیم بدون محدودیت.
    حالا منظور این هست که چطور الگوریتمی بنویسیم که سرعت خوبی داشته باشه!

    byte[] bitArray = new byte [0xFFFFFFF / 8]; // 268,435,455 / 8
    void findNum() throws FileNotFoundException {
    Scanner in = new Scanner(new FileReader("file.txt"));
    while (in.hasNextInt()){
    int n=in.nextInt();
    bitArray[n/8] |= 1 << (n%8);
    }
    int lostInt ;
    for (int i=0 ; i < bitArray.length ; i++){
    for (int j=0 ; j < 8 ; j++){
    if((bitArray[i] & (1 << j)) == 0){ //if first element in the bit vector is zero than this element is a lost number in file
    lostInt = i * 8 + j;
    return;
    }
    }
    }
    }

    هدف استفاده از الگوریتم هاست برای پیاده سازی مشکلات دربرنامه نویسی و جستجوی بهترین روش برای سرعت در پردازش هست.
    یکم اگر بخواهیم موشکافه تر نگاه کنیم به قضیه الگوریتم نویسی فرض کنید که یه متغیر از نوع int تعریف مکنید ویک مقداری هم بهش تعیین میکنید وبعد یک اشاره گر به همین متغیر int تعریف میکنید خوب همونطور که میدونید مقدار متغیر ما تو stack نگه داشته میشه و اشاره گر مون تو heap ذخیره میشه البته در C++‎‎ ,c را عرض میکنم حالا تصور کنید چقدر قدرت و انعطاف می توان داشت در طراحی الگوریتم حالا فرض کنید از اشاره گر نخواهیم استفاده کنیم تو الگوریتم تغییر در سورس کدمون را می تونید تصور کنید!؟
    مثلا فرض کنید بخواهید همین کار را تو جاوا انجام بدید خوب تو جاوا که اشاره گرنداریم پس باید از کلاس استاتیک استفاده کنیم که بتونیم با استفاده از اینترفیس ها و الگوی Observer به فیلدهایی که باز هم به صورت استاتیک تعریف میشوند دسترسی داشت چون که برای استفاده از heap باید از استاتیک استفاده کنیم تو جاوا البته منظورم این نیست که کد جاوا بدتر هست یا بهتر است منظور تو کد نویسی یک الگوریتم با توجه به ساختمان طراحی یک محیط برنامه نویسی هست پس باالطبع هرچی بشه با کدنویسی کمتر به هدف الگوریتم نزدیک تر بشیم خیلی هم به بهینه تر نویسی نزدیکتر هستیم. وهمین ظرافت هاست که در برنامه نویسی باعث میشه که یکی مثل Joshua Bloch میاد خیلی از کتابخونه های اندروید را مینویسه یکی هم میاد میره 6 سال رشته x را میخونه مبینه ای بابا کاری نیست که بکنه میگه آهان میرم برنامه نویسی اندروید میکنم پروژه ام میگیره دونه 50،000 تومان...
    آخرین ویرایش به وسیله farhad_shiri_ex : سه شنبه 18 اردیبهشت 1397 در 18:02 عصر

  7. #7

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    سلام
    اولین چیزی که به ذهن من میرسه که بپرسم اینه: در زمان کامپایل حالت release را انتخاب کردید؟ به علت اینکه معمولا این حالت برای زبان های مفسری معنایی ندارد ولی در زبانی مثل C++‎‎‎ شما زمانی که با حالت debug کد را کامپایل میکنید زمان اجرا و همینطور حجم نرم افزار به دلیل اضافاتی که برای debug از برنامه حذف نمیشه یا اضافه میشه و در خروجی شما هست افزایش پیدا میکنه. یک بار با حالت release تست کنید به احتمال زیاد سرعت خروجی بیشتری را میبینید.

  8. #8
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: کاهش سرعت سی پلاس نسبت به پایتون

    من متوجه این حرف شما نمیشم که طبق چیزی که ذخیره میشه میخونید یعنی چی دقیقا! منظور شما این هست که مثلا داریم یک متغیر تعریف میکنیم که تو Stack تعریف شده ولی برای اینکه ازش استفاده کنیم از روی Swap یا همون cache میخونیم مقدار متغیر را
    مگر برنامه نویس میتونه در زمان دریافت مقدار بگه الان متغیر کجاست؟؟
    مگه کل این فرآیندها از pip های cpu برای اجرای دستورات و همچنین دسترسی به حافظه مستقیم DMA وظایف سطح پایین سیستم عامل هست برنامه نویس میتونه دخالتی داشته باشه؟
    نه ما رو cache که هیچ کنترل نداریم. منظورم من از جوری که ذخیره شده بخونیم این نبود که در cache چجوری ذخیره شده و... . منظورم رو حافظه اصلی بود.

    همچنین در این مورد موازی سازی، بازگشتی هم نداریم. چون دوستمون گفتن از "حلقه" استفاده کردند گفتم در آرایه چجوری پیمایش کنیم مهمه. چون معمولا (چون سیستم عامل دخالت میکنه شاید نشه گفت همیشه) "مثلا" آرایه به صورت سطری ذخیره شده و خب وقتی داریم سطری میخونیم احتمال وجود آدرس های بعدی در cache خیلی بیشتر از این هست که مثلا در سطر بعد وجود داشته باشه.

    امیدوارم منظورم رو تونسته باشم برسونم و اگر اشتباهه بفرمائید. البته قابل تست هم هست. یک آرایه دو بعدی بسازیم با ابعاد زیاد و یکبار سطری و یکبار ستونی پیمایش کنیم و مثلا اعداد رو جمع کنیم و زمان اجرا رو در چند اجرا مقایسه کنیم.

تاپیک های مشابه

  1. نیاز به کتاب در زمینه آموزش ویژوال سی پلاس پلاس ، MFC و win32
    نوشته شده توسط Master. در بخش برنامه نویسی با MFC و ++Visual C
    پاسخ: 98
    آخرین پست: سه شنبه 19 دی 1402, 20:31 عصر
  2. سوال: سرعت عمل RDLC نسبت به stimul soft report استیمول
    نوشته شده توسط esagraphic در بخش ابزارهای گزارش سازی
    پاسخ: 3
    آخرین پست: چهارشنبه 22 اردیبهشت 1395, 13:41 عصر
  3. آیا شی گرایی در زبان ها میتونه عاملی برای کاهش سرعت کامپایل اونها نسبت به زبان های غیر شی گرا باشه؟
    نوشته شده توسط amirjalili در بخش الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها
    پاسخ: 3
    آخرین پست: جمعه 28 آبان 1389, 13:45 عصر
  4. درخواست یه برنامه کوچک به زبان سی پلاس پلاس!
    نوشته شده توسط AmiN_GiGa در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 6
    آخرین پست: جمعه 07 دی 1386, 14:33 عصر
  5. نیاز به راهنمایی: طراحی سایت با سی پلاس پلاس امکان پذیره ؟
    نوشته شده توسط borzoo در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 22
    آخرین پست: شنبه 01 آذر 1382, 17:19 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •