تست سرعت زبان های برنامه نویسی


#1

سلام دوستان . جادی داخل سایتش با python کدی نوشت برای محاسبه تعداد اعداد اول تا 1,000,000 توی سیستم من ۱۷ ثانیه طول کشید .

این کد رو به گو تبدیل کردم و در کمتر از ۱ ثانیه اجرا شد . الگوریتم همونه .

در بهتر شدنش مشارکت کنید :‌https://github.com/okabbas/gocode

حالا ازتون میخام برای سرگرمی هم که شده منم تازه به سایت اضافه شدم یکم اشنا بشیم :slight_smile:
یکم این کدو با زبان های مادری خودتون تست کنید جواب سرعت اجراشو اینجا بفرستید + کد . تشکر .

سیستم من : macbook 8gig ram corei5 5800 ssd .

package main

import (
	"fmt"
	"math"
)

func main() {
	c := 0
	for x := 1; x <= 1000000; x++ {
		if isPrime(x) {
			c++
		}
	}
	fmt.Print(c)
}

func isPrime(n int) bool {
	//y = jazr n
	y := int(math.Pow(float64(n), 0.5) + 1)
	b := true
	for x := 2; x <= y; x++ {
		if n%x == 0 {
			b = false
			break
		}
	}
	return b
}

#2

کد پایتون رو هم دارید؟


#4

اخه این چ وضعه الگوریتم نویسیه :confused:


#5

خیلی کدش غیرپایتونیک هست : )
اینم کد من:

from math import sqrt
import time
def FindPrimes():
	primes = []
	for x in range(2,1000000):
		if not any(y for y in range(2,1+int(sqrt(x))) if not x%y):
			primes.append(x)
	return len(primes)

start = time.time()
print(FindPrimes())
print(f'complete on {(time.time()-start):.2f} s')

زمان اجرا :

primes_1

با Pypy :

prime_2

میتونم رکوردم بزنم با Cython ک Go و سایرین به گرد پاش نرسن :smile: ولی حسش نیس

و چیزای مهمتر از پرفورمنس وجود دارن…


#6

حالا که بحث graalVM و TruffleRubyهم داغ شده این هم کد من:
prime.rb

Ruby:
ruby
TruffleRuby:


Go (کد دوست عزیزمون okabbas):
go


#7

به به دسته گل جدید اوراکل: )) مث اینکه پایتون / R/ js هم رو هم میتونه اجرا کنه … نصبش راحته ؟


#8

بله راحت هست. مستندات خوبی دارن من به مشکلی نخوردم. ولی مفاهیمی که پشت این ماجرا هستن خیلی برام جالب بود. جناب آقای امیررضا قادری هم یک مطلب بسیار عالی در مورد گذاشتن:
کالبد شکافی GraalVM


#9

دیشب دانلودش کردم … فایل executable به اسم graalpython داشت … کدم رو اجرا کردم … نتیجه خیلی فوق العاده ی 0.324 رو داد بهم : )

به نظرم میتونه جایگزین خلف jython بشه … امیدواریم بتونه GIL رو حذف کنه از پایتون …


#10

nodejs

کد خودتو فقط به جاوااسکری\ت تبدیل کردهم


#13

کلا مقایسه سرعت زبان های مفسری با کامپایلی کار درستی نیست. مشخصا کندتر هستند و این کند بودن بد نیست. هر کدوم امکاناتی رو در اختیار می ذارند که قیمتی داره. یه سری قیمتش سرعت هست و تو یه سری زبان ها قیمت انعطاف پذیری و سرعت توصعه.

من از Graal در پروداکشن استفاده می کنم. فوق العاده هست ( البته برای Clojure و Ruby ) .

متاسفانه برای از بین بردن GIL باید ساختار زبان رو عوض کرد که در مورد پایتون و امثال اون نمی شه. Matz توی یکی از مصاحبه هاش به نکات جالبی در مورد GIL توی Ruby صحبت می کنه که می شه به پایتون هم تعمیمش داد. ( پیدا کنم لینک می ذارم ) خلاصه حرفش اینه که GIL وجود داره که از دولوپر در برابر Race Condition و اینا محافظت کنه و اگر دیتا Immutable بود می شد GIL و حذف کرد.


#14

درود سمیر عزیز
از کدوم نسخه ش استفاده میکنید؟ به نظرتون نسخه ی کمیونیتی مناسب هست که بخواد جای مثلا Hotspot رو بگیره؟؟


#15

بسیار عالی. با اینکه تاپیک قدیمیه ولی اومد بالا … دوس دارم یک سری مطالب شیر کنم …

یکی از دوستان یه زبان OO معرفی کرد(به اسم Pony ک اکتور مدل و کانکارنسی داره) … و همینطور یک سری مطالب از actor model … ک ارلنگ این مدل رو از روی message passingای ک توی smalltalk بود برداشت …

