অস্বীকৃতি
আমি জানি যে কৃত্রিম মানদণ্ডগুলি মন্দ। তারা কেবল খুব নির্দিষ্ট সংকীর্ণ পরিস্থিতির জন্য ফলাফল প্রদর্শন করতে পারে। আমি মনে করি না যে কিছু বোকা বেঞ্চের কারণে একটি ভাষা অন্যটির চেয়ে ভাল। তবে আমি অবাক হচ্ছি কেন ফলাফল এত আলাদা। নীচে আমার প্রশ্নগুলি দেখুন।
গণিতের মানদণ্ডের বর্ণনা
বেঞ্চমার্ক হ'ল গণিতের গণনা যা প্রধান সংখ্যাগুলির জোড়গুলি খুঁজে বের করে যা 6 দ্বারা পৃথক হয় (তথাকথিত সেক্সি প্রাইমস ) উদাহরণস্বরূপ 100 এর নীচে সেক্সি প্রাইমগুলি হ'ল:(5 11) (7 13) (11 17) (13 19) (17 23) (23 29) (31 37) (37 43) (41 47) (47 53) (53 59) (61 67) (67 73) (73 79) (83 89) (97 103)
ফলাফলের টেবিল
সারণীতে: সেকেন্ডে গণনার সময় চলমান: ফ্যাক্টর ব্যতীত অন্য সমস্ত ভার্চুয়ালবক্সে চলছিল (ডিবিয়ান অস্থির amd64 অতিথি, উইন্ডোজ 7 x64 হোস্ট) সিপিইউ: এএমডি এ 4-3305 এম
Sexy primes up to: 10k 20k 30k 100k
Bash 58.00 200.00 [*1] [*1]
C 0.20 0.65 1.42 15.00
Clojure1.4 4.12 8.32 16.00 137.93
Clojure1.4 (optimized) 0.95 1.82 2.30 16.00
Factor n/a n/a 15.00 180.00
Python2.7 1.49 5.20 11.00 119
Ruby1.8 5.10 18.32 40.48 377.00
Ruby1.9.3 1.36 5.73 10.48 106.00
Scala2.9.2 0.93 1.41 2.73 20.84
Scala2.9.2 (optimized) 0.32 0.79 1.46 12.01
[* 1] - কত সময় লাগবে তা ভেবে ভীত আমি
কোড তালিকা
সি:
int isprime(int x) {
int i;
for (i = 2; i < x; ++i)
if (x%i == 0) return 0;
return 1;
}
void findprimes(int m) {
int i;
for ( i = 11; i < m; ++i)
if (isprime(i) && isprime(i-6))
printf("%d %d\n", i-6, i);
}
main() {
findprimes(10*1000);
}
রুবি:
def is_prime?(n)
(2...n).all?{|m| n%m != 0 }
end
def sexy_primes(x)
(9..x).map do |i|
[i-6, i]
end.select do |j|
j.all?{|j| is_prime? j}
end
end
a = Time.now
p sexy_primes(10*1000)
b = Time.now
puts "#{(b-a)*1000} mils"
স্কেল:
def isPrime(n: Int) =
(2 until n) forall { n % _ != 0 }
def sexyPrimes(n: Int) =
(11 to n) map { i => List(i-6, i) } filter { _ forall(isPrime(_)) }
val a = System.currentTimeMillis()
println(sexyPrimes(100*1000))
val b = System.currentTimeMillis()
println((b-a).toString + " mils")
স্কেলা অপিমাইজড isPrime
( ক্লোজার অপ্টিমাইজেশানের মতো একই ধারণা):
import scala.annotation.tailrec
@tailrec // Not required, but will warn if optimization doesn't work
def isPrime(n: Int, i: Int = 2): Boolean =
if (i == n) true
else if (n % i != 0) isPrime(n, i + 1)
else false
ক্লোজার:
(defn is-prime? [n]
(every? #(> (mod n %) 0)
(range 2 n)))
(defn sexy-primes [m]
(for [x (range 11 (inc m))
:let [z (list (- x 6) x)]
:when (every? #(is-prime? %) z)]
z))
(let [a (System/currentTimeMillis)]
(println (sexy-primes (* 10 1000)))
(let [b (System/currentTimeMillis)]
(println (- b a) "mils")))
ক্লোজার অপ্টিমাইজড is-prime?
:
(defn ^:static is-prime? [^long n]
(loop [i (long 2)]
(if (= (rem n i) 0)
false
(if (>= (inc i) n) true (recur (inc i))))))
পাইথন
import time as time_
def is_prime(n):
return all((n%j > 0) for j in xrange(2, n))
def primes_below(x):
return [[j-6, j] for j in xrange(9, x+1) if is_prime(j) and is_prime(j-6)]
a = int(round(time_.time() * 1000))
print(primes_below(10*1000))
b = int(round(time_.time() * 1000))
print(str((b-a)) + " mils")
ফ্যাক্টর
MEMO:: prime? ( n -- ? )
n 1 - 2 [a,b] [ n swap mod 0 > ] all? ;
MEMO: sexyprimes ( n n -- r r )
[a,b] [ prime? ] filter [ 6 + ] map [ prime? ] filter dup [ 6 - ] map ;
5 10 1000 * sexyprimes . .
বাশ (zsh):
#!/usr/bin/zsh
function prime {
for (( i = 2; i < $1; i++ )); do
if [[ $[$1%i] == 0 ]]; then
echo 1
exit
fi
done
echo 0
}
function sexy-primes {
for (( i = 9; i <= $1; i++ )); do
j=$[i-6]
if [[ $(prime $i) == 0 && $(prime $j) == 0 ]]; then
echo $j $i
fi
done
}
sexy-primes 10000
প্রশ্ন
- স্কেলা এত দ্রুত কেন? এটি কি স্থির টাইপিংয়ের কারণে ? অথবা এটি খুব কার্যকরভাবে জেভিএম ব্যবহার করছে?
রুবি এবং পাইথনের মধ্যে এত বড় পার্থক্য কেন? আমি ভেবেছিলাম এই দুটি কিছুটা সম্পূর্ণ আলাদা নয়। আমার কোডটি ভুল হতে পারে। আমাকে আলোকিত করুন! ধন্যবাদইউপিডি হ্যাঁ, এটি আমার কোডে ত্রুটি ছিল। পাইথন এবং রুবি 1.9 বেশ সমান।- রুবি সংস্করণগুলির মধ্যে উত্পাদনশীলতায় সত্যই চিত্তাকর্ষক লাফ।
- আমি কি ধরণের ঘোষণা যুক্ত করে ক্লোজার কোডটি অনুকূল করতে পারি? এটা সাহায্য করবে?
sqrt(n)
তবে এটি গণনা করতে কিছুটা সময় নিতে পারে। এছাড়াও আপনার সি কোডগুলি প্রাইমগুলি খুঁজে পাওয়ার সাথে সাথে এটি মুদ্রণ করে, যেখানে আপনার অন্যান্য ভাষাগুলি সেগুলিকে তালিকায় গণনা করে এবং পরে সেগুলি মুদ্রণ করে। যদিও সি আশ্চর্যজনকভাবে দ্রুততম, আপনি এটি আরও দ্রুত পেতে সক্ষম হতে পারেন।