সি ++ পারফরম্যান্স বনাম জাভা / সি #


119

আমার বোধগম্যতা হল যে সি / সি ++ নির্দিষ্ট মেশিন আর্কিটেকচারে চালানোর জন্য দেশীয় কোড তৈরি করে। বিপরীতভাবে, জাভা এবং সি # এর মতো ভাষাগুলি ভার্চুয়াল মেশিনের উপরে চলে যা দেশীয় আর্কিটেকচারকে সরিয়ে দেয়। যৌক্তিকভাবে জাভা বা সি # এর পক্ষে এই মধ্যবর্তী পদক্ষেপের কারণে সি ++ এর গতির সাথে মিল পাওয়া অসম্ভব বলে মনে হচ্ছে, তবে আমাকে বলা হয়েছে যে সর্বশেষতম সংকলক ("হট স্পট") এই গতি অর্জন করতে পারে বা এটিও অতিক্রম করতে পারে।

সম্ভবত এটি কোনও ভাষার প্রশ্নের চেয়ে সংকলক প্রশ্ন বেশি, তবে যে কোনও ভার্চুয়াল মেশিন ভাষার একটি স্থানীয় ভাষার চেয়ে আরও ভাল সম্পাদন করা কীভাবে সম্ভব তা সরল ইংরেজিতে ব্যাখ্যা করতে পারেন?


জাভা এবং সি # অ্যাপ্লিকেশনটি কোডটি এটি রানটাইম উপলভ্য হিসাবে ব্যবহার করে কীভাবে বাস্তবে চালিত হয় তার ভিত্তিতে অনুকূলকরণ করতে পারে। উদাহরণস্বরূপ এটি কোনও ভাগ করা লাইব্রেরিতে কোডটি ইনলাইন করতে পারে যা প্রোগ্রামটি চলাকালীন আসলে পরিবর্তিত হতে পারে এবং এখনও সঠিক হতে পারে।
পিটার লরে

এই উত্তরগুলোর খুব স্তরপূর্ণ তত্ত্ব অনেকটা পড়ার আগে চেক কিছু প্রকৃত পরিমাপ: shootout.alioth.debian.org/u32/...
Justicle

উত্তর:


178

সাধারণত, সি # এবং জাভা ঠিক তত দ্রুত বা ত্বরান্বিত হতে পারে কারণ জেআইটি সংকলক - একটি সংকলক যা আপনার আইএলকে প্রথমবার সম্পাদিত হয় - এটি সিটি ++ সংকলিত প্রোগ্রামটি অপ্টিমাইজেশন করতে পারে কারণ এটি মেশিনটিকে জিজ্ঞাসা করতে পারে। এটি নির্ধারণ করতে পারে যে মেশিনটি ইন্টেল বা এএমডি কিনা; পেন্টিয়াম 4, কোর সলো বা কোর দ্বৈত; বা যদি এসএসই 4 সমর্থন করে, ইত্যাদি

একটি সি ++ প্রোগ্রাম সাধারণত মিক্সড অপ্টিমাইজেশানগুলির সাথে আগে সংকলন করতে হয় যাতে এটি সমস্ত মেশিনে শালীনভাবে ভালভাবে চালিত হয় তবে এটি কোনও একক কনফিগারেশনের জন্য (যেমন প্রসেসর, নির্দেশিকা সেট, অন্যান্য হার্ডওয়্যার) উপযুক্ত হতে পারে না optim

অতিরিক্তভাবে নির্দিষ্ট কিছু বৈশিষ্ট্যগুলি সি # এবং জাভাতে সংকলকটিকে আপনার কোড সম্পর্কে অনুমান করার অনুমতি দেয় যা এটি নির্দিষ্ট অংশগুলিকে অপ্টিমাইজ করতে দেয় যা কেবল সি / সি ++ কম্পাইলারের জন্য নিরাপদ নয়। যখন আপনার পয়েন্টারে অ্যাক্সেস রয়েছে তখন প্রচুর পরিমাণে অপ্টিমাইজেশন রয়েছে যা কেবল নিরাপদ নয়।

এছাড়াও জাভা এবং সি # সি ++ এর চেয়ে আরও দক্ষতার সাথে হিপ বরাদ্দগুলি করতে পারে কারণ আবর্জনা সংগ্রহকারী এবং আপনার কোডের মধ্যে বিমূর্ততার স্তর এটি একবারে (তার বেশিরভাগ ব্যয়বহুল ক্রিয়াকলাপ) এর সমস্ত হিপ সংকোচনের অনুমতি দেয়।

এখন আমি জাভাটির পক্ষে এই পরবর্তী পয়েন্টে কথা বলতে পারব না, তবে আমি জানি যে উদাহরণস্বরূপ সি # আসলে পদ্ধতিগুলি এবং পদ্ধতি কলগুলি সরিয়ে ফেলবে যখন এটি জানে যে পদ্ধতিটির শূন্যস্থান খালি রয়েছে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে।

আপনি যেমন দেখতে পাচ্ছেন, নির্দিষ্ট সি # বা জাভা বাস্তবায়ন দ্রুততর হওয়ার অনেক কারণ রয়েছে।

এখন এই সমস্ত কথাই বলা হয়েছে যে, সি ++ তে নির্দিষ্ট অপ্টিমাইজেশান তৈরি করা যেতে পারে যা আপনি সি # এর সাথে যা কিছু করতে পারেন তা ফুটিয়ে তুলবে, বিশেষত গ্রাফিক্সের ক্ষেত্র এবং যে কোনও সময় আপনি হার্ডওয়ারের কাছাকাছি রয়েছেন। পয়েন্টাররা এখানে বিস্ময়কর কাজ করে।

সুতরাং আপনি যা লিখছেন তার উপর নির্ভর করে আমি একটি বা অন্যটির সাথে যাব। তবে আপনি যদি এমন কোনও কিছু লিখছেন যা হার্ডওয়্যার নির্ভর নয় (ড্রাইভার, ভিডিও গেম, ইত্যাদি), আমি সি # (আবার জাভা সম্পর্কে বলতে পারি না) এর পারফরম্যান্স নিয়ে চিন্তিত হব না। এটা ঠিক আছে।

জাভা দিকের একটি অংশ, @ সোয়াতি একটি ভাল নিবন্ধটি দেখিয়েছেন :

https://www.ibm.com/developerworks/library/j-jtp09275


আপনার যুক্তি বগাস - সি ++ প্রোগ্রামগুলি তাদের টার্গেট আর্কিটেকচারের জন্য তৈরি হয়, তাদের রানটাইম এ স্যুইচ করার প্রয়োজন হয় না।
জাস্টিকাল

3
@ জাস্টিকাল আপনার সি ++ সংকলকটি বিভিন্ন আর্কিটেকচারের জন্য যে অফারটি দেয় তা সাধারণত x86, x64, এআরএম এবং হোয়াট নট। এখন আপনি এটিকে নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করতে বলতে পারেন (এসএসই 2 বলুন) এবং আপনি ভাগ্যবান যদি এটি বৈশিষ্ট্যটি না পাওয়া যায় তবে এটি কিছু ব্যাকআপ কোডও উত্পন্ন করবে তবে এটি যেটি পেতে পারে ততটা সূক্ষ্ম। অবশ্যই ক্যাশে আকার এবং হোয়াট নোটের উপর নির্ভর করে কোনও বিশেষত্ব নেই।
ভু

4
এই তত্ত্বটি ঘটছে না এর উদাহরণগুলির জন্য শুটআউট.আলিওথ.ডিবিয়ান.আর / ইউ 32/… দেখুন ।
জাস্টিকাল

1
সত্যি বলতে কী, এটি সবচেয়ে খারাপ উত্তর of এটি এত ভিত্তিহীন, আমি এটি কেবল উল্টাতে পারি। অত্যধিক সাধারণীকরণ, অত্যধিক অজ্ঞাততা (খালি ফাংশনগুলি অপ্টিমাইজ করা আসলে আইসবার্গের কেবলমাত্র টিপ)। একটি বিলাসবহুল সি ++ সংকলক রয়েছে: সময়। অন্য বিলাসিতা: কোনও চেকিং কার্যকর করা হয় না। তবে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১/ ৫১১০/c - performance - vs - java - c/… এ আরও সন্ধান করুন ।
সেবাস্তিয়ান মাচ

1
@ ওরিওনআড্রিয়ান ঠিক আছে আমরা এখন সম্পূর্ণ বৃত্ত ... এই তত্ত্বটি ঘটছে না এর উদাহরণগুলির জন্য শ্যুটআউট.অালিথ.ডিবিয়ান.আর / ইউ 32 / ২ দেখুন । অন্য কথায়, আমাদের দেখান যে আপনার তত্ত্বটি অস্পষ্ট অনুমানমূলক বক্তব্য দেওয়ার আগে সঠিক প্রমাণিত হতে পারে ।
জাস্টিকাল

197

জেআইটি বনাম স্ট্যাটিক সংকলক

পূর্ববর্তী পোস্টগুলিতে ইতিমধ্যে বলা হয়েছে, জেআইটি রানটাইম সময়ে আইএল / বাইটকোডকে দেশীয় কোডে সংকলন করতে পারে। এর ব্যয়টি উল্লেখ করা হয়েছিল, তবে এটির উপসংহারে নয়:

জেআইটির একটি বড় সমস্যা হ'ল এটি সবকিছু সংকলন করতে পারে না: জেআইটি সংকলন করতে সময় লাগে, তাই জেআইটি কোডের কিছু অংশ সংকলন করবে, যেখানে একটি স্ট্যাটিক সংকলক একটি সম্পূর্ণ নেটিভ বাইনারি তৈরি করবে: কিছু ধরণের প্রোগ্রামের জন্য, স্থির সংকলক সহজেই JIT কে ছাড়িয়ে যাবে।

অবশ্যই সি # (বা জাভা, বা ভিবি) সি ++ এর তুলনায় সাধারণত কার্যকর এবং শক্ত সমাধান তৈরি করতে দ্রুত হয় (কেবল যদি সি ++ এর জটিল শব্দার্থক থাকে, এবং সি ++ স্ট্যান্ডার্ড লাইব্রেরিটি আকর্ষণীয় এবং শক্তিশালী থাকে তবে পুরোটির সাথে তুলনা করলে বেশ দুর্বল হয়) .NET বা জাভা থেকে স্ট্যান্ডার্ড লাইব্রেরির স্কোপ), তাই সাধারণত, সি ++ এবং। নেট বা জাভা জেআইটির মধ্যে পার্থক্য বেশিরভাগ ব্যবহারকারীর কাছে দৃশ্যমান হবে না, এবং যে বাইনারিগুলি সমালোচনামূলক, ভাল, আপনি এখনও সি ++ প্রসেসিং কল করতে পারেন সি # বা জাভা থেকে (এমনকি এই জাতীয় নেটিভ কলগুলি নিজের মধ্যে বেশ ব্যয়বহুলও হতে পারে) ...

সি ++ রূপান্তরকাজ

নোট করুন যে সাধারণত, আপনি সি + বা জাভা এর সমতুল্য সাথে সি ++ রানটাইম কোডটি তুলনা করছেন। তবে সি ++ এর একটি বৈশিষ্ট্য রয়েছে যা বাক্সের বাইরে জাভা / সি #কে ছাড়িয়ে যেতে পারে, এটি হ'ল টেমপ্লেট রূপক: কোড প্রসেসিং সংকলন সময়ে করা হবে (এইভাবে, সংকলনের সময় বৃদ্ধি পাবে) যার ফলে শূন্য (বা প্রায় শূন্য) রানটাইম তৈরি হবে।

আমি এখনও এটিতে একটি বাস্তব জীবনের প্রভাব দেখতে পেয়েছি (আমি কেবল ধারণাগুলি দিয়ে খেলি, তবে ততক্ষণে পার্থক্যটি ছিল জেআইটি-র জন্য মৃত্যুদন্ডের কয়েক সেকেন্ড, এবং সি ++ এর জন্য শূন্য ) তবে এটি উল্লেখযোগ্য, সত্যের টেমপ্লেট রূপক পাশাপাশি নয় নগণ্য...

২০১১-০6-১০ সম্পাদনা করুন: সি ++ তে, সংকলনের সময় প্রকারের সাথে খেলানো সম্পন্ন হয়, যার অর্থ জেনেরিক কোড তৈরি করা হয় যা নন-জেনেরিক কোডকে কল করে (যেমন স্ট্রিং থেকে টাইপ টি-তে জেনেরিক পার্সার, টি টাইপের জন্য স্ট্যান্ডার্ড লাইব্রেরি এপিআই কল করে, এবং তার ব্যবহারকারীর দ্বারা পার্সারটিকে সহজেই অবিস্তারযোগ্য করা) খুব সহজ এবং খুব দক্ষ, যেখানে জাভা বা সি # এর সমতুল্য লেখার পক্ষে সবচেয়ে বেদনাদায়ক, এবং টাইপগুলি সংকলনের সময় জানা থাকলেও সর্বদা ধীর এবং সমাধানের সময়ে চালিত হবে, মানে আপনার একমাত্র আশা জেআইটির পুরো বিষয়টি ইনলাইন করা।

...

২০১১-০৯-২০১০ সম্পাদনা করুন: ব্লিটজ ++ ( হোমপেজ , উইকিপিডিয়া ) এর পিছনে দলটি সে পথে এগিয়ে গেছে এবং স্পষ্টতই, তাদের লক্ষ্য C ++ টেমপ্লেট রূপক মাধ্যমে রানটাইম এক্সিকিউশন থেকে সংকলনের সময় যতটা সম্ভব সরিয়ে বৈজ্ঞানিক গণনাগুলিতে ফরটারের সম্পাদনা পৌঁছানো is । সুতরাং " আমি এখনো তাই একটি বাস্তব জীবনে প্রভাব এই দেখতে আছে অংশ আমি উপরের লিখেছিলেন," আপাতদৃষ্টিতে করে বাস্তব জীবনে বিদ্যমান।

নেটিভ সি ++ মেমরি ইউজ

সি ++ এর জাভা / সি # থেকে মেমরির ব্যবহার আলাদা এবং এর ফলে বিভিন্ন সুবিধা / ত্রুটি রয়েছে।

জেআইটি অপ্টিমাইজেশনের বিষয়টি বিবেচনাধীন, মেমরিতে সরাসরি পয়েন্টার অ্যাক্সেস হিসাবে দ্রুত কিছুই হবে না (আসুন একটি মুহুর্তের প্রসেসরের ক্যাশে ইত্যাদির জন্য উপেক্ষা করুন)। সুতরাং, আপনার যদি মেমরির সংলগ্ন ডেটা থাকে, C ++ পয়েন্টারগুলির মাধ্যমে এটি অ্যাক্সেস করা (যেমন সি পয়েন্টার ... আসুন সিজারকে এর যথাযথ উপহার দিন) জাভা / সি # এর চেয়ে বহুগুণ দ্রুত চলে যাবে। এবং সি ++ এর আরএআইআই রয়েছে যা সি # বা এমনকি জাভা থেকে অনেকগুলি প্রসেসিংয়ে অনেক সহজ করে তোলে। সি ++ usingএর বস্তুর অস্তিত্বের সুযোগ করার দরকার নেই । এবং সি ++ এর একটি নেইfinally ধারা নেই। এটি একটি ত্রুটি নয়।

