আমি স্কালায় সন্ধান করতে আগ্রহী, এবং আমি একটি উত্তর পাচ্ছি না এমন একটি প্রাথমিক প্রশ্ন রয়েছে যার উত্তর খুঁজে পাওয়া যায়: সাধারণভাবে, স্কালা এবং জাভার মধ্যে কর্মক্ষমতা এবং মেমরির ব্যবহারের মধ্যে কোনও পার্থক্য আছে কি?
আমি স্কালায় সন্ধান করতে আগ্রহী, এবং আমি একটি উত্তর পাচ্ছি না এমন একটি প্রাথমিক প্রশ্ন রয়েছে যার উত্তর খুঁজে পাওয়া যায়: সাধারণভাবে, স্কালা এবং জাভার মধ্যে কর্মক্ষমতা এবং মেমরির ব্যবহারের মধ্যে কোনও পার্থক্য আছে কি?
উত্তর:
স্কেল এটি উপলব্ধি না করে প্রচুর পরিমাণে স্মৃতি ব্যবহার করা খুব সহজ করে তোলে। এটি সাধারণত খুব শক্তিশালী তবে মাঝে মাঝে বিরক্তিকর হতে পারে। উদাহরণস্বরূপ, ধরুন আপনার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে (ডাকা array
) এবং সেই স্ট্রিং থেকে ফাইলগুলিতে (ডাকা mapping
) একটি মানচিত্র রয়েছে । মনে করুন আপনি মানচিত্রে থাকা সমস্ত ফাইলগুলি পেতে চান এবং দৈর্ঘ্যের দুটি থেকে বড় স্ট্রিং থেকে আসতে চান। জাভাতে, আপনি সম্ভবত
int n = 0;
for (String s: array) {
if (s.length > 2 && mapping.containsKey(s)) n++;
}
String[] bigEnough = new String[n];
n = 0;
for (String s: array) {
if (s.length <= 2) continue;
bigEnough[n++] = map.get(s);
}
রক্ষে! কঠিন কাজ. স্কালায়, একই জিনিসটি করার সবচেয়ে কমপ্যাক্ট উপায় হ'ল:
val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)
সহজ! তবে, আপনি কীভাবে সংগ্রহগুলি কাজ করে সে সম্পর্কে মোটামুটিভাবে পরিচিত না হলে আপনি যা বুঝতে পারবেন না তা হ'ল এইভাবে করার ফলে অ্যারের প্রতিটি উপাদানগুলিরfilter
জন্য একটি অতিরিক্ত মধ্যবর্তী অ্যারে (সহ ) তৈরি হয়েছিল ( mapping.get
যার সাথে ফিরে আসে) একটি বিকল্প). এটি দুটি ফাংশন অবজেক্ট (একটি ফিল্টারের জন্য এবং একটি ফ্ল্যাটম্যাপের জন্য) তৈরি করে, যদিও ফাংশন অবজেক্টগুলি ছোট হওয়ায় এটি খুব কমই বড় সমস্যা।
সুতরাং মূলত, মেমরির ব্যবহারটি আদিম স্তরে, একই। তবে স্কালার লাইব্রেরিতে অনেক শক্তিশালী পদ্ধতি রয়েছে যা আপনাকে খুব সহজেই প্রচুর পরিমাণে (সাধারণত স্বল্পস্থায়ী) অবজেক্ট তৈরি করতে দেয়। আবর্জনা সংগ্রাহক সাধারণত এই ধরণের আবর্জনার সাথে খুব ভাল, তবে আপনি কী স্মৃতি ব্যবহার করছেন তা সম্পর্কে পুরোপুরি অজ্ঞতা বজায় থাকলে আপনি সম্ভবত জাভার চেয়ে স্কালায় খুব শীঘ্রই সমস্যায় পড়বেন।
নোট করুন যে জাভা-জাতীয় পারফরম্যান্স পাওয়ার জন্য কম্পিউটার ল্যাঙ্গুয়েজ বেঞ্চমার্ক গেম স্কালা কোডটি বরং জাভা-জাতীয় স্টাইলে লেখা হয়েছে এবং এতে জাভা-এর মতো মেমরির ব্যবহার রয়েছে। আপনি স্কালায় এটি করতে পারেন: আপনি যদি উচ্চ-পারফরম্যান্স জাভা কোডটির মতো দেখতে আপনার কোডটি লিখেন তবে এটি উচ্চ-পারফরম্যান্স স্কাল কোড হবে। (আপনি এটিকে আরও অডিওম্যাটিক স্কালায় রচনা করতে সক্ষম হতে পারেন এবং এখনও ভাল পারফরম্যান্স পেতে পারেন তবে এটি নির্দিষ্টকরণের উপর নির্ভর করে))
প্রোগ্রামিংয়ে ব্যয় করা সময় অনুযায়ী আমার যোগ করা উচিত, আমার স্কাল কোডটি সাধারণত আমার জাভা কোডের চেয়ে দ্রুত হয় স্কালায় আমি কম পরিশ্রম করে ক্লান্তিকর না-পারফরম্যান্স-সমালোচনামূলক অংশগুলি পেতে পারি এবং অ্যালগোরিদমকে অনুকূল করে তুলতে আমার আরও বেশি ব্যয় করতে পারি এবং কর্মক্ষমতা-সমালোচনামূলক অংশগুলির জন্য কোড।
আমি একজন নতুন ব্যবহারকারী, সুতরাং আমি উপরের রেক্স কেররের উত্তরে একটি মন্তব্য যুক্ত করতে পারছি না (নতুন ব্যবহারকারীদের "উত্তর" দেওয়ার অনুমতি দেওয়া হয়েছে তবে "মন্তব্য" নয় এটি একটি বিচিত্র রুল বিটিডাব্লু)।
উপরের রেক্সের জনপ্রিয় উত্তরের "উদ্ভুত, জাভা এত ভার্বোজ এবং এইরকম কঠোর পরিশ্রমের" জবাব দেওয়ার জন্য আমি সাইন আপ করেছি। আপনি অবশ্যই আরও সংক্ষিপ্ত স্কালা কোড লিখতে পারেন, প্রদত্ত জাভা উদাহরণটি স্পষ্টভাবে ফুলে উঠেছে। বেশিরভাগ জাভা ডেভেলপাররা এরকম কিছু কোড করে:
List<String> bigEnough = new ArrayList<String>();
for(String s : array) {
if(s.length() > 2 && mapping.get(s) != null) {
bigEnough.add(mapping.get(s));
}
}
এবং অবশ্যই, আমরা যদি ভান করতে যাচ্ছি যে গ্রহন আপনার জন্য প্রকৃত টাইপিংয়ের বেশিরভাগ কাজ করে না এবং সংরক্ষণ করা প্রতিটি চরিত্র সত্যই আপনাকে আরও ভাল প্রোগ্রামার করে তোলে, তবে আপনি এটি কোড করতে পারেন:
List b=new ArrayList();
for(String s:array)
if(s.length()>2 && mapping.get(s) != null) b.add(mapping.get(s));
এখন আমি কেবল সম্পূর্ণ ভেরিয়েবলের নাম এবং কোঁকড়ানো ধনুর্বন্ধনী টাইপ করতে আমার সময় নিচ্ছিলাম তা নয় (গভীর অ্যালগোরিদমিক ভাবনা চিন্তা করতে আমাকে আরও 5 সেকেন্ড ব্যয় করতে মুক্ত করে), তবে আমি আমার কোডটিকে অবহেলা প্রতিযোগিতায় প্রবেশ করতে এবং সম্ভাব্য অতিরিক্ত নগদ অর্জন করতে পারি ছুটির দিনগুলো.
Arrays.stream(array).map(mapping::get).filter(x->x!=null).toArray(File[]::new);
জাভা এর মতো আপনার স্কেল লিখুন এবং আপনি প্রায় অভিন্ন মেট্রিক সহ প্রায় অভিন্ন বাইটকোড নির্গত হওয়ার আশা করতে পারেন।
অপরিবর্তনীয় বস্তু এবং উচ্চতর অর্ডার ফাংশন সহ এটিকে আরও "আইডোম্যাটিকভাবে" লিখুন এবং এটি কিছুটা ধীর এবং কিছুটা বড় হবে। থাম্বের এই নিয়মের ব্যতিক্রমটি হ'ল জেনেরিক অবজেক্টগুলিতে যে ধরণের প্যারামগুলি @specialised
টীকাটি ব্যবহার করে সেগুলি ব্যবহার করার সময় এটি আরও বড় বাইটকোড তৈরি করবে যা বক্সিং / আনবক্সিং এড়িয়ে জাভার কার্যকারিতাকে ছাড়িয়ে যাবে।
এছাড়াও উল্লেখযোগ্য যে সত্য যে সমান্তরালভাবে চালানো যেতে পারে কোড লেখার সময় আরও মেমরি / কম গতি একটি অনিবার্য বাণিজ্য বন্ধ। আইডিয়োম্যাটিক স্কালা কোডটি সাধারণত জাভা কোডের চেয়ে প্রকৃতির অনেক বেশি ঘোষণামূলক এবং প্রায়শই .par
সম্পূর্ণ সমান্তরাল হওয়া থেকে মাত্র 4 টি অক্ষর ( ) দূরে থাকে।
তাই যদি
তাহলে কি আপনি বলবেন যে স্কালা কোডটি এখন তুলনামূলকভাবে 25% ধীর, বা 3x দ্রুত?
সঠিক উত্তরটি আপনি কীভাবে "পারফরম্যান্স" সংজ্ঞায়িত করেছেন তার উপর নির্ভর করে :)
.par
২.৯-এ রয়েছে।
.par
।
map
পদ্ধতিটি ব্যবহার না করে এমন স্কালা প্রোগ্রামগুলির সংখ্যা অদৃশ্যভাবে কম হবে।
কম্পিউটার ল্যাঙ্গুয়েজ বেঞ্চমার্কস গেম:
গতি পরীক্ষা জাভা / স্কাল 1.71 / 2.25
স্মৃতি পরীক্ষার জাভা / স্কাল 66.55 / 80.81
সুতরাং, এই মানদণ্ডগুলি বলে যে জাভা 24% দ্রুত এবং স্কালা 21% বেশি মেমরি ব্যবহার করে।
সব মিলিয়ে এটি কোনও বড় বিষয় নয় এবং বাস্তব বিশ্বের অ্যাপ্লিকেশনগুলিতে কোনও বিষয় নয়, যেখানে বেশিরভাগ সময় ডেটাবেস এবং নেটওয়ার্ক দ্বারা ব্যয় করা হয়।
নীচের লাইন: যদি স্কালা আপনাকে এবং আপনার দলকে (এবং যখন আপনি চলে যাবেন তখন প্রকল্প গ্রহণকারী ব্যক্তিরা) আরও বেশি উত্পাদনশীল করে তোলে, তবে আপনার উচিত।
অন্যরা টাইট লুপের বিষয়ে এই প্রশ্নের উত্তর দিয়েছেন যদিও রেক্স কেরের যে উদাহরণগুলিতে আমি মন্তব্য করেছি তার মধ্যে পারফরম্যান্স পারফরম্যান্সের পার্থক্য রয়েছে বলে মনে হয়।
এই উত্তরটি সত্যই সেই ব্যক্তিদের লক্ষ্যবস্তু করা হয়েছে যারা ডিজাইনের ত্রুটি হিসাবে টাইট-লুপ অপ্টিমাইজেশানের প্রয়োজনীয়তা তদন্ত করতে পারে।
আমি অপেক্ষাকৃত Scala নতুন am কিন্তু এটি মনে (ক বছর বা তাই সম্পর্কে), দূর পর্যন্ত, যে এটি আপনাকে অনুমতি দেয় মুলতবি নকশা, বাস্তবায়ন ও মৃত্যুদন্ড অনেক দিক অপেক্ষাকৃত সহজে (যথেষ্ট পটভূমি পড়া এবং পরীক্ষা দিয়ে :)
মুলতুবি নকশা বৈশিষ্ট্য:
বিলম্বিত বাস্তবায়ন বৈশিষ্ট্য:
স্থগিত সম্পাদনের বৈশিষ্ট্য: (দুঃখিত, কোনও লিঙ্ক নেই)
আমার কাছে এই বৈশিষ্ট্যগুলি হ'ল দ্রুত এবং আঁটসাঁট অ্যাপ্লিকেশনগুলির পথে চালিত করতে আমাদের সহায়তা করে।
রেক্স কেরের উদাহরণগুলি মৃত্যুদন্ড কার্যকর করার দিকগুলি কীভাবে পিছনে দেওয়া যায় তার মধ্যে পৃথক। জাভা উদাহরণে মেমরির বরাদ্দ স্থগিত করা হয় যতক্ষণ না আকারের গণনা করা হয় যেখানে স্কাল উদাহরণ ম্যাপিংয়ের অনুসন্ধানকে স্থগিত করে। আমার কাছে এগুলি সম্পূর্ণ আলাদা অ্যালগরিদমের মতো বলে মনে হচ্ছে।
আমি তার জাভা উদাহরণের সমান আপেলগুলিতে আপেল বেশি মনে করি তা এখানে:
val bigEnough = array.collect({
case k: String if k.length > 2 && mapping.contains(k) => mapping(k)
})
কোনও মধ্যস্থতাকারী সংগ্রহ, কোনও Option
দৃষ্টান্ত নেই ইত্যাদি This এটি সংগ্রহের প্রকারটি সংরক্ষণ করে তাই bigEnough
এর ধরণটি Array[File]
- Array
এর collect
বাস্তবায়ন সম্ভবত মিঃ কেরের জাভা কোড যা করে তার লাইন বরাবর কিছু করছে।
আমি উপরে তালিকাভুক্ত স্থগিত নকশা বৈশিষ্ট্যগুলিও স্কালার সংগ্রহের এপিআই বিকাশকারীদের এপিআই ভঙ্গ না করে ভবিষ্যতের রিলিজগুলিতে সেই দ্রুত অ্যারে-নির্দিষ্ট সংগ্রহ বাস্তবায়ন বাস্তবায়ন করতে দেয়। এটি আমি গতির পথে পদক্ষেপের সাথে উল্লেখ করছি।
এছাড়াও:
val bigEnough = array.withFilter(_.length > 2).flatMap(mapping.get)
withFilter
পদ্ধতি যে আমি এখান থেকে ব্যবহার করেছি পরিবর্তে filter
সংশোধন করা হয়েছে অন্তর্বর্তী সংগ্রহে সমস্যা কিন্তু এখনও অপশন উদাহরণস্বরূপ বিষয়।
স্কেলে সাধারণ সম্পাদনের গতির একটি উদাহরণ লগিংয়ের সাথে।
জাভাতে আমরা কিছু লিখতে পারি:
if (logger.isDebugEnabled())
logger.debug("trace");
স্কালায়, এটি ঠিক:
logger.debug("trace")
কারণ স্কালায় ডিবাগ করার বার্তা প্যারামিটারে " => String
" টাইপ রয়েছে যা আমি মূল্যায়ন করার সময় সঞ্চালিত প্যারামিটার-কম ফাংশন হিসাবে মনে করি, তবে ডকুমেন্টেশনটি পাস-বাই-নাম বলে।
সম্পাদনা করুন Sc স্কালায় ফাংশনগুলি অবজেক্টস তাই এখানে একটি অতিরিক্ত বস্তু রয়েছে। আমার কাজের জন্য, একটি তুচ্ছ জিনিসটির ওজন একটি লগ বার্তা অকারণে মূল্যায়নের সম্ভাবনা অপসারণের পক্ষে উপযুক্ত। }
এটি কোডটি দ্রুততর করে না তবে এটি আরও দ্রুত হওয়ার সম্ভাবনা তৈরি করে এবং অন্যান্য লোকের কোড এন ম্যাসেজের মধ্য দিয়ে যাওয়ার এবং পরিষ্কার করার অভিজ্ঞতা আমাদের কম হবে।
আমার কাছে, এটি স্কালার মধ্যে একটি ধারাবাহিক থিম।
হার্ড কোডটি ক্যাপচারে ব্যর্থ হয় কেন স্কেলা দ্রুততর যদিও এটি কিছুটা ইঙ্গিত দেয়।
আমি মনে করি এটি কোড পুনরায় ব্যবহার এবং স্কালায় কোড মানের সিলিংয়ের সংমিশ্রণ।
জাভাতে, অসাধারণ কোডটি প্রায়শই একটি বোধগম্য জগাখিচুড়ি হতে বাধ্য হয় এবং তাই উত্পাদন মানের API এর মধ্যে সত্যই কার্যকর হয় না কারণ বেশিরভাগ প্রোগ্রামাররা এটি ব্যবহার করতে সক্ষম হবে না।
আমার উচ্চ প্রত্যাশা রয়েছে যে স্কালা আমাদের মধ্যে আইনস্টাইনকে ডিএসএলগুলির মাধ্যমে সম্ভাব্যরূপে প্রকাশিত অনেক বেশি সক্ষম এপিআই বাস্তবায়নের অনুমতি দিতে পারে। স্কালায় মূল এপিআইগুলি ইতিমধ্যে এই পথটি অনেক দূরে।
এই বিষয়টিতে @ উচ্চতরগ্রন্থের উপস্থাপনা - স্কেল পারফরম্যান্স বিবেচনা যা কিছু জাভা / স্কালার তুলনা করে।
সরঞ্জাম:
দুর্দান্ত ব্লগপোস্ট:
জাভা এবং স্কালা উভয়ই জেভিএম বাইটকোডে সংকলন করে, তাই পার্থক্যটি এত বড় নয়। আপনি যে সর্বোত্তম তুলনা করতে পারেন তা সম্ভবত কম্পিউটার ভাষা বঞ্চমার্ক গেমের , যা মূলত বলে যে জাভা এবং স্কালা উভয়েরই একই মেমরির ব্যবহার রয়েছে। তালিকাভুক্ত কয়েকটি মানদণ্ডে স্কালার জাভা থেকে কিছুটা ধীরে ধীরে, তবে প্রোগ্রামগুলির বাস্তবায়ন আলাদা হওয়ার কারণ এটি হতে পারে।
সত্যিই যদিও, তারা উভয়ই এতটা ঘনিষ্ঠ যে এটি সম্পর্কে চিন্তা করার মতো নয়। স্কালার মতো আরও অভিব্যক্তিপূর্ণ ভাষা ব্যবহার করে আপনি যে উত্পাদনশীলতা বাড়িয়েছেন তা পারফরম্যান্স হিটের তুলনায় ন্যূনতম (যদি থাকে) এর চেয়ে অনেক বেশি মূল্যবান।
Java and Scala both compile down to JVM bytecode,
যা আমি so
প্রশ্নের সাথে যে বিবৃতিতে diffence isn't that big.
দেখাতে চেয়েছিলাম তার সাথে একত্রিত হয়েছিল , যে এটি so
কেবল একটি বাকবিতণ্ডার কৌশল, এবং একটি বিতর্কিত উপসংহার নয়।
জাভা উদাহরণটি আদর্শ অ্যাপ্লিকেশন প্রোগ্রামগুলির জন্য সত্যই কোনও প্রতিমা নয়। এই ধরনের অপ্টিমাইজড কোডটি সিস্টেম লাইব্রেরি পদ্ধতিতে পাওয়া যেতে পারে। তবে তারপরে এটি সঠিক ধরণের একটি অ্যারে ব্যবহার করবে, অর্থাত্ ফাইল [] এবং কোনও সূচিপত্র ছাড়বে না E (গণনা এবং যোগ করার জন্য পৃথক ফিল্টার শর্তাদি)। আমার সংস্করণটি (সর্বদা (!) কোঁকড়ানো ধনুর্বন্ধনী সহকারে হবে কারণ আমি একটি বাগ অনুসন্ধান করতে এক ঘন্টা ব্যয় করতে পছন্দ করি না যা একটিগ্রহের একক কীতে আঘাত করার জন্য 2 সেকেন্ডের সঞ্চয় করে প্রবর্তিত হয়েছিল:
List<File> bigEnough = new ArrayList<File>();
for(String s : array) {
if(s.length() > 2) {
File file = mapping.get(s);
if (file != null) {
bigEnough.add(file);
}
}
}
তবে আমি আমার বর্তমান প্রকল্প থেকে আপনাকে অনেক কুরুচিপূর্ণ জাভা কোড উদাহরণ আনতে পারি। আমি সাধারণ অনুলিপি এড়াতে চেষ্টা করেছি এবং সাধারণ কাঠামো এবং আচরণগুলি প্রমাণ করে কোডিংয়ের স্টাইলটি সংশোধন করেছি।
আমার বিমূর্ত ডিএও বেস ক্লাসে আমার সাধারণ ক্যাশেিং প্রক্রিয়াটির জন্য একটি বিমূর্ত অভ্যন্তর শ্রেণি রয়েছে। প্রতিটি কংক্রিট মডেল অবজেক্ট টাইপের জন্য এখানে অ্যাবস্ট্রাক্ট ডিএও বেস ক্লাসের একটি সাবক্লাস থাকে, যার মধ্যে অভ্যন্তরীণ শ্রেণিটি এমন একটি পদ্ধতির জন্য একটি প্রয়োগকরণ সরবরাহ করে যা উপ-বন্টন হয় যখন এটি ডাটাবেস থেকে লোড হওয়ার পরে ব্যবসায়ের বস্তু তৈরি করে। (আমরা একটি ওআরএম সরঞ্জাম ব্যবহার করতে পারি না কারণ আমরা মালিকানাধীন এপিআইয়ের মাধ্যমে অন্য একটি সিস্টেমে অ্যাক্সেস করি))
এই সাবক্লাসিং এবং ইনস্ট্যান্টেশন কোড জাভাতে মোটেই পরিষ্কার নয় এবং স্কালায় খুব পঠনযোগ্য হবে।