من قبلش فک میکردم خود OO باعث میشه که ریس کاندیشن و عدم ترد سیفتی بوجود بیاد . اما این نکته دقیقا درسته که با immutability میشه الگوی کانکارنسی و ترد سیفتی هم پیاده کرد . .

از نسخه کامیونیتیش استفاده میکنید ؟؟؟‌
اخرین بار ک چک کردم Graalvm رو … درحال پیاده سازی پایتون 3.7 هم بودن :star_struck: بیصبرانه منتظرم برای پایتون هم استیبل بشه …


#16

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


#17

شخصا اکتور مدل رو زیاد نمی پسندم، البته شاید بخاطر تجربه بد باشه. اما تو سکالا اکتور مدل رو به صورت پیشفرض با oop پیاده گردن. مدل خیلی قدیمی ای هست که آروم آروم پیش رفت کرده و بعتر شده.


#18

اقا سمیر message passing با RabbitMQ یا redis چطور ؟ فک کنم توی hellhounded گفتید از message passing استفاده میکنید


#19

نه تو HellHound از Message Passing استفاده نمی کنم. HellHound بیشتر یه abstraction هست که می شه از این ابزار ها باهاش استفاده کرد. RabbitMQ رو تو ۲ تا از پروداکت ها استفاده می کنم. البته یکیش مال خودم نیست. ابزار قابل اطمینانی هست اما جواب هر کار نیست و نیاز به مطالعه داره چون راحت می شه باهاش تو چاه افتاد (‌اگر مطالعه نباشه‌). تو پروژه ای که برای خودم هست ازش به عنوان distributed queue استفاده می کنم که یه سری job رو بین ورکر ها پخش کنم. یه فیچر distributed stream processing برای HellHound هست که سیستم هایی که لوکال تعریف شدن رو بدون تغییر می شه در حالت distributed اجرا کرد. هنوز روی کد آزادش منتقل نکردم این قابلیت رو بخاطر اینکه در پیاده سازیش هنوز نکات تاریک برام وجود داره. یکی از این نکات تاریک RabbitMQ هست. نه اینکه بد باشه اما خودش نیاز به توجه خیلی زیادی داره و مطمئن نیستم که انتخاب درستی باشه. البته از انتخاب های قبلی تا اینجا بهتر بوده (‌Zookeeper و ZeroMQ).

در مورد Redis هم فکر می کنم اشاره داشتی به قابلیت Pub/Sub ش. قبلن برای یه پروژه ازش استفاده کردم. برای کار های ساده خیلی خوبه اما خوب به خوبی ابزارهای مثل RabbitMQ نیست چون برای اینکار طراحی نشده اما برای کار های ساده کاملا کافی هست.


#20

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


اسیکلش خیلی عجیبه .

سوالی ک مطرحه اینه ک . اگه با بکندی مثل پایتون یا روبی که روی ۱ ترد اجرا میشن . این پخش پروسس و تسک و انتقالش روی RabbitMQ انجام بشه . جوابگو هست … یا زبان یا wrapperاش هم میتونه تاثیر گذار باشه ؟


#21

اقا سمیر کافکا رو تست نکردید برای مسیجینگ؟ یا اون هم مشکلاتش بیشتر بود نسبت به rabbitMQ


#22

در مورد RabbitMQ زیاد مشکل پرفرمنس نداشیتم بجز مواقعی که consumer ها عقب می افتادن و کیو پر میشد. اما در مجموع همیشه پرفرمنس قابل قبولی داشت برای ما. در مورد استفاده از زبان های single thread هم باید بگم که مشکلی پیش نمیاد اگر چند تا پروسس رو یه نود اجرا بشه و نسبتا قابل قبول خواهد بود اما توی تجربه ما فشار زیادی رو نود هایی بود که consumer های پایتونی بودن. که بعضی ها شو با سکالا باز نویسی کردیم برای بازدهی بهتر. اما در کل مشکل خواصی نیست اگر استراتژی درست باشه می شه consumer ها رو اسکیل آپ کرد.

در مورد Kafka هم باید بگم که بشدت ازش استفاده می کنیم و یکی از تک های مورد علاقم هست اما برای distributed job queue مناسب نیست و درد سر زیادی ایجاد می کنه. در زمینه کاری خودش که Distributed Commit Log هست کافکا بهترین هست و حرف نداره اما به خاطر ساختارش برای این مورد خواص کارایی نداره. اگه بخوای میشه بیشتر در موردش توی یه پست جدید صحبت کنیم


#23

خیلی علاقمند هستم :relaxed: هروقت فرصت داشتید دوس دارم در این مورد از اطلاعاتتون استفاده کنم