:-)

এবং সি # আদিম-মত স্ট্রাক্ট সত্ত্বেও, সি ++ "স্ট্যাকের" অবজেক্টগুলির জন্য বরাদ্দ এবং ধ্বংসের জন্য কোনও মূল্য ব্যয় করা হবে না এবং পরিষ্কার করার জন্য কোনও স্বাধীন থ্রেডে কাজ করার জন্য কোনও জিসির প্রয়োজন হবে না।

মেমরি বিভাজন হিসাবে, ২০০৮ সালে মেমরি বরাদ্দকারীরা 1980 এর পুরানো মেমরি বরাদ্দকারী নয় যা সাধারণত একটি জিসির সাথে তুলনা করা হয়: সি ++ বরাদ্দ মেমরিতে সরানো যায় না, তবে লিনাক্স ফাইল সিস্টেমে যেমন: হার্ড ডিস্কের প্রয়োজন ফ্র্যাগমেন্টেশন কখন হয় না? সঠিক কাজের জন্য সঠিক বরাদ্দকারী ব্যবহার করা C ++ বিকাশকারী সরঞ্জামদণ্ডের অংশ হওয়া উচিত। এখন, বরাদ্দকারীদের লেখা সহজ নয় এবং তারপরে, আমাদের বেশিরভাগের কাছে আরও ভাল কাজ করা উচিত এবং বেশিরভাগ ব্যবহারের জন্য, আরআইআইআই বা জিসি যথেষ্ট ভাল করার চেয়ে বেশি।

2011-10-04 সম্পাদনা করুন: দক্ষ বরাদ্দকারীদের উদাহরণগুলির জন্য: উইন্ডো প্ল্যাটফর্মগুলিতে, ভিস্টা থেকে, লো ফ্রেগমেন্টেশন হিপ ডিফল্টরূপে সক্ষম হয়। পূর্ববর্তী সংস্করণগুলির জন্য, উইনাপআই ফাংশন হিপসেটইনফর্মেশন কল করে এলএফএইচ সক্রিয় করা যেতে পারে । অন্যান্য ওএসে বিকল্প বরাদ্দকারী সরবরাহ করা হয় (দেখুন seehttps://secure.wikimedia.org/wikedia/en/wiki/Malloc একটি তালিকার জন্য)

এখন, মাল্টিকোর এবং মাল্টিথ্রেডিং প্রযুক্তির উত্থানের সাথে স্মৃতি মডেলটি কিছুটা জটিল হয়ে উঠছে। এই ক্ষেত্রে, আমি অনুমান করি .NET এর সুবিধা আছে, এবং জাভা, আমাকে বলা হয়েছিল, উপরের মাঠটি ধরেছিল। কিছু "বেয়ার মেটাল" হ্যাকারের পক্ষে তার "মেশিনের কাছে" কোডটির প্রশংসা করা সহজ। তবে এখন, সংকলকটিকে তার কাজটিতে না দিয়ে হাত দিয়ে আরও ভাল সমাবেশ তৈরি করা আরও বেশি কঠিন। সি ++ এর জন্য, এক দশক থেকে সংকলক সাধারণত হ্যাকারের চেয়ে ভাল হয়ে ওঠে। সি # এবং জাভার পক্ষে এটি আরও সহজ।

তবুও, নতুন স্ট্যান্ডার্ড সি ++ 0x সি ++ সংকলকগুলিকে একটি সাধারণ মেমোরি মডেল চাপিয়ে দেবে, যা সি ++ এ কার্যকর মাল্টিপ্রসেসিং / সমান্তরাল / থ্রেডিং কোডকে মানীকরণ করবে (এবং সহজতর করবে) এবং সংযোজকগুলির জন্য অপ্টিমাইজেশনকে আরও সহজ এবং নিরাপদ করে তুলবে। তবে এরপরে, আমরা প্রতি বছর কয়েক বছরে দেখব যদি এর প্রতিশ্রুতি সত্য হয়।

সি ++ / সিএলআই বনাম সি # / ভিবি.এনইটি

দ্রষ্টব্য: এই বিভাগে, আমি সি ++ / সিএলআই, অর্থাৎ সি ++ হোস্ট করে। নেট, নেটিভ সি ++ নয় about

গত সপ্তাহে, .NET অপ্টিমাইজেশান সম্পর্কে আমি একটি প্রশিক্ষণ পেয়েছি এবং আবিষ্কার করেছি যে স্থির সংকলক যাই হোক না কেন খুব গুরুত্বপূর্ণ। জেআইটির চেয়ে গুরুত্বপূর্ণ।

সি ++ / সি এল এলিতে সংকলিত খুব একই কোডটি (বা এর পূর্বপুরুষ, পরিচালিত সি ++) সি # (বা ভিবি.এনইটি, যার সংকলক সি # এর চেয়ে একই আইএল উত্পাদন করে) উত্পাদিত একই কোডের চেয়ে বহুগুণ দ্রুত হতে পারে।

কারণ সি ++ এর চেয়ে ইতিমধ্যে অনুকূলিত কোড তৈরি করতে সি ++ স্ট্যাটিক সংকলকটি অনেক ভাল ছিল।

উদাহরণস্বরূপ, .NET- এ অন্তর্নিহিত ফাংশন এমন ফাংশনগুলির মধ্যে সীমাবদ্ধ যাঁর বাইকোড দৈর্ঘ্য 32 বাইটের চেয়ে কম বা সমান। সুতরাং, সি # তে কিছু কোড একটি 40 বাইট অ্যাকসেসর তৈরি করবে, যা জেআইটি কখনই ইনলাইন করবে না। সি ++ / সিএলআই-তে একই কোডটি একটি 20 বাইট অ্যাকসেসর তৈরি করবে, যা জেআইটি অন্তর্ভুক্ত করবে।

আর একটি উদাহরণ হ'ল অস্থায়ী ভেরিয়েবলগুলি, যা কেবল সি ++ সংকলক দ্বারা সঙ্কলিত যখন এখনও সি # সংকলক দ্বারা উত্পাদিত আইএল-তে উল্লেখ করা হচ্ছে। সি ++ স্ট্যাটিক সংকলন অপ্টিমাইজেশনের ফলে কম কোডের ফলাফল হবে, এভাবে আরও আক্রমণাত্মক জেআইটি অপ্টিমাইজেশানকে আবার অনুমোদন দেওয়া হয়।

এর কারণটি অনুমান করা হয়েছিল যে সি ++ / সিএলআই সংকলক সি ++ নেটিভ সংকলক থেকে সুবিশাল অপ্টিমাইজেশন কৌশলগুলি থেকে লাভ হয়েছিল।

উপসংহার

আমি সি ++ পছন্দ করি।

তবে যতদূর আমি এটি দেখছি, সি # বা জাভা সবই আরও ভাল বাজে। তারা সি ++ এর চেয়ে দ্রুততর নয়, তবে আপনি যখন তাদের গুণাবলী যুক্ত করেন, তখন তারা আরও উত্পাদনশীল হয়ে ওঠে, কম প্রশিক্ষণের প্রয়োজন হয় এবং সি ++ এর চেয়ে আরও সম্পূর্ণ স্ট্যান্ডার্ড লাইব্রেরি থাকে। এবং বেশিরভাগ প্রোগ্রাম হিসাবে, তাদের গতির পার্থক্য (একরকম বা অন্যভাবে) উপেক্ষিত হবে ...

সম্পাদনা করুন (2011-06-06)

সি # /। নেট সম্পর্কে আমার অভিজ্ঞতা

আমার কাছে প্রায় একচেটিয়া পেশাদার সি # কোডিংয়ের 5 মাস রয়েছে (যা আমার সিভিতে ইতিমধ্যে সি ++ এবং জাভা এবং সি ++ / সিএলআইয়ের একটি স্পর্শ যোগ করে)।

আমি উইনফোর্ডস (আহেম ...) এবং ডাব্লুসিএফ (শীতল!), এবং ডাব্লুপিএফ (দুর্দান্ত !!!! এক্সএএমএল এবং কাঁচা সি উভয়ের মাধ্যমেই খেলেছি। ডাব্লুপিএফ এত সহজ যে আমি বিশ্বাস করি সুইং কেবল এটির সাথে তুলনা করতে পারে না), এবং সি # 4.0।

উপসংহারটি হ'ল সি ++ এর চেয়ে সি # / জাভাতে কাজ করে এমন একটি কোড তৈরি করা সহজ / দ্রুততর, যদিও সি #+ এর চেয়ে শক্তিশালী, নিরাপদ এবং শক্তসমর্থ কোড তৈরি করা অনেক কঠিন C কারণগুলি প্রচুর, তবে এটি সংক্ষিপ্ত করে দেওয়া যেতে পারে:

  1. জেনেরিক্স টেমপ্লেটগুলির মতো শক্তিশালী নয় ( সমস্যাটি বোঝার জন্য একটি দক্ষ জেনেরিক পার্স পদ্ধতি (স্ট্রিং থেকে টি তে লেখার চেষ্টা করুন)) বা বুস্টের কার্যকর সমতুল্য :: লেক্সিক্যাল_কাস্ট সমস্যা বোঝার জন্য )
  2. RAII তুলনাহীন থেকে যায় ( জিসি এখনও ফাঁস করতে পারে (হ্যাঁ, আমি সেই সমস্যাটি পরিচালনা করতে পেরেছিলাম)) এবং কেবল স্মৃতি পরিচালনা করবে Even এমনকি সি # এর usingমতো সহজ এবং শক্তিশালী নয় কারণ একটি সঠিক ডিসপোজ বাস্তবায়ন লিখতে অসুবিধা হয় )
  3. সি # readonlyএবং জাভা finalসি ++ এর মতো কোথাও কার্যকর নয়const ( অসাধারণ কাজ ছাড়াই আপনি সি # তে পঠনযোগ্য জটিল ডেটা (উদাহরণস্বরূপ নোডের একটি ট্রি) প্রকাশের কোনও উপায় নেই, যদিও এটি সি ++ এর অন্তর্নির্মিত বৈশিষ্ট্য m অপরিবর্তনীয় তথ্য একটি আকর্ষণীয় সমাধান , তবে সব কিছুই অপরিবর্তনীয় করে তোলা যায় না, সুতরাং এটি এতদূর পর্যন্ত পর্যাপ্তও নয় )।

সুতরাং, সি # যতক্ষণ না আপনি কার্যকর কিছু করতে চান ততক্ষণ একটি মনোরম ভাষা হয়ে থাকে তবে আপনি হতাশার ভাষা যে মুহুর্তে আপনি এমন কিছু চান যা সর্বদা এবং নিরাপদে থাকে কাজ করে।

জাভা আরও হতাশাজনক, কারণ এতে সি # এর চেয়ে একই সমস্যা রয়েছে এবং আরও অনেক কিছু: সি # এর usingকীওয়ার্ডের সমতুল্য না থাকা , আমার এক অত্যন্ত দক্ষ সহকর্মী তার রিসোর্সগুলি যেখানে সঠিকভাবে মুক্তি পেয়েছে তা নিশ্চিত করতে খুব বেশি সময় ব্যয় করেছেন, যেখানে সি ++ এর সমতুল্য হবে সহজ হয়েছে (ডেস্ট্রাক্টর এবং স্মার্ট পয়েন্টার ব্যবহার করে)।

সুতরাং আমি অনুমান করি যে সি # / জাভার উত্পাদনশীলতা লাভ সর্বাধিক কোডের জন্য দৃশ্যমান ... যতক্ষণ না আপনার কোডটি যতটা সম্ভব নিখুঁত হতে হবে until সেদিন, আপনি ব্যথা জানবেন। (আপনি আমাদের সার্ভার এবং জিইউআই অ্যাপ্লিকেশনগুলি যা চেয়েছেন তা বিশ্বাস করবেন না ...)।

সার্ভার-সাইড জাভা এবং সি ++ সম্পর্কে

আমি ভবনের অন্য দিকে সার্ভার দলগুলির সাথে যোগাযোগ রেখেছিলাম (আমি তাদের মধ্যে 2 বছর কাজ করেছি, জিইউআই দলে ফিরে যাওয়ার আগে) এবং আমি আকর্ষণীয় কিছু শিখলাম।

গত বছরগুলিতে, প্রবণতাটি ছিল জাভা সার্ভার অ্যাপ্লিকেশনগুলির পুরানো সি ++ সার্ভার অ্যাপ্লিকেশনগুলি প্রতিস্থাপন করার পরিকল্পনা করা হয়েছিল, কারণ জাভাতে প্রচুর ফ্রেমওয়ার্ক / সরঞ্জাম রয়েছে এবং এটি বজায় রাখা, মোতায়েন করা ইত্যাদি সহজ etc

... নিম্ন-বিলম্বিত হওয়ার সমস্যাটি গত মাসগুলিতে তার কুরুচিপূর্ণ মাথা লালন করেছে। তারপরে, জাভা সার্ভার অ্যাপ্লিকেশনগুলি, আমাদের দক্ষ জাভা টিমের দ্বারা অপ্টিমাইজেশনের চেষ্টা করা যাই হোক না কেন, সহজ এবং পরিষ্কারভাবে পুরানোগুলির বিরুদ্ধে প্রতিযোগিতাটি হারাতে পেরেছিল, সত্যিকারের অপ্টিমাইজড সি ++ সার্ভার নয়।

বর্তমানে, জাভা সার্ভারগুলিকে সাধারণ ব্যবহারের জন্য রাখার সিদ্ধান্ত নেওয়া হয়েছে যেখানে কর্মক্ষমতা এখনও গুরুত্বপূর্ণ, নিম্ন-বিন্দু লক্ষ্য দ্বারা উদ্বিগ্ন নয় এবং কম-লেটেন্সি এবং অতি-কম-ল্যাটেন্সি প্রয়োজনীয়তার জন্য ইতিমধ্যে দ্রুত সি ++ সার্ভার অ্যাপ্লিকেশনগুলিকে অনুকূল করে তোলা হয়েছে।

উপসংহার

কিছুই প্রত্যাশার মতো সহজ নয়।

জাভা এবং আরও বেশি সি #, দুর্দান্ত স্ট্যান্ডার্ড লাইব্রেরি এবং ফ্রেমওয়ার্ক সহ দুর্দান্ত ভাষা, যেখানে আপনি দ্রুত কোড দিতে পারেন এবং খুব শীঘ্রই এর ফলাফল হতে পারে।

তবে যখন আপনার কাঁচা শক্তি, শক্তিশালী এবং নিয়মতান্ত্রিক অপ্টিমাইজেশন, শক্তিশালী সংকলক সমর্থন, শক্তিশালী ভাষা বৈশিষ্ট্য এবং নিখুঁত সুরক্ষা প্রয়োজন তখন জাভা এবং সি # আপনার প্রতিযোগিতার remainর্ধ্বে থাকতে হবে এমন গুণগত মানের সর্বশেষ অনুপস্থিত তবে সমালোচনামূলক পার্সেন্ট জেতা কঠিন করে তোলে।

