সবার আগে আমি এটা পরিষ্কার করে বলতে চাই যে এটি কোন ভাষা-এক্স-বনাম-ভাষা-ওয়াই প্রশ্ন নয় এটি কোনটি ভাল তা নির্ধারণ করার জন্য।
আমি দীর্ঘদিন ধরে জাভা ব্যবহার করে আসছি এবং এটি ব্যবহার চালিয়ে যাওয়ার মনস্থ করি। এর সমান্তরাল, আমি বর্তমানে খুব আগ্রহের সাথে স্কেলা শিখছি: কিছুটা ছোট্ট বিষয়গুলি ছাড়াও যা আমার ধারণাকে অভ্যস্ত করে তোলে তা হল আমি এই ভাষায় সত্যই খুব ভাল কাজ করতে পারি।
আমার প্রশ্নটি হল: স্কালায় লেখা সফ্টওয়্যার কীভাবে জাভাতে লেখা সফ্টওয়্যারকে কার্যকর করার গতি এবং মেমরির ব্যবহারের ক্ষেত্রে তুলনা করে? অবশ্যই, এটি সাধারণভাবে উত্তর দেওয়া একটি কঠিন প্রশ্ন, তবে আমি প্রত্যাশা করব যে উচ্চ স্তরের গঠন যেমন প্যাটার্ন ম্যাচিং, উচ্চ-অর্ডার ফাংশন, ইত্যাদি কিছু ওভারহেড প্রবর্তন করে।
তবে স্ক্যালায় আমার বর্তমান অভিজ্ঞতা 50 টি লাইনের কোডের নীচে ছোট উদাহরণগুলিতে সীমাবদ্ধ এবং আমি এখন পর্যন্ত কোনও মানদণ্ড চালাচ্ছি না। সুতরাং, আমার কোন বাস্তব তথ্য নেই।
যদি এটি পরিণত Scala যে আছে জাভা wrt কিছু ওভারহেড, এটা জ্ঞান মিশ্র Scala / জাভা প্রকল্প আছে করতে না, যেখানে একটা কোড Scala আরও জটিল অংশ এবং জাভা কর্মক্ষমতা-সমালোচনামূলক অংশ? এটি কি সাধারণ অনুশীলন?
সম্পাদনা 1
আমি একটি ছোট মানদণ্ড চালিয়েছি: পূর্ণসংখ্যার একটি তালিকা তৈরি করুন, প্রতিটি পূর্ণসংখ্যাকে দুটি দ্বারা গুণিত করুন এবং এটি একটি নতুন তালিকায় রাখুন, ফলাফলটি মুদ্রণ করুন। আমি একটি জাভা বাস্তবায়ন (জাভা 6) এবং একটি স্কালা বাস্তবায়ন (স্কালা 2.9) লিখেছি। আমি উভয়ই উবুন্টু 10.04 এর অধীনে এক্লিপস ইন্ডিগোর উপর চালিয়েছি।
ফলাফলগুলি তুলনামূলক: জাভা জন্য 480 এমএস এবং স্কালার জন্য 493 এমএস (গড় গড় 100 টি পুনরাবৃত্তি)। আমি ব্যবহার করেছি স্নিপেটগুলি এখানে।
// Java
public static void main(String[] args)
{
long total = 0;
final int maxCount = 100;
for (int count = 0; count < maxCount; count++)
{
final long t1 = System.currentTimeMillis();
final int max = 20000;
final List<Integer> list = new ArrayList<Integer>();
for (int index = 1; index <= max; index++)
{
list.add(index);
}
final List<Integer> doub = new ArrayList<Integer>();
for (Integer value : list)
{
doub.add(value * 2);
}
for (Integer value : doub)
{
System.out.println(value);
}
final long t2 = System.currentTimeMillis();
System.out.println("Elapsed milliseconds: " + (t2 - t1));
total += t2 - t1;
}
System.out.println("Average milliseconds: " + (total / maxCount));
}
// Scala
def main(args: Array[String])
{
var total: Long = 0
val maxCount = 100
for (i <- 1 to maxCount)
{
val t1 = System.currentTimeMillis()
val list = (1 to 20000) toList
val doub = list map { n: Int => 2 * n }
doub foreach ( println )
val t2 = System.currentTimeMillis()
println("Elapsed milliseconds: " + (t2 - t1))
total = total + (t2 - t1)
}
println("Average milliseconds: " + (total / maxCount))
}
সুতরাং, এক্ষেত্রে মনে হয় স্কালার ওভারহেড (পরিসর, মানচিত্র, ল্যাম্বদা ব্যবহার করে) সত্যই ন্যূনতম, যা ওয়ার্ল্ড ইঞ্জিনিয়ারের দেওয়া তথ্য থেকে খুব দূরে নয়।
হতে পারে এমন অন্যান্য স্কালা কনস্ট্রাকশন রয়েছে যা যত্নের সাথে ব্যবহার করা উচিত কারণ এগুলি সম্পাদন করতে বিশেষত ভারী ?
সম্পাদনা 2
আপনারা কেউ কেউ উল্লেখ করেছেন যে অভ্যন্তরীণ লুপগুলিতে থাকা প্রিন্টলনগুলি বেশিরভাগ কার্যকরের সময় নেয়। আমি সেগুলি সরিয়েছি এবং 20000 এর পরিবর্তে তালিকার আকার 100000 এ সেট করেছি resulting ফলস্বরূপ গড়টি জাভার জন্য 88 এমএস এবং স্কালার জন্য 49 এমএস ছিল।