بنچمارک فیبوناچی با سه زبان rust, python, cpp

سلام، وقت بخیر.

داشتم روی یادگیری زبان rust کار می‌کردم که توی تمرین نوشتن فیبوناچی به این مسئله برخوردم که بین زبان های برنامه نویسی، چه مقدار زمان طول می‌کشه که یک الگوریتم یکسان فیبوناچی اجرا بشه؟

  1. python
def fib(n):
    if(n==0):
        return 0
    elif(n==1):
        return 1
    else:
        return fib(n-1) + fib(n-2)


print(fib(43))

کد رو یکبار با python اجرا کردم، که 135 ثاینه زمان گرفت!

همین رو هم یک بار با pypy اجرا کردم، و کلا 10 ثاینه زمان برد.


  1. cpp
#include<iostream>

using namespace std;


int fib(int n) {
	if(n==0) {
		return 0;
	}
	else if(n==1) {
		return 1;
	}
	else {
		return fib(n-1) + fib(n-2);
	}
}

int main() {
	int n = 43;
	cout << fib(n);	
}

زمان اجری این کد توی cpp شد فقط سه ثانیه، کمتر از همه!!


  1. rust
fn main() {
    let n = 43;
    println!("fib {} = {}", n, fib(n));
}

fn fib(n: i128) -> i128 {
    if n == 0 {
        return 0;
    } else if n == 1 {
        return 1;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
}

توی زبان rust بدون در نظر گرفتن کامپایل تایم، 6 ثانیه زمان اجرا گرفت.


  • برای من سوال شد که چرا اینقدر تفاوت در زمان ووجود داره؟

  • و قتی یک زبان مثل پایتون بیشتر از 130 ثانیه!! زمان می‌گیره تا یک کد رو اجرا کنه، یعنی زبان بهینه‌ای نیست و نباید استفاده بشه؟ مخصوصا توی بکند وب؟

  • اگه pypy بهینه تر از python هست، چرا همین رو توسعه نمی‌دن، و بهترش نمی‌کنند تا همه سینتکس ها رو ساپورت کنه؟

  • میشه جنگو رو با pypy بالا اورد؟

شما اگر بخواین اینجوری حساب و کتاب کنید نمی تونید با یک زبان کار کنید. بهترین راه حلش این هست که شما یک زبان رو به عنوان یک ابزار ببنید در مرحله اول نه دانش در مرحله دوم وقتی ایکس رو انتخاب کنید که جامعه ای که در اون فعالیت دارند برای اون نیاز مورد نظر شما فعال باشند. مثلا جاوا رو انتخاب نمی کنیم برای یک سایت دو صفحه ای یا مثلا پایتان رو برای وب سرویس با دریافت درخواست بالا ولی می تونیم همین زبان رو برای یادگیری ماشین که ابزار زیادی هم براش هست استفاده کنیم

4 پسندیده

ممنون، کاملا درست می‌گین،

این مثال واقعا درستی بود،


فقط از این موضوع اطلاعاتی دارید؟ که قبلا انجام داده باشید و …

واقعیت امر نه من استکم الیکسیر هست اطلاعاتی در مورد موارد دیگه ندارم

1 پسندیده

چیزی ندارم به صحبتهای @shahryarjb اضافه کنم. فقط اینو بگم که اگه همین کد C++ رو با -O2 یا -O3 کامپایل کنید، توی ۰.۷۳ ثانیه اجرا میشه:

╭─[email protected] /tmp 
╰─$ gcc fib.c -O3 -o fib
╭─[email protected] /tmp 
╰─$ time ./fib          
result: 433494437
./fib  0.73s user 0.00s system 99% cpu 0.731 total
3 پسندیده

ممنون. توی rust هم برای کامپایل از سوییچ release استفاده کردم، و توی 1.98 ثانیه اجرا شد.

1 پسندیده

به یک چیز بنچ‌مارک که میشه گیر داد و مطمئن نیستم چقدر تاثیر داشته باشه،‌ اینه که برای راست از عدد صحیح ۱۲۸ بیتی استفاده کردی ولی برای سی‌پلاس‌پلاس از ۳۲ بیتی فکر کنم یا نهایتا ۶۴ بیتی.

2 پسندیده