এটি মনে হয় যেন গড় মানের কোড তৈরি করতে আপনার সি + / জাভা এর তুলনায় সি # / জাভাতে কম সময় এবং কম অভিজ্ঞ বিকাশকারী প্রয়োজন, তবে অন্যদিকে, নিখুঁত মানের কোডের জন্য আপনার দুর্দান্ত প্রয়োজন হওয়ার মুহুর্তটি, ফলাফলগুলি পাওয়া হঠাৎ সহজ এবং দ্রুত ছিল was ঠিক সি ++ এ।

অবশ্যই এটি আমার নিজস্ব উপলব্ধি, সম্ভবত আমাদের নির্দিষ্ট প্রয়োজনের মধ্যে সীমাবদ্ধ।

তবে এখনও, জিইউআই দল এবং সার্ভার-সাইড দল দুটিতেই এটি ঘটে।

অবশ্যই, নতুন কিছু ঘটলে আমি এই পোস্টটি আপডেট করব।

সম্পাদনা করুন (2011-06-22)

"আমরা দেখতে পেলাম যে পারফরম্যান্সের ক্ষেত্রে, সি ++ একটি বড় ব্যবধানের সাথে জিতেছে it তবে, এটির পক্ষেও সর্বাধিক বিস্তৃত প্রচেষ্টা দরকার ছিল, যার মধ্যে বেশিরভাগই পরিশীলনের স্তরে করা হয়েছিল যা গড় প্রোগ্রামারকে উপলভ্য হবে না।

[...] জাভা সংস্করণটি সম্ভবত প্রয়োগ করা সবচেয়ে সহজ ছিল, তবে পারফরম্যান্সের জন্য বিশ্লেষণ করা সবচেয়ে কঠিন। বিশেষত আবর্জনা সংগ্রহের চারপাশের প্রভাবগুলি জটিল এবং টিউন করা খুব কঠিন ""

সূত্র:

সম্পাদনা করুন (2011-09-20)

"ফেসবুক এ যাচ্ছে শব্দ 'যে , যুক্তিসঙ্গতভাবে লিখিত সি ++ কোড শুধু দ্রুত চলে ' যা বিরাট পিএইচপি এবং জাভা কোড নিখুঁত এ অতিবাহিত প্রচেষ্টা ওপর জোর দেয়। অপরপক্ষে, সি ++ কোড অন্যান্য ভাষায় চেয়ে লিখতে আরো কঠিন, কিন্তু দক্ষ কোড একটি হল " অন্যান্য ভাষার চেয়ে সি ++ তে লিখতে অনেক সহজ] "।

- অ্যান্ড্রে আলেকজান্দ্রেস্কুর উদ্ধৃতি দিয়ে // বিল্ড /হার্ব সটার

সূত্র:


8
আপনি সি # এর 5 মাস পরে সম্পাদনা করুন ঠিক আমার নিজের অভিজ্ঞতার বর্ণনা দেয় (টেমপ্লেটগুলি আরও ভাল, কনট আরও ভাল, RAII)। +1 টি। এই তিনটিই আমার ব্যক্তিগত ঘাতক বৈশিষ্ট্যগুলি সি ++ (বা ডি, যার জন্য এখনও আমি সময় পাইনি) remain
সেবাস্তিয়ান মাচ

"সংকলনের সময় কোড প্রসেসিং করা হবে"। সুতরাং প্রোগ্রামে কেবলমাত্র টেমপ্লেট রূপক কাজটিই সংকলন সময়ে পাওয়া যায় যা প্রায়শই হয় না, যেমন ভ্যানিলা সি ++ তে প্রতিযোগিতামূলকভাবে পারফরম্যান্ট নিয়মিত এক্সপ্রেশন লাইব্রেরি লেখা অসম্ভব কারণ এটি রান-টাইম কোড উত্পন্নকরণের অক্ষম (একটি গুরুত্বপূর্ণ দিক) metaprogramming)।
জেডি

"সংকলনের সময় প্রকারের সাথে খেলানো সম্পন্ন করা হয় ... জাভা বা সি # এর সমতুল্য লেখার পক্ষে বেদনাদায়ক, এবং টাইপগুলি সংকলনের সময় জানা থাকলেও রানটাইমে সর্বদা ধীর এবং সমাধান হবে"। সি # তে, এটি কেবলমাত্র রেফারেন্স ধরণের ক্ষেত্রেই সত্য এবং মান ধরণের ক্ষেত্রেও এটি সত্য নয়।
জেডি

1
"জেআইটি অপ্টিমাইজেশনের বিষয়টি বিবেচনাধীন, মেমরিতে সরাসরি পয়েন্টার অ্যাক্সেস হিসাবে দ্রুত কোনও কিছুই যাবে না ... আপনার যদি মেমরির সংলগ্ন ডেটা থাকে, সি ++ পয়েন্টারগুলির মাধ্যমে এটি অ্যাক্সেস করে (যেমন সি পয়েন্টার ... আসুন সিজারকে এর যথাযথ উপহার দিন) সময় কমে যায় জাভা / সি # "এর চেয়ে দ্রুত। লোকেরা সাইমার্ক 2 বেঞ্চমার্ক থেকে এসওআর পরীক্ষায় জাভা মারতে সি ++ পর্যবেক্ষণ করেছে কারণ পয়েন্টাররা এলিয়াসিং-সম্পর্কিত অপ্টিমাইজেশনে বাধা দেয়। ব্লগস.ওরকল
জেডি

এছাড়াও লক্ষ করার মতো বিষয় যে .NET সংযোগের পরে ডায়নামিকভাবে-সংযুক্ত লাইব্রেরি জুড়ে জেনেরিকের বিশেষায়িতকরণ করে যখন C ++ করতে পারে না কারণ সংযোগের আগে টেমপ্লেটগুলি সমাধান করা উচিত। এবং স্পষ্টতই টেমপ্লেটগুলির চেয়ে বেশি বড় জেনারিকের সুবিধাগুলি হ'ল বোধগম্য ত্রুটি বার্তা।
জেডি

48

আমি যখনই বনাম পরিচালনা না করা পারফরম্যান্সের বিষয়ে কথা বলি তখন আমি রিকো (এবং রেমন্ড) সিরিজটির দিকে ইঙ্গিত করতে চাই যে চাইনিজ / ইংরেজি অভিধানের সি ++ এবং সি # সংস্করণ তুলনা করেছিলাম। এই গুগল অনুসন্ধানটি আপনাকে নিজের জন্য পড়তে দেবে, তবে আমি রিকোর সারাংশ পছন্দ করি।

তাহলে আমার ক্রাশ পরাজয়ে আমি কি লজ্জা পাচ্ছি? কষ্টসহকারে। পরিচালিত কোডটি খুব কমই কোনও প্রচেষ্টার জন্য খুব ভাল ফলাফল পেয়েছে। পরিচালিত রেমন্ডকে হারাতে হয়েছিল:

  • তার নিজের ফাইল আই / ও স্টাফ লিখুন
  • নিজের স্ট্রিং ক্লাস লিখুন
  • নিজের বরাদ্দকারী লিখুন
  • তার নিজস্ব আন্তর্জাতিক ম্যাপিং লিখুন

অবশ্যই তিনি এটি করতে নিম্ন স্তরের গ্রন্থাগারগুলি ব্যবহার করেছিলেন তবে এটি এখনও অনেক কাজ। আপনি কি একটি এসটিএল প্রোগ্রাম বাকি কল করতে পারেন? আমার মনে হয় না, আমি মনে করি তিনি স্টাডি :: ভেক্টর ক্লাসটি রেখেছিলেন যা শেষ পর্যন্ত কখনও সমস্যা ছিল না এবং তিনি অনুসন্ধানের কাজটি চালিয়ে গেছেন। বেশ কিছু বাকি সব চলে গেছে।

সুতরাং, হ্যাঁ, আপনি অবশ্যই সিএলআরকে পরাস্ত করতে পারেন। আমার মনে হয় রেমন্ড তার প্রোগ্রামটিকে আরও দ্রুত করতে পারে।

মজার বিষয় হচ্ছে, উভয় প্রোগ্রামের অভ্যন্তরীণ টাইমারদের দ্বারা উল্লিখিত ফাইলটি বিশ্লেষণের সময়টি প্রায় একই - প্রতিটির জন্য 30 মিমি। পার্থক্যটি ওভারহেডে।

আমার জন্য নীচের অংশটি হ'ল পরিচালিত সংস্করণটিকে পরাজিত করতে অপরিশোধিত সংস্করণটির জন্য 6 টি সংশোধনী লেগেছিল যা মূল পরিচালনা না করা কোডটির একটি সাধারণ বন্দর ছিল। আপনার যদি প্রতিটি শেষ বিট পারফরম্যান্সের প্রয়োজন হয় (এবং এটি পাওয়ার জন্য সময় এবং দক্ষতা আছে) তবে আপনাকে নিয়ন্ত্রণহীন অবস্থায় থাকতে হবে, তবে আমার জন্য, আমি প্রথম সংস্করণগুলিতে ৩৩ এর বেশি সংস্করণে যে পরিমাণ বাড়িয়েছি তার ক্রমটি গ্রহণ করব আমি 6 বার চেষ্টা করলে আমি লাভ করি।


3
লিঙ্কটি মারা গেছে, উল্লিখিত নিবন্ধটি এখানে পাওয়া গেছে: ব্লগস.এমএসএনএন
বি

প্রথমত, আমরা যদি রেমন্ড চেনের কোডটি দেখি তবে সে স্পষ্টতই সি ++ বা ডেটা স্ট্রাকচার খুব ভালভাবে বুঝতে পারে না। তার কোডটি নিম্ন স্তরের সি কোডের জন্য প্রায় সোজা পৌঁছে যায় এমনকি এমন ক্ষেত্রেও যেখানে সি কোডটির কোনও কার্যকারিতা সুবিধা নেই (এটি কেবল এক ধরণের অবিশ্বাস বলে মনে হয় এবং প্রোফাইলারগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে জ্ঞানের অভাব হতে পারে)। তিনি কোনও অভিধান প্রয়োগের সর্বাধিক অ্যালগরিদমিকভাবে সঠিক পদ্ধতি বুঝতেও ব্যর্থ হয়েছিলেন (তিনি std :: খ্রিস্টের জন্য অনুসন্ধান করেছিলেন)। জাভা, পাইথন, সি # ইত্যাদি সম্পর্কে খুব ভাল কিছু থাকলে - এগুলি সকলেই খুব দক্ষ অভিধান সরবরাহ করে ...
stinky472

চেষ্টা বা এমনকি স্ট্যান্ড :: মানচিত্র সি ++ বা এমনকি একটি হ্যাশ টেবিলের দিকে আরও অনুকূলভাবে ভাড়া দেয়। পরিশেষে, একটি অভিধান হ'ল প্রোগ্রামের ধরণ যা উচ্চ স্তরের গ্রন্থাগার এবং ফ্রেমওয়ার্ক থেকে সর্বাধিক উপকৃত হয়। এটি ভাষাতে এতটা পার্থক্য প্রদর্শন করে না যতটা পাঠাগার জড়িত ছিল (যার মধ্যে আমি আনন্দের সাথে বলতে চাই যে সি # অনেক বেশি সম্পূর্ণ এবং কার্যের জন্য উপযুক্ত আরও অনেক সরঞ্জাম সরবরাহ করে)। একটি প্রোগ্রাম দেখান যা বড় মাপের ম্যাট্রিক্স / ভেক্টর কোডের মতো তুলনা করে মেমরির বৃহত ব্লকগুলিকে ম্যানিপুলেট করে। এটি খুব দ্রুত নিষ্পত্তি করে
ফেলবে

26

নির্দিষ্ট সিপিইউ অপ্টিমাইজেশনের জন্য সংকলন সাধারণত ওভাররেটেড হয়। কেবল সি ++ তে একটি প্রোগ্রাম নিন এবং পেন্টিয়াম প্রো-এর জন্য অপ্টিমাইজেশান সহ সংকলন করুন এবং পেন্টিয়াম 4 এ চালান Then সাধারণ ফলাফল ?? সাধারণত 2-3% এর কম পারফরম্যান্স বৃদ্ধি পায়। সুতরাং তাত্ত্বিক জেআইটি সুবিধা প্রায় কোনওটিই নয় are স্ক্যালার ডেটা প্রসেসিং বৈশিষ্ট্যগুলি ব্যবহার করার সময় কেবলমাত্র পারফরম্যান্সের বেশিরভাগ পার্থক্য লক্ষ্য করা যায়, যাইহোক যেহেতু সর্বাধিক কার্যকারিতা অর্জনের জন্য ম্যানুয়াল ফাইন টুনিংয়ের প্রয়োজন হবে। এই ধরণের অপ্টিমাইজেশানগুলি ধীরে ধীরে এবং ব্যয়বহুল হয়ে ওঠার জন্য এগুলি কখনও কখনও জেআইটির পক্ষে অনুপযুক্ত করে তোলে।

বাস্তব জগতে এবং বাস্তব প্রয়োগে সি ++ সাধারণত জাভা থেকে দ্রুততর হয়, মূলত হালকা মেমরির পদক্ষেপের কারণে এটি আরও ভাল ক্যাশে পারফরম্যান্সের ফলস্বরূপ।

তবে আপনাকে সমস্ত সি ++ সক্ষমতার ব্যবহার করতে বিকাশকারীকে কঠোর পরিশ্রম করতে হবে। আপনি উচ্চতর ফলাফল অর্জন করতে পারেন তবে তার জন্য আপনাকে অবশ্যই আপনার মস্তিষ্ক ব্যবহার করতে হবে। সি ++ এমন একটি ভাষা যা আপনাকে আরও সরঞ্জামের সাথে উপস্থাপন করার সিদ্ধান্ত নিয়েছিল, সেই ভাষাটি যাতে আপনি ভাষাটি ভালভাবে ব্যবহার করতে সক্ষম হতে হবে সে জন্য দামটি চার্জ করতে হবে।


4
এটি এত বেশি নয় যে আপনি সিপিইউ অপ্টিমাইজেশনের জন্য সংকলন করছেন, তবে আপনি রানটাইম পাথ অপ্টিমাইজেশনের জন্য সংকলন করছেন। যদি আপনি দেখতে পান যে কোনও পদ্ধতিকে প্রায়শই একটি নির্দিষ্ট প্যারামিটারের সাথে ডাকা হয়, আপনি সেই রুটিনটিকে একটি ধ্রুবক হিসাবে সেই পরামিতিটির সাথে প্রাক-সংকলন করতে পারেন যা প্রবাহকে নিয়ন্ত্রণ করতে পারে এমন একটি বুলিয়ানের ক্ষেত্রে) কাজটির বিশাল অংশগুলি নির্ধারণ করতে পারে। সি ++ এই ধরণের অপ্টিমাইজেশানটি করার কাছাকাছি আসতে পারে না।
বিল কে

