প্রশ্নটি দুটি ভাগে। প্রথমটি ধারণামূলক। পরের স্ক্যালায় একই প্রশ্নটিকে আরও দৃ concrete়তার সাথে দেখায়।
- কোন প্রোগ্রামিং ভাষায় কেবলমাত্র অপরিবর্তনীয় ডেটা স্ট্রাকচার ব্যবহারের ফলে কিছু নির্দিষ্ট অ্যালগরিদম / যুক্তি সহজাতভাবে বাস্তবায়নে কম্পিউটারের ব্যয় আরও বেশি ব্যয় হয়? এটি এ সত্যটির প্রতি দৃষ্টি আকর্ষণ করে যে অপরিবর্তনীয়তা নিখুঁত কার্যকরী ভাষার মূল শিক্ষিকা। এটি প্রভাবিত অন্যান্য কারণ আছে?
- এর আরও দৃ concrete় উদাহরণ গ্রহণ করা যাক। কুইকসোর্ট সাধারণত মেমরির ইন-মেমরি স্ট্রাকচারে পরিবর্তনীয় ক্রিয়াকলাপগুলি শেখানো এবং প্রয়োগ করা হয়। কীভাবে কেউ মিউটেবল সংস্করণে তুলনীয় কম্পিউটিশনাল এবং স্টোরেজ ওভারহেড সহ একটি বিশুদ্ধ কার্যকরী উপায়ে এই জাতীয় জিনিস বাস্তবায়ন করে। বিশেষত স্কালায়। আমি নীচে কিছু অপরিশোধিত মানদণ্ড অন্তর্ভুক্ত করেছি।
আরো বিস্তারিত:
আমি একটি অত্যাবশ্যক প্রোগ্রামিং ব্যাকগ্রাউন্ড (সি ++, জাভা) থেকে এসেছি। আমি ক্রিয়ামূলক প্রোগ্রামিং, বিশেষত স্কালার অন্বেষণ করেছি।
খাঁটি কার্যকরী প্রোগ্রামিংয়ের প্রাথমিক নীতিগুলির কয়েকটি:
- কাজগুলি প্রথম শ্রেণির নাগরিক।
- ফাংশনগুলির পার্শ্ব প্রতিক্রিয়া নেই এবং তাই অবজেক্ট / ডেটা স্ট্রাকচার অপরিবর্তনীয় ।
যদিও আধুনিক জেভিএমগুলি অবজেক্ট তৈরির ক্ষেত্রে অত্যন্ত দক্ষ এবং আবর্জনা সংগ্রহ স্বল্পস্থায়ী বস্তুর জন্য খুব সাশ্রয়ী, তবুও সম্ভবত অবজেক্টের সৃষ্টি সঠিকভাবে হ্রাস করা আরও ভাল? কমপক্ষে একক থ্রেডযুক্ত অ্যাপ্লিকেশনে যেখানে একত্রীকরণ এবং লক করা কোনও সমস্যা নয়। যেহেতু স্কালা একটি হাইব্রিড দৃষ্টান্ত, তাই প্রয়োজনে পরিবর্তনীয় জিনিসগুলির সাথে একটি আবশ্যক কোড লিখতে বেছে নিতে পারেন। তবে, এমন কেউ যিনি অবজেক্টগুলিকে পুনরায় ব্যবহার করতে এবং বরাদ্দকে হ্রাস করার জন্য বহু বছর ব্যয় করেছেন। আমি ভাবনা বিদ্যালয়ের একটি ভাল বোঝার চাই যা এমনকি এটির অনুমতি দেয় না।
একটি নির্দিষ্ট কেস হিসাবে, আমি এই টিউটোরিয়াল 6-র এই কোড স্নিপেট থেকে কিছুটা অবাক হয়েছিলাম । এটিতে কুইকসোর্টের একটি জাভা সংস্করণ রয়েছে যার পরে এটির ঝরঝরে ঝরঝরে বাস্তবায়ন রয়েছে।
বাস্তবায়নগুলি মাপদণ্ডের জন্য এখানে আমার প্রচেষ্টা। আমি বিস্তারিত প্রোফাইলিং করিনি। তবে, আমার অনুমান যে স্কেলার সংস্করণটি ধীরে ধীরে কারণ বরাদ্দকৃত বস্তুর সংখ্যা লিনিয়ার (পুনরাবৃত্তি কল প্রতি এক) one টেল কল অপ্টিমাইজেশানগুলি খেলতে আসতে পারে এমন কোনও উপায় আছে কি? আমি যদি সঠিক হয়ে থাকি তবে স্কালা স্ব-পুনরাবৃত্ত কলগুলির জন্য টেল কল অপ্টিমাইজেশন সমর্থন করে। সুতরাং, এটি কেবল এটির সহায়তা করা উচিত। আমি স্কেলা ২.৮ ব্যবহার করছি।
জাভা সংস্করণ
public class QuickSortJ {
public static void sort(int[] xs) {
sort(xs, 0, xs.length -1 );
}
static void sort(int[] xs, int l, int r) {
if (r >= l) return;
int pivot = xs[l];
int a = l; int b = r;
while (a <= b){
while (xs[a] <= pivot) a++;
while (xs[b] > pivot) b--;
if (a < b) swap(xs, a, b);
}
sort(xs, l, b);
sort(xs, a, r);
}
static void swap(int[] arr, int i, int j) {
int t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
}
স্কালা সংস্করণ
object QuickSortS {
def sort(xs: Array[Int]): Array[Int] =
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}
বাস্তবায়ন তুলনা করতে স্কেল কোড
import java.util.Date
import scala.testing.Benchmark
class BenchSort(sortfn: (Array[Int]) => Unit, name:String) extends Benchmark {
val ints = new Array[Int](100000);
override def prefix = name
override def setUp = {
val ran = new java.util.Random(5);
for (i <- 0 to ints.length - 1)
ints(i) = ran.nextInt();
}
override def run = sortfn(ints)
}
val benchImmut = new BenchSort( QuickSortS.sort , "Immutable/Functional/Scala" )
val benchMut = new BenchSort( QuickSortJ.sort , "Mutable/Imperative/Java " )
benchImmut.main( Array("5"))
benchMut.main( Array("5"))
ফলাফল
টানা পাঁচ রানের জন্য মিলিসেকেন্ডে সময়
Immutable/Functional/Scala 467 178 184 187 183
Mutable/Imperative/Java 51 14 12 12 12
O(n)
তালিকার কনটাক্ট ব্যবহার করে। এটি সিউডোকোড সংস্করণের তুলনায় ছোট;)