1
সুতরাং পর্যালোচনা করা রানপথগুলির সুবিধা নেওয়ার জন্য জেআইটি কীভাবে রুটিন সংশোধন করতে পারে এবং এতে কতটা পার্থক্য রয়েছে?
ডেভিড থর্নলি

2
@Bill আমি দুটি জিনিস মিশ্রিত করতে পারি ... তবে নির্দেশের পাইপলাইনে রান টাইমের সময় শাখার পূর্বাভাসটি ভাষা থেকে আলাদা একই লক্ষ্য অর্জন করতে পারে না?
হার্ডি

@ হার্দি হ্যাঁ, সিপিইউ ভাষা নির্বিশেষে শাখার পূর্বাভাস দিতে পারে, তবে লুপটির কোনও কিছুর উপর কোনও প্রভাব পড়ে না তা পর্যবেক্ষণ করে এটি সম্পূর্ণ লুপ তৈরি করতে পারে না। এটিও পর্যবেক্ষণ করবে না যে মাল্ট (0) 0-এ ফিরে আসা শক্ত-ওয়্যার্ড এবং কেবল (প্যারাম == 0) ফলাফল = 0 এর সাথে পুরো পদ্ধতি কলটি প্রতিস্থাপন করবে; এবং সম্পূর্ণ ফাংশন / পদ্ধতি কল এড়ান। সি এই বিষয়গুলি করতে পারত যদি সংকলকটিতে কী ঘটছিল তার একটি বিস্তৃত ওভারভিউ ছিল তবে সাধারণত এটি সংকলনের সময় পর্যাপ্ত তথ্য না থাকে।
বিল কে

21

জেআইটি (জাস্ট ইন টাইম সংকলন) অবিশ্বাস্যভাবে দ্রুত হতে পারে কারণ এটি লক্ষ্য প্ল্যাটফর্মের জন্য অনুকূল করে izes

এর অর্থ এটি যে সিপিইউ বিকাশকারী কোডটি লিখেছিল তা নির্বিশেষে এটি আপনার সিপিইউ সমর্থন করতে পারে এমন যে কোনও সংকলক ট্রিকের সুবিধা নিতে পারে।

। নেট জেআইটি-র মূল ধারণাটি এইভাবে কাজ করে (ভারীভাবে সরলীকৃত):

প্রথমবারের জন্য একটি পদ্ধতি কল করা:

  • আপনার প্রোগ্রাম কোডটি একটি পদ্ধতিকে ফু () কল করে
  • সিএলআর সেই ধরণের দিকে নজর দেয় যা ফু () প্রয়োগ করে এবং এর সাথে মেটাডেটা যুক্ত হয়
  • মেটাডেটা থেকে, সিএলআর জানে আইএল (ইন্টারমিডিয়েট বাইট কোড) কী মেমোরিতে ঠিকানা রয়েছে।
  • সিএলআর মেমরির একটি ব্লক বরাদ্দ করে এবং জেআইটি-কে কল করে।
  • জেআইএটি আইএলকে স্থানীয় কোডে সংকলন করে, বরাদ্দ মেমরিতে রাখে এবং তারপরে এই নেটিভ কোডটিতে নির্দেশ করতে ফু () টাইপের মেটাডেটাতে ফাংশন পয়েন্টার পরিবর্তন করে।
  • নেটিভ কোড চালানো হয়।

দ্বিতীয়বারের জন্য একটি পদ্ধতি কল করা:

  • আপনার প্রোগ্রাম কোডটি একটি পদ্ধতিকে ফু () কল করে
  • সিএলআর সেই ধরণের দিকে নজর দেয় যা ফু () প্রয়োগ করে এবং মেটাডেটাতে ফাংশন পয়েন্টারটি খুঁজে পায়।
  • এই মেমরি অবস্থানের নেটিভ কোডটি চালানো হয়।

আপনি দেখতে পাচ্ছেন, দ্বিতীয়বারের মতো, রিয়েল টাইম অপ্টিমাইজেশানের সুবিধা বাদে এর কার্যত সি ++ এর মতো একই প্রক্রিয়া।

এটি বলেছিল, এখনও ওভারহেডের অন্যান্য সমস্যা রয়েছে যা একটি পরিচালিত ভাষা ধীর করে দেয়, তবে জেআইটি অনেক সহায়তা করে।


জোনাথন যাইহোক, আমি মনে করি কেউ এখনও আপনার জিনিসগুলিকে হ্রাস করছে। আমি যখন আপনাকে ভোট দিয়েছিলাম তখন এই পোস্টে আপনার একটি -1 ছিল।
ব্রায়ান আর বন্ডি

12

আমি ওরিয়ন অ্যাড্রিয়ান পছন্দ করি এর উত্তর তবে এর আরও একটি দিক আছে।

বহু দশক আগে ফোরট্রানের মতো সমাবেশ ভাষা বনাম "মানব" ভাষা নিয়ে একই প্রশ্ন উত্থাপিত হয়েছিল। এবং উত্তর অংশ অনুরূপ।

হ্যাঁ, একটি সি ++ প্রোগ্রাম যে কোনও প্রদত্ত (অ-তুচ্ছ?) অ্যালগরিদমের তুলনায় সি # এর চেয়ে দ্রুততর হতে সক্ষম, তবে সি # তে প্রোগ্রামটি প্রায়শই সি ++ এ "নিষ্পাপ" প্রয়োগের চেয়ে তত দ্রুত বা দ্রুত হবে এবং সি ++ তে একটি অনুকূলিত সংস্করণ হবে বিকাশ হতে আরও বেশি সময় লাগবে এবং এখনও সি # সংস্করণটিকে খুব অল্প ব্যবধানে পরাজিত করতে পারে। সুতরাং, এটি কি আসলেই মূল্যবান?

আপনাকে এই প্রশ্নের উত্তর একের পর এক ভিত্তিতে দিতে হবে।

এটি বলেছিল, আমি সি +++ এর দীর্ঘ সময়ের অনুরাগী এবং আমার মনে হয় এটি একটি অবিশ্বাস্যরূপে ভাববাদী এবং শক্তিশালী ভাষা - কখনও কখনও অপ্রস্তুত হয় না। তবে অনেকগুলি "বাস্তব জীবনের" সমস্যাগুলিতে (ব্যক্তিগতভাবে আমার কাছে, এর অর্থ "সমাধানের জন্য আমি যে ধরণের অর্থ প্রদান করি"), সি # দ্রুত এবং নিরাপদ কাজটি সম্পাদন করবে।

আপনি যে সবচেয়ে বড় জরিমানা দেন? অনেক। নেট এবং জাভা প্রোগ্রাম মেমরি হোগ হয়। আমি দেখেছি। নেট এবং জাভা অ্যাপ্লিকেশনগুলি "শত শত" মেগাবাইট মেমরি নিয়ে থাকে, যখন অনুরূপ জটিলতার সি ++ প্রোগ্রামগুলি এমবি'র "দশক" সবে স্ক্র্যাচ করে।


7

আমি নিশ্চিত নই যে আপনি কতবার দেখতে পাবেন যে জাভা কোডটি সি ++ এর চেয়ে আরও দ্রুত চলবে, এমনকি হটস্পটের সাথেও, তবে কীভাবে এটি হতে পারে তা ব্যাখ্যা করার জন্য আমি একটি দোল নেব।

সংকলিত জাভা কোডটিকে JVM এর জন্য ব্যাখ্যাযুক্ত মেশিনের ভাষা হিসাবে ভাবেন। হটস্পট প্রসেসর যখন লক্ষ্য করে যে সংকলিত কোডের কিছু নির্দিষ্ট টুকরোগুলি বহুবার ব্যবহৃত হচ্ছে, তখন এটি মেশিন কোডে একটি অপ্টিমাইজেশন সম্পাদন করে। যেহেতু হ্যান্ড-টিউনিং অ্যাসেমব্লিটি সি ++ সংকলিত কোডের চেয়ে প্রায় সবসময় দ্রুত হয়, তাই প্রোগ্রাম্যালি-টিউন করা মেশিন কোডটি খুব বেশি কার্যকর হবে না তা অনুধাবন করা ঠিক হবে খারাপ ।

সুতরাং, অত্যন্ত পুনরাবৃত্তিযোগ্য কোডের জন্য, আমি দেখতে পেতাম যে হটস্পট জেভিএমের জাভা সি সি ++ এর চেয়ে দ্রুত চালানো সম্ভব ছিল ... যতক্ষণ না আবর্জনা সংগ্রহ কার্যকর না হয়। :)


আপনি দৃser়তা উপর প্রসারিত করতে পারেন Since hand-tuning Assembly is almost always faster than C++ compiled code? "হ্যান্ড-টিউনিং অ্যাসেম্বলি" এবং "সি ++ সংকলিত কোড" বলতে কী বোঝ?
14:30

ঠিক আছে, এটি একটি সংকলকের অপ্টিমাইজার বিধি অনুসরণ করে এবং কোডাররা তা অনুসরণ করে না তার ধারণার ভিত্তিতে। সুতরাং সর্বদা কোড হতে চলেছে যে অপটিমাইজারটি এটি পুরোপুরি অপ্টিমাইজ করতে পারে না এমনটি আবিষ্কার করে, তবে কোনও মানুষ একটি বড় ছবি দেখে বা কোডটি আসলে কী করছে সে সম্পর্কে আরও জানতে পেরে। আমি এটি যুক্ত করব যে এটি একটি 3 বছরের পুরানো মন্তব্য, এবং আমি হটস্পট সম্পর্কে আমার আগের তুলনায় আরও জানি এবং কোডটি দ্রুত চালিত হওয়ার জন্য খুব সহজেই ডায়নামিক অপটিমাইজেশনটি দেখতে পাচ্ছি।
বিলজামেদেব

1. হটস্পট বা অন্য কোনও জেআইটি থেকে অনুকূলিতকরণগুলি এখনও সংকলক অপ্টিমাইজেশান। কিছু ফলাফলের ইনলাইন করতে সক্ষম হওয়া (স্থায়ীভাবে কোড বলা কোড), এমনকি এক্সিকিউটিভ প্রসেসরের উপর ভিত্তি করে অপ্টিমাইজেশন তৈরি করতে সক্ষম হওয়ার একটি স্থির সংকলক, এমনকি জেআইটির সুবিধা রয়েছে, তবে এটি এখনও একটি সংকলক অপ্টিমাইজেশন। । । ২. আমার ধারণা আপনি আলগোরিদম অপ্টিমাইজেশনের কথা বলছেন, "এসেম্বলি ফাইন টিউনিং" নয়। "হিউম্যান কোডার দ্বারা ম্যানুয়াল অ্যাসেম্বলি ফাইন টুনিং" এক দশকেরও বেশি সময় থেকে সংকলক অপ্টিমাইজেশনের চেয়ে ভাল ফলাফল দিতে ব্যর্থ হয়েছে। প্রকৃতপক্ষে,
অ্যাসেমব্লিতে

ঠিক আছে, আমি পেয়েছি যে আমি "স্ট্যাটিক অপ্টিমাইজেশন" না হয়ে "সংকলক অপ্টিমাইজেশন" ভুল সংজ্ঞা ব্যবহার করছি। আমি উল্লেখ করব যে, অন্তত গেমিং শিল্পে, পিএস 2 এর জন্য আমরা এখনও হাতে-কোডেড অ্যাসেমবিলিটি নির্দিষ্ট স্থানে আমরা জানতাম যে নির্দিষ্ট চিপগুলি কনসোলটিতে ছিল তার জন্য "অনুকূলিতকরণ" করার জন্য; এই নতুন চিপগুলির জন্য ক্রস-সংকলকগুলি x86 আর্কিটেকচারের মতো এখনও পরিশীলিত হয়নি। উপরের মূল প্রশ্নের দিকে ফিরে: জেআইটি অনুকূলিতকরণের আগে পরিমাপ করতে সক্ষম হওয়ার সুবিধা পেয়েছে, যা ভাল জিনিস (টিএম)
বিলজেমসেদেব

মনে রাখবেন যে বেশিরভাগ উত্পাদক জিসিগুলি হস্ত-লিখিত এসেমব্লার ব্যবহার করে কারণ সি / সি ++ এটি কেটে না।
জেডি

6

সাধারণত, আপনার প্রোগ্রামের অ্যালগরিদম ভাষার চেয়ে আপনার প্রয়োগের গতির পক্ষে অনেক বেশি গুরুত্বপূর্ণ হবে । আপনি সি ++ সহ যে কোনও ভাষায় দুর্বল অ্যালগরিদম প্রয়োগ করতে পারেন। এই বিষয়টি মনে রেখে আপনি সাধারণত একটি কোড রান করতে কোড দ্রুত লিখতে সক্ষম হবেন যা আপনাকে আরও দক্ষ অ্যালগরিদম বাস্তবায়নে সহায়তা করে।

উচ্চ-স্তরের ভাষাগুলি এগুলিতে অনেকগুলি দক্ষ প্রাক-বিল্ট ডেটা স্ট্রাকচারগুলিতে সহজ অ্যাক্সেস সরবরাহ এবং উত্সাহজনক অনুশীলনগুলির মাধ্যমে এটি খুব ভাল করে যা আপনাকে অক্ষম কোড এড়াতে সহায়তা করবে। অবশ্যই, তারা মাঝে মাঝে খুব ধীরে ধীরে ধীরে ধীরে কোড লিখতেও সহজ করে তুলতে পারে, তাই আপনাকে এখনও আপনার প্ল্যাটফর্মটি জানতে হবে।

এছাড়াও, সি ++ এসটিএল পাত্রে, অটো পয়েন্টার ইত্যাদির মতো "নতুন" (উদ্ধৃতিগুলি নোট করুন) বৈশিষ্ট্যগুলি সহ আকর্ষণ করছে - উদাহরণস্বরূপ বুস্ট লাইব্রেরি দেখুন। এবং আপনি মাঝে মাঝে জানতে পারেন যে কোনও কাজ সম্পাদনের দ্রুততম পদ্ধতির জন্য পয়েন্টার গাণিতিকের মতো প্রযুক্তি প্রয়োজন যা উচ্চ স্তরের ভাষায় নিষিদ্ধ - যদিও তারা সাধারণত আপনাকে এমন একটি ভাষায় লিখিত একটি গ্রন্থাগারে কল করতে দেয় যা এটি পছন্দসই হিসাবে প্রয়োগ করতে পারে ।

মূল জিনিসটি হ'ল আপনি যে ভাষাটি ব্যবহার করছেন সেটি সম্পর্কিত, এটি সম্পর্কিত এপিআই, এটি কী করতে পারে এবং এর সীমাবদ্ধতাগুলি know


5

আমিও জানি না ... আমার জাভা প্রোগ্রামগুলি সবসময় ধীর থাকে। :-) যদিও আমি সত্যিই সি # প্রোগ্রামগুলি বিশেষত ধীর গতিতে দেখিনি।


4

এখানে আরও একটি আন্তঃবিশ্বের মানদণ্ড রয়েছে, যা আপনি নিজের কম্পিউটারে নিজেকে চেষ্টা করতে পারেন।

এটি এএসএম, ভিসি ++, সি #, সিলভারলাইট, জাভা অ্যাপলেট, জাভাস্ক্রিপ্ট, ফ্ল্যাশ (এএস 3) এর সাথে তুলনা করে

রুজ প্লাগইন স্পিড ডেমো

দয়া করে নোট করুন যে ব্রাউজারটি এটি কার্যকর করছে তার উপর নির্ভর করে জাভাস্ক্রিপ্টের গতি অনেক পরিবর্তিত হয়। ফ্ল্যাশ এবং সিলভারলাইটের ক্ষেত্রেও একই সত্য কারণ এই প্লাগইনগুলি হোস্টিং ব্রাউজারের মতো একই প্রক্রিয়াতে চালিত হয়। তবে রুজ প্লাগইন স্ট্যান্ডার্ড .exe ফাইলগুলি চালায় যা তাদের নিজস্ব প্রক্রিয়াতে চালিত হয়, সুতরাং গতিটি হোস্টিং ব্রাউজার দ্বারা প্রভাবিত হয় না।


4

আপনার "" এর চেয়ে আরও ভাল পারফরম্যান্স নির্ধারণ করা উচিত "। ভাল, আমি জানি, আপনি গতি সম্পর্কে জিজ্ঞাসা করেছিলেন, তবে এটি গণনা করা সমস্ত কিছুই নয়।

  • ভার্চুয়াল মেশিনগুলি কি বেশি রানটাইম ওভারহেড সম্পাদন করে? হ্যাঁ!
  • তারা কি বেশি কাজের স্মৃতি খায়? হ্যাঁ!
  • তাদের কি আর স্টার্টআপ ব্যয় বেশি (রানটাইম ইনিশিয়ালাইজেশন এবং জেআইটি সংকলক) রয়েছে? হ্যাঁ!
  • তাদের কি একটি বিশাল গ্রন্থাগার ইনস্টল করা প্রয়োজন? হ্যাঁ!

এবং আরও, এর পক্ষপাতদুষ্ট, হ্যাঁ;)

সি # এবং জাভা দিয়ে আপনি যা পান তার জন্য একটি মূল্য প্রদান করুন (দ্রুত কোডিং, স্বয়ংক্রিয় মেমরি পরিচালনা, বড় লাইব্রেরি এবং আরও)। তবে বিশদটি সম্পর্কে আপনার অবাক হওয়ার খুব বেশি জায়গা নেই: সম্পূর্ণ প্যাকেজ নিন বা কিছুই নয়।

এমনকি যদি সেই ভাষাগুলি সংকলিত কোডের চেয়ে দ্রুত কোড কার্যকর করতে কিছু কোড অনুকূলিত করতে পারে তবে পুরো পদ্ধতির (আইএমএইচও) অকার্যকর। একটি ট্রাকের সাথে প্রতিদিন আপনার কর্মস্থলে 5 মাইল গাড়ি চালানোর কল্পনা করুন! এটি আরামদায়ক, এটি ভাল অনুভব করে, আপনি নিরাপদ (চরম ক্রম্পল জোন) এবং কিছু সময়ের জন্য গ্যাসের উপর পা রাখার পরে, এটি এমনকি একটি স্ট্যান্ডার্ড কারের মতো দ্রুত হবে! কাজের জন্য গাড়ি চালানোর জন্য আমাদের সকলের কাছে কেন ট্রাক নেই? ;)

সি ++ এ আপনি যা পান তার চেয়ে বেশি, কম নয় get

বজরেন স্ট্রাস্ট্রপকে উদ্ধৃত করে: "সি ++ হ'ল আমার প্রিয় আবর্জনা সংগ্রহ করা ভাষা কারণ এটি খুব অল্প আবর্জনা তৈরি করে" লিঙ্কের পাঠ্য


ঠিক আছে, আমি মনে করি এর অসুবিধাগুলি সম্পর্কে তার ভাল ধারণা আছে, তিনি আরও বলেছিলেন: "সি নিজেকে পায়ে গুলি করা সহজ করে; সি ++ আরও শক্ত করে তোলে, তবে আপনি যখন এটি ব্যবহার করেন তখন আপনার পুরো পাটি বন্ধ করে দেয়";)
ফ্রুনসী

"তাদের জন্য কি একটি বিশাল লাইব্রেরি ইনস্টল করা দরকার" জাভা এই সমস্যাটিকে আমি বিশ্বাস করি এমন প্রজেক্টের সাথে সম্বোধন করছে।
toc777

"সি ++ এ আপনি যা প্রদান করেন তা পাবেন, বেশি নয়, কমও নয়"। পাল্টা উদাহরণ: আমি ওসিএএমএল এবং সি ++ (জিএনইউ জিসিসি) তে একটি আরবি ট্রি বাস্তবায়ন বেঞ্চমার্ক করেছিলাম যা বিদ্যমান সেটটি পুনরায় ব্যবহার করার জন্য যদি কোনও উপাদান যুক্ত করা হচ্ছে যদি ইতিমধ্যে উপস্থিত থাকে তবে পুনরাবৃত্তি থেকে দীর্ঘ লাফ দিতে ব্যতিক্রম ব্যবহৃত হয়েছিল। ওক্যামেল সি ++ এর চেয়ে 6x পর্যন্ত বেশি দ্রুত ছিল কারণ এটি স্ট্যাকটি অযাচিত হওয়ায় এটি ধ্বংসকারীদের জন্য চেক করার জন্য অর্থ প্রদান করে না।
জেডি

3
@ জোন: তবে কিছু সময়ে (পরে?) সময়ে এটি যে কোনও উপায়ে ধ্বংস করতে হবে (কমপক্ষে এটির স্মৃতি প্রকাশ করতে হবে)। এবং এটিও নোট করুন যে ব্যতিক্রমগুলি ব্যতিক্রমী ক্ষেত্রে, কমপক্ষে সি ++ এ নিয়মের সম্মান করা উচিত। ব্যতিক্রম ঘটলে সি ++ ব্যতিক্রমগুলি ভারী হতে পারে, এটি বাণিজ্য-বন্ধ।
ফ্রুনসী

@ জন: সম্ভবত timesশেল দিয়ে আপনার মানদণ্ড পুনরাবৃত্তি করার চেষ্টা করুন। যাতে এটি পুরো প্রোগ্রামটি পরীক্ষা করে, কেবল একটি একক দিক নয়। ফলাফলগুলি কি তখন একই রকম?
ফ্রুনসী

3

জাভা বা সি # সংকলক থেকে উত্পাদিত এক্সিকিউটেবল কোডটি ব্যাখ্যা করা হয় না - এটি "ঠিক সময়ে" (জেআইটি) নেটিভ কোডে সংকলিত হয়। সুতরাং, জাভা / সি # প্রোগ্রামে প্রথমবারের কোডটি কার্যকর হওয়ার সময় দেখা যায়, "রানটাইম সংকলক" (ওরফে জেআইটি সংকলক) বাইট কোড (জাভা) বা আইএল কোড (সি #) কে মেশিনের নির্দেশাবলীতে রূপান্তরিত করে এমন কিছু ওভারহেড রয়েছে। তবে, অ্যাপ্লিকেশনটি চলমান অবস্থায় পরবর্তী সময় সেই কোডটি সম্মুখীন হওয়ার পরে, নেটিভ কোডটি তত্ক্ষণাত কার্যকর করা হবে। এটি ব্যাখ্যা করে যে কীভাবে কিছু জাভা / সি # প্রোগ্রাম প্রাথমিকভাবে ধীর গতিতে দেখা দেয়, তবে তারপরে তারা আরও দীর্ঘতর সঞ্চালন করে। একটি ভাল উদাহরণ একটি এএসপি. নেট ওয়েবসাইট N প্রথমবার ওয়েবসাইটটি অ্যাক্সেস করা হলে, সিআই কোডটি জেআইটি সংকলক দ্বারা নেটিভ কোডে সংকলিত হওয়ার কারণে কিছুটা ধীর হতে পারে।


3

আপনি যে নির্দিষ্ট প্রশ্নটি চেয়েছিলেন সে সম্পর্কে এখানে কিছু ভাল উত্তর। আমি পিছন ফিরে বড় ছবিটি দেখতে চাই।

মনে রাখবেন যে আপনি যে সফ্টওয়্যারটি লিখেছেন তার গতি সম্পর্কে আপনার ব্যবহারকারীর উপলব্ধি কোডজেনকে কতটা অনুকূল করে তুলেছে তার চেয়ে আরও অনেকগুলি কারণ দ্বারা প্রভাবিত। এখানে কিছু উদাহরন:

  • ম্যানুয়াল মেমরি পরিচালনা সঠিকভাবে করা শক্ত (কোনও ফুটো নেই), এবং কার্যকরভাবে করা আরও কঠিন (এটি সম্পন্ন করার সাথে সাথে ফ্রি মেমরি)। জিসি ব্যবহার করা সাধারণভাবে, এমন একটি প্রোগ্রাম তৈরি করার সম্ভাবনা বেশি যা মেমরির ভাল পরিচালনা করে। আপনি কি খুব শক্ত পরিশ্রম করতে ইচ্ছুক, এবং আপনার সফ্টওয়্যার সরবরাহ করতে দেরী করছেন, জিসি বাইরে করার চেষ্টায়?

  • আমার সি # আমার সি ++ এর চেয়ে বেশি পড়তে এবং বুঝতে সহজ। আমার সি # কোডটি সঠিকভাবে কাজ করছে বলে নিজেকে বোঝানোর আরও উপায় রয়েছে। তার মানে আমি বাগ প্রবর্তনের কম ঝুঁকির সাথে আমার অ্যালগরিদমগুলিকে অনুকূল করতে পারি (এবং ব্যবহারকারীরা ক্র্যাশ করে এমন সফ্টওয়্যার পছন্দ করেন না, তা দ্রুত তা করে নিলেও!)

  • আমি সি সফটওয়্যার সি ++ এর চেয়ে দ্রুত সি # তে তৈরি করতে পারি। যা পারফরম্যান্সে কাজ করার জন্য সময়কে মুক্ত করে, এবং এখনও আমার সফ্টওয়্যারকে সময়মতো বিতরণ করে।

  • সি ++ এর তুলনায় সি # তে ভাল ইউআই লেখা আরও সহজ, সুতরাং আমি যখন ইউআই প্রতিক্রিয়াশীল থাকি তখন ব্যাকগ্রাউন্ডে কাজ চালিয়ে যেতে সক্ষম হই বা প্রোগ্রামটি কিছুক্ষণের জন্য ব্লক করতে হয় তখন অগ্রগতি বা হিডবিট ইউআই সরবরাহ করতে পারে more এটি দ্রুত কোনও কিছু করে না, তবে এটি ব্যবহারকারীদের অপেক্ষায় আনন্দিত করে।

আমি সি # সম্পর্কে যা কিছু বলেছিলাম তা সম্ভবত জাভার পক্ষে সত্য, নিশ্চিতভাবে বলার অভিজ্ঞতা আমার নেই।


3

আপনি যদি জাভা / সি # প্রোগ্রামার সি ++ শিখছেন তবে আপনাকে জাভা / সি # এর শর্তে চিন্তাভাবনা করতে এবং ভার্চটিমটি সি ++ সিনট্যাক্সে অনুবাদ করতে প্ররোচিত হবেন। সেক্ষেত্রে আপনি কেবল নেটিভ কোড বনাম বর্ণিত / জেআইটির পূর্বের উল্লিখিত সুবিধাগুলি পান। সি ++ বনাম জাভা / সি # -তে সর্বাধিক পারফরম্যান্স অর্জনের জন্য, আপনাকে সি ++ এবং ডিজাইন কোডে বিশেষত সি ++ এর শক্তিগুলি ব্যবহার করার জন্য চিন্তা করতে হবে।

এডজার ডিজকস্ট্রা প্যারাফ্রেজ করতে : [আপনার প্রথম ভাষা] পুনরুদ্ধারের বাইরে মনকে বিকৃত করে। জেফ আতউডকে
প্যারাফ্রেস করতে: আপনি যে কোনও নতুন ভাষায় [আপনার প্রথম ভাষা] লিখতে পারেন।


1
আমি সন্দেহ করি যে "আপনি যে কোনও ভাষায় ফরটারান লিখতে পারেন" এই উক্তিটি জেফের কেরিয়ারকে পূর্বাভাস দেয়।
ডেভিড থর্নলি

3

সবচেয়ে গুরুত্বপূর্ণ জেআইটি অপ্টিমাইজেশানগুলির মধ্যে একটি হল মেথড ইনলাইনিং। জাভা এমনকি ভার্চুয়াল পদ্ধতিগুলিকে ইনলাইন করতে পারে যদি এটি রানটাইম যথার্থতার গ্যারান্টি দিতে পারে। এই ধরণের অপটিমাইজেশন সাধারণত স্ট্যান্ডার্ড স্ট্যাটিক সংকলক দ্বারা সম্পাদন করা যায় না কারণ এটির পুরো প্রোগ্রাম বিশ্লেষণ প্রয়োজন, যা পৃথক সংকলনের কারণে শক্ত (বিপরীতে, জেআইটি এর কাছে সমস্ত প্রোগ্রাম উপলব্ধ রয়েছে)। ইনলাইনিং পদ্ধতিটি অন্যান্য অপ্টিমাইজেশনের উন্নতি করে, অনুকূলকরণের জন্য আরও বড় কোড ব্লক দেয়।

জাভা / সি # তে স্ট্যান্ডার্ড মেমরির বরাদ্দটি আরও দ্রুত এবং ডিএলোকেশন (জিসি) খুব ধীর নয়, তবে কেবলমাত্র কম সংক্ষেপক।


মনে রাখবেন freeএবং deleteহয় নিরববাদী নয় এবং জিসিকে বরাদ্দ না দিয়ে ডিটারমিনিস্টিক তৈরি করা যেতে পারে।
জেডি

3

ভার্চুয়াল মেশিনের ভাষাগুলি সংকলিত ভাষাগুলিকে ছাড়িয়ে যাওয়ার সম্ভাবনা কম তবে তারা নীচের কারণে (কমপক্ষে) জাভাটির পক্ষে বলছি যেহেতু আমি কখনই সি # করিনি) তার জন্য এটি যথেষ্ট পরিমাণে কাছে আসতে পারে।

1 / জাভা রানটাইম এনভায়রনমেন্ট সাধারণত কোডগুলির টুকরোগুলি সনাক্ত করতে সক্ষম হয় যা ঘন ঘন চালিত হয় এবং সেই বিভাগগুলির সুনির্দিষ্ট (জেআইটি) সংকলন সম্পাদন করে যাতে ভবিষ্যতে, তারা সম্পূর্ণ সংকলিত গতিতে চালিত হয়।

জাভা লাইব্রেরির 2 / বিভক্ত অংশগুলি সংকলিত হয় যাতে আপনি যখন একটি লাইব্রেরি ফাংশন কল করেন, আপনি সংকলিত কোডটি সম্পাদন করছেন, ব্যাখ্যা করা যাবেনা। আপনি ওপেনজেডিকে ডাউনলোড করে কোডটি (সি তে) দেখতে পাবেন।

3 / আপনি যদি না প্রচুর গণনা না করেন, আপনার প্রোগ্রামটি বেশিরভাগ সময় চলছে তখন এটি খুব ধীর (তুলনামূলকভাবে কথা বলা) মানুষের কাছ থেকে ইনপুটটির জন্য অপেক্ষা করছে।

4 / যেহেতু ক্লাস লোড করার সময় জাভা বাইটকোডের প্রচুর বৈধতা সম্পন্ন হয়, তাই রানটাইম চেকগুলির স্বাভাবিক ওভারহেডটি অনেক হ্রাস হয়।

5 / সবচেয়ে খারাপ ক্ষেত্রে, পারফরম্যান্স-ইনটেনসিভ কোডটি একটি সংকলিত মডিউলে বের করা যায় এবং জাভা (জেএনআই দেখুন) থেকে কল করা যায় যাতে এটি পুরো গতিতে চলে।

সংক্ষেপে, জাভা বাইটকোড কখনই দেশীয় মেশিনের ভাষা ছাড়িয়ে যাবে না, তবে এটিকে প্রশমিত করার উপায় রয়েছে। জাভার বড় সুবিধা (যেমনটি আমি দেখতে পাচ্ছি) হুগ স্ট্যান্ডার্ড লাইব্রেরি এবং ক্রস প্ল্যাটফর্মের প্রকৃতি।


1
আইটেম 2, "জাভা লাইব্রেরির 2 / বিভক্ত অংশগুলি সংকলিত হয়েছে যাতে আপনি যখন একটি লাইব্রেরি ফাংশন কল করেন, আপনি সংকলিত কোডটি সম্পাদন করছেন, ব্যাখ্যা করা হয় না": এর জন্য আপনার কাছে কোনও প্রশংসা আছে? আপনার বর্ণনা অনুসারে যদি এটি সত্যিই হয় তবে আমি আমার ডিবাগার থেকে অনেকটা নেটিভ কোডটি চালানোর আশা করতাম, তবে আমি তা করি না।
cero

পুনরায়: সেরো ডিবাগারগুলি প্রায়শই কম দক্ষ তবে বেশি অভিব্যক্তিক পাথ ব্যবহার করে এবং তাই কোনও পারফরম্যান্স সম্পর্কিত কোনও ভাল মার্কার নয়।
গুভান্তে

2
এই এইইউজিএইচ লাইব্রেরিতে আরও একটি দুর্দান্ত পারফরম্যান্স লাভ রয়েছে - অনেক প্রোগ্রামার নিজের নিজের (সীমিত সময় এবং বিশেষ জ্ঞানের অভাব) এবং জাভাতে যা লিখবেন তার চেয়ে লাইব্রেরি কোড সম্ভবত আরও ভাল লেখা হয়েছে, বিভিন্ন কারণে প্রোগ্রামাররা প্রায়শই ব্যবহার করে লাইব্রেরি.
লিরান ওরেভি

3

ওরিওন অ্যাড্রিয়ান , আপনার মন্তব্যগুলি কী ভিত্তিহীন তা দেখতে আমাকে আপনার পোস্টটি উল্টে দিন, কারণ সি ++ সম্পর্কেও অনেক কিছু বলা যেতে পারে। এবং জাভা / সি # সংকলক খালি ফাংশনগুলি অপ্টিমাইজ করার কথা বললে সত্যিই আপনি শোনার মতো হন যা আপনি নন আমার অপ্টিমাইজেশনে বিশেষজ্ঞ , কারণ ক) সত্যিকারের প্রোগ্রামে খালি ফাংশন কেন রাখা উচিত, সত্যই খারাপ লেগ্যাসি কোড বাদে খ) যা সত্য নয় কালো এবং রক্তপাত প্রান্ত অপ্টিমাইজেশন।

এই বাক্যাংশটি ছাড়াও, আপনি পয়েন্টার সম্পর্কে স্পষ্টভাবে দৌড়েছিলেন, তবে জাভা এবং সি # তে অবজেক্টগুলি মূলত সি ++ পয়েন্টারের মতো কাজ করে না? তারা কি ওভারল্যাপ করতে পারে না? তারা কি শূন্য হতে পারে না? সি (এবং সর্বাধিক সি ++ বাস্তবায়নগুলি) সীমাবদ্ধ কীওয়ার্ড রয়েছে, উভয়েরই মান ধরণের রয়েছে, সি ++ নন-নাল গ্যারান্টি সহ রেফারেন্স-থেকে-মান রয়েছে। জাভা এবং সি # কী অফার করে?

>>>>>>>>>>

সাধারণত, সি এবং সি ++ ঠিক তত দ্রুত বা ত্বরান্বিত হতে পারে কারণ এওটি সংকলক - একটি সংকলক যা আপনার উচ্চ স্মৃতিতে বহু কোর বিল্ড সার্ভারে স্থাপনের আগে আপনার কোডটি সংকলন করে - একটি সি # সংকলিত প্রোগ্রামটি অপ্টিমাইজেশন করতে পারে এটি করতে একটি টন সময় আছে কারণ। সংকলকটি মেশিনটি ইন্টেল বা এএমডি কিনা তা নির্ধারণ করতে পারে; পেন্টিয়াম 4, কোর সলো বা কোর দ্বৈত; বা যদি এসএসই 4, ইত্যাদি সমর্থন করে এবং যদি আপনার সংকলক রানটাইম প্রেরণকে সমর্থন করে না, তবে আপনি কয়েকটি মুখ্য বিশেষজ্ঞ বাইনারি মোতায়েন করে নিজেই এটি সমাধান করতে পারেন।

এসি # প্রোগ্রামটি সাধারণত এটি চালনার উপর সংকলিত হয় যাতে এটি সমস্ত মেশিনে খুব ভালভাবে চালিত হয় তবে এটি কোনও একক কনফিগারেশনের (যেমন প্রসেসর, নির্দেশিকা সেট, অন্যান্য হার্ডওয়্যার) জন্য হতে পারে ততটা অনুকূলিত হয় না এবং এটি অবশ্যই আবশ্যক কিছু সময় ব্যয় করতে পারে প্রথম। লুপ বিদারণ, লুপ বিপরীতকরণ, স্বয়ংক্রিয় ভেক্টরাইজেশন, পুরো প্রোগ্রাম অপ্টিমাইজেশন, টেমপ্লেট সম্প্রসারণ, আইপিও এবং আরও অনেক কিছুর মতো বৈশিষ্ট্যগুলি এমনভাবে সম্পূর্ণ এবং সম্পূর্ণরূপে সমাধান করা খুব শক্ত যা শেষ ব্যবহারকারীকে বিরক্ত করে না।

অতিরিক্তভাবে কিছু ভাষা বৈশিষ্ট্যগুলি সি ++ বা সি-তে সংকলকটিকে আপনার কোড সম্পর্কে অনুমান করার অনুমতি দেয় যা এটি জাভা / সি # সংকলকটির পক্ষে নিরাপদ নয় এমন কিছু অংশকে দূরে সরিয়ে দেয়। আপনার যখন জেনেরিকের পুরো টাইপের আইডি বা গ্যারান্টিযুক্ত প্রোগ্রাম প্রবাহের অ্যাক্সেস না থাকে তখন প্রচুর পরিমাণে অপ্টিমাইজেশন থাকে যা কেবল নিরাপদ নয়।

এছাড়াও সি ++ এবং সি একবারে কেবলমাত্র একটি নিবন্ধক বর্ধিতকরণের সাথে অনেকগুলি স্ট্যাক বরাদ্দ করে, যা আবর্জনা সংগ্রহকারী এবং আপনার কোডের মধ্যে বিমূর্ততার স্তর হিসাবে জাভা এবং সি # বরাদ্দের চেয়ে অবশ্যই বেশি কার্যকর।

এখন আমি জাভাটির পক্ষে এই পরবর্তী পয়েন্টে কথা বলতে পারব না, তবে আমি জানি যে উদাহরণস্বরূপ সি ++ সংকলকগুলি পদ্ধতিগুলি এবং পদ্ধতি কলগুলি সরিয়ে ফেলবে যখন যখন এটি জানবে যে পদ্ধতির শরীরে শূন্যতা রয়েছে, এটি সাধারণ সুব্রপ্রেসনগুলি দূর করবে, এটি চেষ্টা করে আবার চেষ্টা করতে পারে সর্বোপরি নিবন্ধের ব্যবহার সন্ধান করার জন্য, এটি সীমা পরীক্ষা করা কার্যকর করে না, এটি লুপগুলি এবং অভ্যন্তরীণ লুপগুলিকে স্বীকৃতি দেবে এবং অভ্যন্তরীণ বাহ্যকে উল্টে দেবে, এটি লুপগুলির বাইরে শর্তাবলিকে সরিয়ে দেয়, এটি লুপগুলি বিভক্ত করে এবং আনস্প্লিট করে। আপনি সিটি করার সময় এটি স্ট্যান্ড :: ভেক্টরকে স্থানীয় শূন্য ওভারহেড অ্যারেগুলিতে প্রসারিত করবে। এটি আন্ত প্রক্রিয়াগত অনুকূলকরণ করবে। এটি কলার সাইটে সরাসরি রিটার্ন মানগুলি তৈরি করবে। এটি ভাবগুলি ভাঁজ করে এবং প্রচার করবে। এটি ডেটাটিকে ক্যাশে বান্ধব উপায়ে পুনরায় অর্ডার করবে। এটি জাম্প থ্রেডিং করবে। এটি আপনাকে শূন্য রানটাইম ওভারহেড সহ টাইম রে ট্রেসার সংকলন লিখতে দেয়। এটি খুব ব্যয়বহুল গ্রাফ ভিত্তিক অপ্টিমাইজেশন করবে। এটি শক্তি হ্রাস করবে, যদি এটি সিনট্যাক্টিকভাবে সম্পূর্ণ অসম কিন্তু শব্দার্থগত সমতুল্য কোড (পুরানো "জোর ফো, ফু" কেবলমাত্র সহজ, যদিও এই জাতীয় ধরণের পুরানো অপ্টিমাইজেশন) এর সাথে নির্দিষ্ট কোডগুলি প্রতিস্থাপন করে। আপনি যদি দয়া করে এটি জিজ্ঞাসা করেন তবে আপনি আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাদ দিতে পারেন এবং আরও বেশি অপ্টিমাইজেশন যেমন ভাসমান পয়েন্ট অপারেণ্ড রি-অর্ডারিং সক্ষম করতে পারেন। এটি আপনার কোডটি ম্যাসেজ এবং গণহত্যা করার পরে, এটি পুরো প্রক্রিয়াটির পুনরাবৃত্তি হতে পারে কারণ প্রায়শই কিছু নির্দিষ্টকরণ এমনকি নির্দিষ্ট অপ্টিমাইজেশনের ভিত্তি তৈরি করে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। এটি কি সিনট্যাক্টিকালি সম্পূর্ণ অসম কিন্তু শব্দার্থগত সমতুল্য কোড (পুরানো "xor foo, foo" এর সাথে পুরানো অপ্টিমাইজেশন যদিও এই জাতীয় ধরণের) এর সাথে নির্দিষ্ট কোডগুলি প্রতিস্থাপন করে। আপনি যদি দয়া করে এটি জিজ্ঞাসা করেন তবে আপনি আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাদ দিতে পারেন এবং আরও বেশি অপ্টিমাইজেশন যেমন ভাসমান পয়েন্ট অপারেণ্ড রি-অর্ডারিং সক্ষম করতে পারেন। এটি আপনার কোডটি ম্যাসেজ এবং গণহত্যা করার পরে, এটি পুরো প্রক্রিয়াটির পুনরাবৃত্তি হতে পারে কারণ প্রায়শই কিছু নির্দিষ্টকরণ এমনকি নির্দিষ্ট অপ্টিমাইজেশনের ভিত্তি তৈরি করে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। এটি কি সিনট্যাক্টিকালি সম্পূর্ণ অসম কিন্তু শব্দার্থগত সমতুল্য কোড (পুরানো "xor foo, foo" এর সাথে পুরানো অপ্টিমাইজেশন যদিও এই জাতীয় ধরণের) এর সাথে নির্দিষ্ট কোডগুলি প্রতিস্থাপন করে। আপনি যদি দয়া করে এটি জিজ্ঞাসা করেন তবে আপনি আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাদ দিতে পারেন এবং আরও বেশি অপ্টিমাইজেশন যেমন ভাসমান পয়েন্ট অপারেণ্ড রি-অর্ডারিং সক্ষম করতে পারেন। এটি আপনার কোডটি ম্যাসেজ এবং গণহত্যা করার পরে, এটি পুরো প্রক্রিয়াটির পুনরাবৃত্তি হতে পারে কারণ প্রায়শই কিছু নির্দিষ্টকরণ এমনকি নির্দিষ্ট অপ্টিমাইজেশনের ভিত্তি তৈরি করে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। আপনি যদি দয়া করে এটি জিজ্ঞাসা করেন তবে আপনি আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাদ দিতে পারেন এবং আরও বেশি অপ্টিমাইজেশন যেমন ভাসমান পয়েন্ট অপারেণ্ড রি-অর্ডারিং সক্ষম করতে পারেন। এটি আপনার কোডটি ম্যাসেজ এবং গণহত্যা করার পরে, এটি পুরো প্রক্রিয়াটির পুনরাবৃত্তি হতে পারে কারণ প্রায়শই কিছু নির্দিষ্টকরণ এমনকি নির্দিষ্ট অপ্টিমাইজেশনের ভিত্তি তৈরি করে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। আপনি যদি দয়া করে এটি জিজ্ঞাসা করেন তবে আপনি আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাদ দিতে পারেন এবং আরও বেশি অপ্টিমাইজেশন যেমন ভাসমান পয়েন্ট অপারেণ্ড রি-অর্ডারিং সক্ষম করতে পারেন। এটি আপনার কোডটি ম্যাসেজ এবং গণহত্যা করার পরে, এটি পুরো প্রক্রিয়াটির পুনরাবৃত্তি হতে পারে কারণ প্রায়শই কিছু নির্দিষ্টকরণ এমনকি নির্দিষ্ট অপ্টিমাইজেশনের ভিত্তি তৈরি করে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে। এটি কেবল বদলে যাওয়া পরামিতিগুলি নিয়ে আবার চেষ্টা করতে পারে এবং তার অভ্যন্তরীণ র‌্যাঙ্কিংয়ে অন্যান্য রূপগুলি কীভাবে স্কোর করে তা দেখতে পারে। এবং এটি আপনার কোড জুড়ে এই জাতীয় যুক্তি ব্যবহার করবে।

সুতরাং আপনি দেখতে পাচ্ছেন যে কয়েকটি নির্দিষ্ট সি ++ বা সি বাস্তবায়ন দ্রুত হবে কেন এমন অনেকগুলি কারণ রয়েছে।

এখন এটি সমস্তই বলেছে যে, সি ++ তে অনেকগুলি অপ্টিমাইজেশান তৈরি করা যেতে পারে যা আপনি সি # এর সাথে যা কিছু করতে পারেন তা দূরে সরিয়ে দেবে, বিশেষত সংখ্যার ক্রাঞ্চিং, রিয়েলটাইম এবং ক্লোজ-টু-মেটাল রাজ্যে, তবে কেবল সেখানে নয়। অনেক দূর যেতে আপনাকে একটি পয়েন্টারও স্পর্শ করতে হবে না।

সুতরাং আপনি যা লিখছেন তার উপর নির্ভর করে আমি একটি বা অন্যটির সাথে যাব। তবে আপনি যদি এমন কোনও কিছু লিখছেন যা হার্ডওয়্যার নির্ভর নয় (ড্রাইভার, ভিডিও গেম, ইত্যাদি), আমি সি # (আবার জাভা সম্পর্কে বলতে পারি না) এর পারফরম্যান্স নিয়ে চিন্তিত হব না। এটা ঠিক আছে।

<<<<<<<<<<

সাধারণত, কিছু সাধারণীকরণ যুক্তি নির্দিষ্ট পোস্টগুলিতে শীতল লাগতে পারে তবে সাধারণত বিশ্বাসযোগ্য মনে হয় না।

যাইহোক, শান্তি প্রতিষ্ঠার জন্য: এওটি দুর্দান্ত, জেআইটি- তেও দুর্দান্ত । একমাত্র সঠিক উত্তর হতে পারে: এটি নির্ভর করে। এবং প্রকৃত স্মার্ট ব্যক্তিরা জানেন যে আপনি যে কোনওভাবে উভয় বিশ্বের সেরা ব্যবহার করতে পারেন।


2

এটি কেবল তখন ঘটবে যখন জাভা ইন্টারপ্রেটার মেশিন কোড তৈরি করছে যা আপনার সংকলক আপনি যে সি ++ কোডটি লিখছেন তার জন্য যে মেশিন কোডটি জেনারেট করছে তার চেয়ে আরও ভালভাবে অনুকূলিত হয়েছে, যেখানে জাভা এবং ব্যাখ্যা ব্যয়ের চেয়ে সি ++ কোড ধীর গতিতে রয়েছে।

তবে জাভাটির খুব ভাল লেখা গ্রন্থাগার না থাকলে এবং আপনার নিজের লেখা খারাপ সি -+ লাইব্রেরি না থাকলে প্রকৃতপক্ষে ঘটে যাওয়া প্রতিক্রিয়াগুলি বেশ কম।


আমি আরও বিশ্বাস করি যে একটি নির্দিষ্ট ভাষার ওজনও রয়েছে, যখন নিম্ন স্তরে কাজ করার সময় কম বিমূর্ততা নিয়ে আপনি দ্রুততর একটি প্রোগ্রাম বিকাশ করবেন। এটি নিজেই বাইটকোড কার্যকরকরণ সম্পর্কিত বিষয়গুলি সম্পর্কিত নয়।
ব্রায়ান আর বন্ডি

2

আসলে, জাভা যেমন ভার্চুয়াল মেশিনে সি # সত্যিই চালায় না। আইএল সংসদীয় ভাষায় সংকলিত হয়, যা পুরোপুরি স্থানীয় কোড এবং স্থানীয় কোড হিসাবে একই গতিতে চলে। আপনি একটি নেট অ্যাপ্লিকেশন প্রাক জেআইটি করতে পারেন যা পুরোপুরি জেআইটি খরচ সরিয়ে দেয় এবং তারপরে আপনি সম্পূর্ণ নেটিভ কোডটি চালাচ্ছেন।

.NET এর সাথে ধীরগতি আসবে না কারণ .NET কোডটি ধীর, তবে আবর্জনা সংগ্রহ, রেফারেন্সগুলি পরীক্ষা করা, সম্পূর্ণ স্ট্যাক ফ্রেম সংরক্ষণ করা ইত্যাদির মতো জিনিসগুলি করার জন্য এটি পর্দার পিছনে আরও অনেক কিছুই করে যখন এটি বেশ শক্তিশালী এবং সহায়ক হতে পারে বিল্ডিং অ্যাপ্লিকেশন, কিন্তু একটি ব্যয় আসে। মনে রাখবেন যে আপনি এই সমস্ত কিছু সি ++ প্রোগ্রামেও করতে পারেন (মূল অংশের অনেক। নেট কার্যকারিতা আসলে। নেট কোড যা আপনি রটারে দেখতে পারেন)। যাইহোক, আপনি যদি একই কার্যকারিতাটি লেখেন তবে আপনি সম্ভবত অনেক ধীর প্রোগ্রামে শেষ হবেন যেহেতু .NET রানটাইমটি অনুকূলিত হয়েছে এবং সূক্ষ্মভাবে সুর করা হয়েছে।

এটি বলেছিল, পরিচালিত কোডের অন্যতম শক্তি হ'ল এটি সম্পূর্ণরূপে যাচাইযোগ্য হতে পারে, অর্থাত্। আপনি যাচাই করতে পারেন যে কোডটি কখনও কখনও অন্য প্রক্রিয়ার মেমোরিতে অ্যাক্সেস করতে পারে না বা এটি চালানোর আগে অযৌক্তিক কিছু করে না। মাইক্রোসফ্টের পুরোপুরি পরিচালিত অপারেটিং সিস্টেমের একটি গবেষণা প্রোটোটাইপ রয়েছে যা আশ্চর্যরূপে দেখিয়েছে যে 100% পরিচালিত পরিবেশটি এখন যাচাই করা প্রোগ্রামগুলির দ্বারা সুরক্ষিত বৈশিষ্ট্যগুলির আর প্রয়োজন নেই, যা যাচাইকরণের সুযোগটি ব্যবহার করে এই যাচাইয়ের সুবিধা গ্রহণ করে কোনও আধুনিক অপারেটিং সিস্টেমের তুলনায় আসলেই দ্রুততর পারফর্ম করতে পারে (আমরা কিছু ক্ষেত্রে 10x এর মতো কথা বলছি)। এই প্রকল্পের বিষয়ে কথা বলার জন্য এসই রেডিওর একটি দুর্দান্ত পর্ব রয়েছে।


1

কিছু ক্ষেত্রে, পরিচালিত কোড প্রকৃতপক্ষে দেশীয় কোডের চেয়ে দ্রুত হতে পারে । উদাহরণস্বরূপ, "চিহ্ন-এবং-ঝাড়ু" আবর্জনা সংগ্রহের অ্যালগরিদমগুলি জেআরই বা সিএলআরের মতো পরিবেশগুলিকে একক পাসে প্রচুর সংখ্যক স্বল্প-স্থায়ী (সাধারণত) অবজেক্টগুলি মুক্ত করার অনুমতি দেয়, যেখানে বেশিরভাগ সি / সি ++ হিপ অবজেক্টগুলি একত্রে মুক্ত হয়- একটি সময়.

উইকিপিডিয়া থেকে :

অনেক ব্যবহারিক উদ্দেশ্যে, আবর্জনা সংগ্রহের ভাষাগুলিতে প্রয়োগকৃত বরাদ্দ / অবলম্বন-নিবিড় অ্যালগরিদমগুলি ম্যানুয়াল হিপ বরাদ্দ ব্যবহার করে তাদের সমতুল্যদের চেয়ে দ্রুততর হতে পারে। এর প্রধান কারণ হ'ল আবর্জনা সংগ্রহকারী রানটাইম সিস্টেমকে একটি সম্ভাব্য সুবিধাজনক ফ্যাশনে বরাদ্দ এবং ডিওলোকেশন অপারেশনকে এমোর্টাইজ করতে দেয়।

এটি বলেছিল, আমি প্রচুর সি # এবং প্রচুর সি ++ লিখেছি এবং আমি প্রচুর মানদণ্ড চালিয়েছি। আমার অভিজ্ঞতা হিসাবে, সি ++ সি # এর চেয়ে অনেক গতিযুক্ত, দুটি উপায়ে: (1) আপনি যদি সি # তে লিখেছেন এমন কিছু কোড নেন তবে সেটি সি ++ এ পোর্ট করুন, নেটিভ কোডটি দ্রুত হতে থাকে । কত দ্রুত? ঠিক আছে, এটি পুরোপুরি পরিবর্তিত হয় তবে 100% গতির উন্নতি হওয়া অস্বাভাবিক নয়। (২) কিছু ক্ষেত্রে, আবর্জনা সংগ্রহ ব্যাপকভাবে একটি পরিচালিত অ্যাপ্লিকেশনকে ধীর করতে পারে। .NET সিএলআর বড় আকারের apগল (বলে,> 2 জিবি) দিয়ে একটি ভয়ঙ্কর কাজ করে এবং জিসিতে অনেক সময় ব্যয় করতে পারে - এমনকি এমন অ্যাপ্লিকেশনগুলিতেও যেগুলি মধ্যবর্তী জীবনকাল অবধি কম - বা এমনকি না - রয়েছে in

অবশ্যই, বেশিরভাগ ক্ষেত্রে আমি মুখোমুখি হয়েছি, পরিচালিত ভাষাগুলি দীর্ঘ শট দ্বারা যথেষ্ট দ্রুত এবং সি ++ এর অতিরিক্ত পারফরম্যান্সের জন্য রক্ষণাবেক্ষণ এবং কোডিং ট্রেড অফ খুব সহজ নয়।


1
সমস্যাটি হ'ল দীর্ঘকাল চলমান প্রক্রিয়াগুলির জন্য, যেমন একটি ওয়েব সার্ভার, সময়ের সাথে সাথে আপনার স্মৃতিশক্তি এতটাই খণ্ডিত হয়ে উঠবে (একটি সি ++ লিখিত প্রোগ্রামে) যা আপনাকে আবর্জনা সংগ্রহের সাদৃশ্যযুক্ত এমন কিছু প্রয়োগ করতে হবে (বা প্রায়শই পুনঃসূচনা করুন, আইআইএস দেখুন) )।
টনি বেনব্রাহিম

3
আমি লক্ষ্য করি নি যে বড় ইউনিক্স প্রোগ্রামগুলিতে চিরকালের জন্য চালানো হয়। এগুলি সি-তে লিখিত হতে থাকে যা মেমরি পরিচালনার জন্য সি ++ এর চেয়েও খারাপ।
ডেভিড থর্নলি

অবশ্যই, প্রশ্নটি হ'ল আমরা কীভাবে কোনও প্রোগ্রাম পরিচালিত বনাম নিয়ন্ত্রণহীন কোড, বা ভাষার তাত্ত্বিক শীর্ষের পারফরম্যান্সের সাথে তুলনা করছি। স্পষ্টতই, নিয়ন্ত্রণহীন কোডটি সর্বদা ব্যবস্থাপনার মতো কমপক্ষে দ্রুত হতে পারে , আপনি যেমন একটি পরিচালনা ব্যবস্থা হিসাবে ঠিক একই কাজটি করেছিলেন ঠিক তেমন একটি পরিচালনা না করা প্রোগ্রামও লিখতে পারেন! তবে বেশিরভাগ পারফরম্যান্স ইস্যুগুলি অ্যালগরিদমিক, মাইক্রো নয়। এছাড়াও, আপনি একইভাবে পরিচালিত এবং নিয়ন্ত্রণহীন কোডটি অপ্টিমাইজ করবেন না, সুতরাং "সি #+ এ সি #+" সাধারণত ভাল কাজ করে না।
ক্যার্যু

2
সি / সি ++ এ আপনি স্ট্যাকের উপর স্বল্প জীবিত বস্তু বরাদ্দ করতে পারেন এবং এটি উপযুক্ত হলে আপনি করেন। পরিচালিত কোডে আপনি পারবেন না , আপনার কোনও বিকল্প নেই। এছাড়াও, সি / সি ++ আপনি করতে পারেন contigous এলাকায় বস্তুর তালিকা বরাদ্দ (নতুন ফু [100]), পরিচালিত কোড তুমি পারবে না হবে। সুতরাং, আপনার তুলনাটি বৈধ নয়। ঠিক আছে, এই পছন্দগুলির শক্তি বিকাশকারীদের উপর একটি বোঝা রাখে, তবে এইভাবে তারা যে পৃথিবীতে বাস করে তা জানতে শিখবে (স্মৃতি ......)।
ফ্রুনসি

@ ফ্রুনসী: "সি / সি ++ তে আপনি সামঞ্জস্যপূর্ণ অঞ্চলে (নতুন ফু [100]) অবজেক্টের তালিকাতে বরাদ্দ করতে পারবেন, পরিচালিত কোডে" আপনি পারবেন না। এটা ভুল। স্থানীয় মান ধরণের স্ট্যাক বরাদ্দ করা হয় এবং আপনি সেগুলিতে সি # তে বরাদ্দ অ্যারে স্ট্যাকও করতে পারেন। এমনকি সি # তে লিখিত উত্পাদন ব্যবস্থা রয়েছে যা স্থির অবস্থায় সম্পূর্ণ বরাদ্দহীন।
জেডি


1

আসলে সান হটস্পট জেভিএম "মিশ্র-মোড" এক্সিকিউশন ব্যবহার করে। এটি পদ্ধতিটির বাইটকোডকে ব্যাখ্যা করে যতক্ষণ না এটি নির্ধারণ করে (সাধারণত কোনও ধরণের কাউন্টারের মাধ্যমে) যে কোডের একটি নির্দিষ্ট ব্লক (পদ্ধতি, লুপ, ট্রাই-ক্যাচ ব্লক ইত্যাদি) প্রচুর পরিমাণে কার্যকর হতে চলেছে, তারপরে এটি জাইটি সংকলন করে। জেআইটি কোনও পদ্ধতি সংকলনের জন্য প্রয়োজনীয় সময়টি প্রায়শই বেশি সময় নেয় যদি পদ্ধতিটি খুব কম রান করার পদ্ধতিটি ব্যাখ্যা করা হয়। পারফরম্যান্স সাধারণত "মিশ্র-মোড" এর জন্য বেশি কারণ জেভিএম জেটিটিং কোডটি নষ্ট করে না যা খুব কমই হয়, যদি কখনও চালিত হয়। সি # এবং .NET এটি করবেন না। .NET জেআইটি এমন সমস্ত কিছু যা প্রায়শই সময় নষ্ট করে।


1

এইচপি ল্যাবগুলি সম্পর্কে পড়ুন ডায়নামো , PA-8000 এর জন্য অনুবাদক, যা PA-8000- এ চলে এবং প্রায়শই তারা স্থানীয়ভাবে কর্মসূচীর চেয়ে দ্রুত প্রোগ্রাম চালায়। তাহলে মোটেও অবাক লাগবে না!

এটিকে "মধ্যবর্তী পদক্ষেপ" হিসাবে ভাববেন না - কোনও প্রোগ্রাম চালানোতে ইতিমধ্যে, কোনও ভাষায় প্রচুর অন্যান্য পদক্ষেপ জড়িত।

এটি প্রায়শই নেমে আসে:

  • প্রোগ্রামগুলিতে হট স্পট রয়েছে, সুতরাং আপনি যে 95% বডি কোড চালাবেন তা ধীরে ধীরে চলতে থাকলেও আপনি যদি গরম 5% তে দ্রুত হন তবে আপনি পারফরম্যান্স-প্রতিযোগিতামূলক হতে পারেন

  • এইচএলএল সি / সি ++ এর মতো এলএলএল থেকে আপনার অভিপ্রায় সম্পর্কে আরও জানে এবং আরও অনুকূলিত কোড তৈরি করতে পারে (ওসিএএমএল আরও বেশি রয়েছে, এবং অনুশীলনে প্রায়শই আরও দ্রুত হয়)

  • একটি জেআইটি সংকলকটিতে প্রচুর তথ্য থাকে যা কোনও স্ট্যাটিক সংকলক করে না (যেমন, আপনার কাছে আসল তথ্যটি এই সময়টি ঘটে)

  • কোনও জেআইটি সংকলক রান-টাইমে অপ্টিমাইজেশন করতে পারে যে traditionalতিহ্যবাহী লিঙ্কারগুলিকে আসলেই অনুমতি দেওয়া হয় না (যেমন শাখা পুনরায় অর্ডার করার মতো সাধারণ ক্ষেত্রে সমতল হয়, বা লাইব্রেরি কলগুলি অন্তর্ভুক্ত করা হয়)

সব মিলিয়ে, সি / সি ++ পারফরম্যান্সের জন্য বেশ লম্পট ভাষাগুলি: আপনার ডেটা ধরণের সম্পর্কে তুলনামূলকভাবে খুব কম তথ্য আছে, আপনার ডেটা সম্পর্কে কোনও তথ্য নেই এবং রান-টাইম অপ্টিমাইজেশনের পথে বেশি কিছু দেওয়ার জন্য কোনও গতিশীল রানটাইম নেই।


1

আপনি যখন জাভা বা সিএলআর সি ++ এর চেয়ে দ্রুততর হতে পারেন তখন আপনি সংক্ষিপ্ত বিস্ফোরণ পেতে পারেন তবে সামগ্রিকভাবে কর্মক্ষমতা অ্যাপ্লিকেশনটির জীবনযাত্রার জন্য আরও খারাপ: এর জন্য কিছু ফলাফলের জন্য www.codeproject.com/KB/dotnet/RuntimePerformance.aspx দেখুন।



1

আমার বোধগম্যতা হল যে সি / সি ++ নির্দিষ্ট মেশিন আর্কিটেকচারে চালানোর জন্য দেশীয় কোড তৈরি করে। বিপরীতভাবে, জাভা এবং সি # এর মতো ভাষাগুলি ভার্চুয়াল মেশিনের উপরে চলে যা দেশীয় আর্কিটেকচারকে সরিয়ে দেয়। যৌক্তিকভাবে জাভা বা সি # এর পক্ষে এই মধ্যবর্তী পদক্ষেপের কারণে সি ++ এর গতির সাথে মিল পাওয়া অসম্ভব বলে মনে হচ্ছে, তবে আমাকে বলা হয়েছে যে সর্বশেষতম সংকলক ("হট স্পট") এই গতি অর্জন করতে পারে বা এটিও অতিক্রম করতে পারে।

তা অযৌক্তিক। মধ্যবর্তী প্রতিনিধির ব্যবহার অন্তর্নিহিতভাবে কর্মক্ষমতা হ্রাস করে না। উদাহরণস্বরূপ, এলএলভিএম-জিসিসি সিএল এবং সি ++ এলএলভিএম আইআর (যা ভার্চুয়াল অসীম-নিবন্ধকার মেশিন) এর মাধ্যমে স্থানীয় কোডে সংকলন করে এবং এটি দুর্দান্ত পারফরম্যান্স অর্জন করে (প্রায়শই জিসিসিকে বীট করে)।

সম্ভবত এটি কোনও ভাষার প্রশ্নের চেয়ে সংকলক প্রশ্ন বেশি, তবে যে কোনও ভার্চুয়াল মেশিন ভাষার একটি স্থানীয় ভাষার চেয়ে আরও ভাল সম্পাদন করা কীভাবে সম্ভব তা সরল ইংরেজিতে ব্যাখ্যা করতে পারেন?

এখানে কিছু উদাহরন:

  • জেআইটি সংকলন সহ ভার্চুয়াল মেশিনগুলি রান-টাইম কোড জেনারেশন (যেমন System.Reflection.Emit। নেট) উপরের সুবিধা দেয় যাতে আপনি সি # এবং এফ # এর মতো ভাষায় অন-ফ্লাইয়ে উত্পন্ন কোডটি সংকলন করতে পারেন তবে সি বা সি ++ তে তুলনামূলক ধীর দোভাষী লিখতে হবে। উদাহরণস্বরূপ, নিয়মিত অভিব্যক্তি প্রয়োগ করা।

  • ভার্চুয়াল মেশিনের অংশগুলি (যেমন লেখার বাধা এবং বরাদ্দকারী) প্রায়শই হাত-কোডেড এসেইম্বেবলারে লেখা হয় কারণ সি এবং সি ++ দ্রুত পর্যাপ্ত কোড উত্পন্ন করে না। যদি কোনও প্রোগ্রাম কোনও সিস্টেমের এই অংশগুলিকে জোর দেয় তবে এটি সি বা সি ++ তে লেখা যায় এমন কোনও কিছুকে ছাপিয়ে দেখতে পারে।

  • নেটিভ কোডের ডায়নামিক লিঙ্কিংয়ের জন্য একটি এবিআইয়ের সাথে সংগততা প্রয়োজন যা কার্য সম্পাদনকে বাধাগ্রস্ত করতে পারে এবং পুরো প্রোগ্রামের অপ্টিমাইজেশনকে বাধা দেয় যেখানে লিঙ্কিং সাধারণত ভিএমগুলিতে স্থগিত থাকে এবং পুরো প্রোগ্রাম অপ্টিমাইজেশন (যেমন। নেট এর রিফাইড জেনেরিকস) থেকে উপকৃত হতে পারে।

আমি উপরের পেরেসবালের উচ্চ-উত্তরের উত্তরের সাথে কিছু সমস্যা সমাধান করতে চাই (কারণ কেউ তার উত্তরে আমার মন্তব্য মুছতে থাকে) যা একটি পাল্টা-উত্পাদনশীলভাবে মেরুকৃত দৃষ্টিভঙ্গি উপস্থাপন করে:

সংকলনের সময় কোড প্রসেসিং করা হবে ...

অতএব টেমপ্লেট মেটাগ্রোগ্র্যামিং কেবল তখনই কাজ করে যদি প্রোগ্রামটি সংকলন সময়ে পাওয়া যায় যা প্রায়শই হয় না, যেমন ভ্যানিলা সি ++ তে প্রতিযোগিতামূলকভাবে পারফরম্যান্ট নিয়মিত এক্সপ্রেশন লাইব্রেরি লেখা অসম্ভব কারণ এটি রান-টাইম কোড উত্পন্নকরণের অক্ষম (একটি গুরুত্বপূর্ণ দিক) metaprogramming)।

... প্রকারের সাথে খেলানো সংকলন সময়ে করা হয় ... জাভা বা সি # এর সমতুল্য লেখার পক্ষে বেদনাদায়ক, এবং টাইপগুলি সংকলনের সময় জানা থাকলেও সর্বদা ধীর এবং সমাধানের সময়ে সমাধান হবে।

সি # তে, এটি কেবলমাত্র রেফারেন্স ধরণের ক্ষেত্রেই সত্য এবং মান ধরণের ক্ষেত্রেও এটি সত্য নয়।

জেআইটি অপ্টিমাইজেশনের বিষয়টি বিবেচনাধীন, মেমোরিতে সরাসরি পয়েন্টার অ্যাক্সেস হিসাবে দ্রুতগতিতে কিছুই চলবে না ... আপনার যদি স্মৃতিতে সংলগ্ন ডেটা থাকে, সি ++ পয়েন্টারগুলির মাধ্যমে এটি অ্যাক্সেস করা (যেমন সি পয়েন্টার ... আসুন সিজারকে এর যথাযথ উপহার দিন) কয়েকগুণ দ্রুত যাবে জাভা / সি # এর চেয়ে বেশি।

লোকেরা সাইমার্ক 2 বেঞ্চমার্ক থেকে এসওআর পরীক্ষায় জাভা মারতে সি ++ পর্যবেক্ষণ করেছে কারণ পয়েন্টাররা এলিয়াসিং-সম্পর্কিত অপ্টিমাইজেশনে বাধা দেয়।

এছাড়াও লক্ষ করার মতো বিষয় যে .NET সংযোগের পরে ডায়নামিকভাবে-সংযুক্ত লাইব্রেরি জুড়ে জেনেরিকের বিশেষায়িতকরণ করে যখন C ++ করতে পারে না কারণ সংযোগের আগে টেমপ্লেটগুলি সমাধান করা উচিত। এবং স্পষ্টতই টেমপ্লেটগুলির চেয়ে বেশি বড় জেনারিকের সুবিধাগুলি হ'ল বোধগম্য ত্রুটি বার্তা।


0

আমার বোধগম্যতা থেকে আরও কিছু যা বলেছে তার শীর্ষে। নেট এবং জাভা মেমরি বরাদ্দে আরও ভাল are যেমন তারা মেমরিটি সংহত করতে পারে কারণ এটি খণ্ডিত হওয়ার সাথে সাথে সি ++ না পারে (স্থানীয়ভাবে, তবে এটি যদি আপনি কোনও চৌকস আবর্জনা সংগ্রহকারী ব্যবহার করছেন)।


অথবা আপনি যদি আরও ভাল সি ++ বরাদ্দকারী এবং / অথবা অবজেক্টের পুল ব্যবহার করছেন। এটি ম্যাজিক থেকে অনেক দূরে, সি ++ ভিউ পয়েন্ট থেকে, এবং এটি "গাদা বরাদ্দ" দ্রুত স্ট্যাক বরাদ্দ হওয়ার জন্য ফুটতে পারে bo
পারাসেবল

আপনি যদি সর্বদা গাদা সমস্ত কিছু বরাদ্দ করতে চান, তবে। নেট এবং জাভা এমনকি সি / সি ++ এর চেয়ে আরও ভাল পারফরম্যান্স করতে পারে। তবে আপনি কেবল সি / সি ++ এ এটি করবেন না।
ফ্রুনসি

0

প্রচুর গতির প্রয়োজনের জন্য, জেভিএম কেবল একটি সি ++ বাস্তবায়ন কল করে, তাই বেশিরভাগ ওএস সম্পর্কিত জিনিসের জন্য জেভিএম কতটা ভাল তার চেয়ে তাদের লিবস কতটা ভাল তা আরও প্রশ্ন। আবর্জনা সংগ্রহ আপনার স্মৃতিশক্তি অর্ধেক কেটে দেয় তবে কিছু ফ্যানসিয়ার এসটিএল এবং বুস্ট বৈশিষ্ট্যগুলি ব্যবহার করলে একই প্রভাব থাকবে তবে বাগ সম্ভাবনার বহুগুণ রয়েছে।

আপনি যদি অনেক ক্লাস সহ একটি বড় প্রকল্পে কেবল সি ++ গ্রন্থাগার এবং এর উচ্চ স্তরের বৈশিষ্ট্যগুলি ব্যবহার করে থাকেন তবে আপনি সম্ভবত কোনও জেভিএম ব্যবহারের চেয়ে ধীর গতিতে চলবেন। আরও অনেক ত্রুটিযুক্ত প্রবণতা বাদে।

তবে, সি ++ এর সুবিধাটি হ'ল এটি আপনাকে নিজেরাই অনুকূলিতকরণ করতে দেয়, অন্যথায় আপনি সংকলক / জেভিএম যা করেন তার সাথে আটকে আছেন। আপনি যদি নিজের কন্টেনারগুলি তৈরি করেন তবে আপনার নিজের মেমরি পরিচালনাটি প্রান্তিক করা আছে, সিমডি ব্যবহার করুন এবং এখানে এবং সেখানে সমাবেশে সরে যান, সর্বাধিক সি ++ সংকলকরা নিজেরাই যা করবেন তার চেয়ে কমপক্ষে 2x-4x বার গতি বাড়িয়ে দিতে পারেন। কিছু ক্রিয়াকলাপের জন্য, 16x-32x। এটি একই অ্যালগরিদম ব্যবহার করছে, আপনি যদি আরও ভাল অ্যালগরিদম ব্যবহার করেন এবং সমান্তরাল হন, বৃদ্ধি নাটকীয় হতে পারে, কখনও কখনও হাজার হাজার গতিবেগ যা সাধারণত ব্যবহৃত পদ্ধতিগুলি।


0

আমি এটি কয়েক ভিন্ন পয়েন্ট থেকে তাকান।

  1. অসীম সময় এবং সংস্থান দেওয়া, পরিচালিত বা পরিচালনা না করা কোডটি আরও দ্রুত হবে? স্পষ্টতই, উত্তরটি হল যে নিয়ন্ত্রণহীন কোডটি সর্বদা কমপক্ষে এই দিকটিতে পরিচালিত কোডটি টাই করতে পারে - সবচেয়ে খারাপ ক্ষেত্রে যেমন আপনি পরিচালনা কোড সমাধানটি কেবল হার্ড-কোড করতে চান।
  2. আপনি যদি কোনও ভাষায় কোনও প্রোগ্রাম নেন, এবং সরাসরি অন্য ভাষায় অনুবাদ করেন তবে এটি কতটা খারাপ কাজ করবে? যে কোনও দুটি ভাষার জন্য সম্ভবত প্রচুর । বেশিরভাগ ভাষায় বিভিন্ন অপ্টিমাইজেশনের প্রয়োজন হয় এবং এর বিভিন্ন গ্যাটা রয়েছে। মাইক্রো-পারফরম্যান্স প্রায়শই এই বিবরণগুলি জানার বিষয়ে অনেক কিছু।
  3. সীমাবদ্ধ সময় এবং সংস্থান দেওয়া, দুটি ভাষার মধ্যে কোনটি আরও ভাল ফলাফল করবে? এটি সবচেয়ে আকর্ষণীয় প্রশ্ন, যখন কোনও পরিচালিত ভাষা কিছুটা ধীর কোড তৈরি করতে পারে (সেই ভাষাটির জন্য যুক্তিযুক্তভাবে লেখা একটি প্রোগ্রাম দেওয়া হয়), সংস্করণটি খুব শীঘ্রই সম্পন্ন হবে, অপ্টিমাইজেশনে আরও সময় ব্যয় করার অনুমতি দেয়।

0

একটি সংক্ষিপ্ত উত্তর: একটি নির্দিষ্ট বাজেট দেওয়া আপনি C ++ অ্যাপ্লিকেশন (আরওআই বিবেচনা) এর চেয়ে আরও ভাল পারফরম্যান্স করে জাভা অ্যাপ্লিকেশন অর্জন করতে পারবেন এছাড়াও জাভা প্ল্যাটফর্মের আরও শালীন প্রোফাইলার রয়েছে, এটি আপনাকে আপনার হটস্পটগুলি আরও দ্রুত চিহ্নিত করতে সহায়তা করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.