পারফরম্যান্সে সি লিখছেন? [বন্ধ]


32

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

আমি ওপেনজিএলে রেন্ডার করার জন্য কিছু কোড সহ একটি লাইব্রেরি লেখার পরিকল্পনা করছিলাম যাতে আমি এটি পুনরায় ব্যবহার করতে পারি। গ্রাফিক্সের ক্ষেত্রে যখন কোনও পারফরম্যান্স বৃদ্ধি হয় সেহেতু আমি সি তে গ্রন্থাগারটি লেখার পরিকল্পনা করছিলাম planning

তবে সত্যিই কি এর মূল্য হবে? লাইব্রেরি ব্যবহার করে কোড সম্ভবত সি ++ এ লেখা হবে এবং আমি সি ++ তে সাধারণত কোডটি পছন্দ করি।

তবে এটি যদি পারফরম্যান্সে এমনকি সামান্য পার্থক্য তৈরি করে, আমি সম্ভবত সি দিয়ে যাব go

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

আমি চারপাশে দেখেছি এবং আমি কিছু মাপদণ্ড এবং এরকম পেয়েছি, তবে আমি যা কিছু দেখেছি তা এমএসভিসি এবং ক্ল্যাংয়ের চেয়ে জিসিসির সাথে কাজ করেছে। এছাড়াও, মানদণ্ডগুলি ব্যবহৃত ভাষার মানগুলির উল্লেখ করে না। কারো কি কোন চিন্তা আছে এ ব্যাপারে?

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


9
সর্বাধিক নতুন এমএসভিসি সমর্থনটি আসলে সি 89।
অবশেষে

4
@ তাত্ক্ষণিকভাবে ভিজ্যুয়াল স্টুডিও 2013-এ, C99 বৈশিষ্ট্যগুলির সিংহভাগ সমর্থনযোগ্য । এটি সম্পূর্ণ সমর্থন নয়, তবে আমি অনুশীলনে দিতাম এটি C99 লেখার জন্য এটি ব্যবহার করা ঠিক।
কংগ্রেসবঙ্গাস

4
@ danielu13 - আপনি ঠিক কোথায় শুনেছেন যে সি ++ এর চেয়ে সিটির পারফরম্যান্স সুবিধা রয়েছে?
রামহাউন্ড

1
@ সেবাস্তিয়ান-লরেনেইইউপ্লিসিয়ুক আমি মনে করি না যে এই লিঙ্কগুলি আসলে সহায়ক। প্রথমটি প্রায় একই প্রশ্নে প্রোগ্রামারগুলির সাথে ভালভাবে মোকাবিলা করা যেতে পারে ststackexchange.com/q/113295/76444 তবে আপনার লিঙ্কে সিটির পরিবর্তে সি ++ এর পক্ষে। আপনার ২ য় লিঙ্কের জন্য, এটি লিনাস টর্ভাল্ডসের একটি খালি। আমি আশা করি প্রত্যেকে এখনই বুঝতে পেরেছেন যে তিনি সত্যই সি ++ কে ঘৃণা করতে পছন্দ করেন এবং একটি লাঠি দিয়ে স্পর্শ করবেন না তবে সি ++ সম্পর্কে তার সঞ্চারগুলি কঠোরভাবে উদ্দেশ্যমূলক নয়, তারা ব্যক্তিগত মতামত এবং পক্ষপাতদুষ্ট এবং সত্যই ভাষার বাস্তবতাকে প্রতিফলিত করেন না । অন্তত আমার মতামত
ব্যবহারকারী 1942027

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

উত্তর:


89

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

আসুন নিম্নলিখিত বিবৃতি গ্রহণ করা যাক:

foo->doSomething(a + 5, *c);

আসুন আরও ধরে নেওয়া যাক doSomethingযার নিম্নলিখিত স্বাক্ষর রয়েছে:

void doSomething(int a, long b);

এখন, এই নির্দিষ্ট বিবৃতিটির সম্ভাব্য কার্যকারিতা প্রভাব বিশ্লেষণ করার চেষ্টা করা যাক।

সি তে, এর প্রভাবগুলি বেশ পরিষ্কার। fooকেবল স্ট্রাক্টের doSomethingপয়েন্টার হতে পারে এবং কোনও ফাংশনের পয়েন্টার হতে হবে। *cএকটি দীর্ঘ dereferences, এবং a + 5এটি সংখ্যার যোগ। একমাত্র অনিশ্চয়তা প্রকার থেকে আসে a: এটি যদি কোনও পূর্ববর্তী বিষয় না হয় তবে কিছুটা রূপান্তর হবে। তবে এগুলি বাদ দিয়ে এই একক বিবৃতিটির পারফরম্যান্স প্রভাবের পরিমাণ নির্ধারণ করা সহজ।

এখন সি ++ এ স্যুইচ করা যাক। একই বিবৃতিতে এখন খুব আলাদা পারফরম্যান্স বৈশিষ্ট্য থাকতে পারে:

  1. doSomethingএকটি নন-ভার্চুয়াল সদস্য ফাংশন (সস্তা), ভার্চুয়াল সদস্য ফাংশন (কিছুটা বেশি ব্যয়বহুল) std::function, ল্যাম্বডা ... ইত্যাদি সবচেয়ে খারাপ এটি, অজানা জটিলতার কিছু অপারেশন সহ fooএকটি শ্রেণির ধরণের ওভারলোডিং হতে পারে operator->। তাই যাতে কলিং খরচ পরিমাণ নির্ণয় করার জন্য doSomething, এটি এখন প্রয়োজনীয় সঠিক প্রকৃতি জানতে এর fooএবং doSomething
  2. aকোনও পূর্ণসংখ্যার হতে পারে, বা কোনও পূর্ণসংখ্যার (অতিরিক্ত ইন্ডায়ারেশন) একটি রেফারেন্স বা কোনও শ্রেণীর প্রকার যা প্রয়োগ করে operator+(int)। অপারেটর এমনকি অন্য শ্রেণির ধরণটিও ফিরিয়ে দিতে পারে যা স্পষ্টত রূপান্তরিত int। আবার, পারফরম্যান্সের ব্যয় একাকী বিবৃতি থেকে স্পষ্ট হয় না।
  3. cএকটি শ্রেণিবদ্ধ বাস্তবায়ন হতে পারে operator*()। এটি কোনও long*ইত্যাদির রেফারেন্সও হতে পারে

আপনি ছবি পেতে। সি ++ এর ভাষা বৈশিষ্ট্য হওয়ার কারণে, এটি অনেক বেশি কঠিন একটি একক বিবৃতি এর পারফরম্যান্সের খরচ পরিমাণ নির্ণয় করার তুলনায় এটি ছাড়াও C. এখন হয়, মত বিমূর্ত হয় std::vector, std::stringসাধারণভাবে ++, লুকান গতিশীল মেমরি বরাদ্দ সি ব্যবহার করা হয়, যা তাদের নিজস্ব কর্মক্ষমতা বৈশিষ্ট্য আছে, এবং ( এছাড়াও @ আয়ানের উত্তর দেখুন)।

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


1
চমত্কার উত্তর। আমি আমার উত্তরে এটিই ইঙ্গিত দিচ্ছিলাম তবে আপনি এটি আরও ভাল করে ব্যাখ্যা করেছেন।
আয়ান গোল্ডবাই

4
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি ব্যাখ্যা করে যে "সি ++ এর চেয়ে দ্রুত সি'র মতো বিবৃতি কেন বিদ্যমান। সি সি ++ এর চেয়ে দ্রুত বা ধীর হতে পারে তবে সি কোডের একটি নির্দিষ্ট টুকরোটি কেন দ্রুত / ধীর গতির তা সহজেই নির্ধারণ করা সহজ, যা সাধারণত এটি অপ্টিমাইজ করাও সহজ করে তোলে।
লিও

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

4
আমি যুক্ত করব যে সর্বাধিক সি ++ রানটাইম সমতুল্য সি রানটাইমের সাথে তুলনা করে প্রচুর, আপনি মেমরি সীমাবদ্ধ কিনা তা বিবেচনা করে।
জেমস অ্যান্ডারসন

@ জেমসএন্ডারসন যদি আপনি সত্যিই সেই স্মৃতিশক্তি বাঁধা থাকেন তবে আপনার সম্ভবত রানটাইমের মোটেও দরকার নেই :)
নবীন

30

সি ++ তে লিখিত কোডটি নির্দিষ্ট ধরণের কাজের জন্য সি এর চেয়ে দ্রুততর হতে পারে।

আপনি যদি সি ++ পছন্দ করেন তবে সি ++ ব্যবহার করুন। আপনার সফ্টওয়্যারটির অ্যালগরিদমিক সিদ্ধান্তের তুলনায় যে কোনও পারফরম্যান্স সমস্যা নগণ্য হতে চলেছে।


6
এটি দ্রুত হতে পারে তবে একই কারণে এটি দ্রুত নাও হতে পারে।
রব

আপনি কি সি ++ তে লিখিত অপ্টিমাইজড কোডের কয়েকটি উদাহরণ দিতে পারেন যা অনুকূলিত সি এর চেয়ে দ্রুত?

1
@ টমডওয়ারজানস্কি: একটি উদাহরণ হ'ল টেমপ্লেটগুলি ব্যবহার করে কোড পাথ সম্পর্কে সিদ্ধান্তগুলি সংকলনের সময় নির্ধারণ করা যেতে পারে এবং চূড়ান্ত বাইনারিতে হার্ডকোড শেষ করা উচিত, শর্তসাপেক্ষে এবং ব্রাঞ্চিংয়ের পরিবর্তে এটি সি-তে লিখিত থাকলে প্রয়োজনীয়তাও ছিল ইনলাইনিংয়ের মাধ্যমে ফাংশন কল এড়ানোর জন্য।
21

23

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

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


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

6
স্ট্রোক্টস সি ++ এ ক্লাস হয়।
ডানফোল্ড

2
@ রাইটফোল্ড: অবশ্যই, তবে আপনি এখনও সি ++ কোড লিখতে পারেন যা পয়েন্টারগুলির কাছাকাছি বিন্দুতে thisভাষা বৈশিষ্ট্যটি ব্যবহার না করে কাঠামোর কাছে চলে যায় । আমি এটাই বলছিলাম।
গ্রেগ হিউগিল

4
@ জন আসল ব্যয়টি নির্দেশনা নয় (যদিও আমি নিশ্চিত যে এটি কিছু প্রসেসরের প্রিফেচিংয়ের সাথে কিছুটা হলেও ক্ষতিগ্রস্ত হবে) তবে আপনি ভার্চুয়াল ফাংশনগুলিকে ইনলাইন করতে পারবেন না (কমপক্ষে সি ++ এ) যা অন্যথায় সম্ভব হতে পারে না অপ্টিমাইজেশন। এবং হ্যাঁ এটি পারফরম্যান্সের উপর একটি বিশাল প্রভাব ফেলতে পারে।
ভু

2
@ ভু সুষ্ঠু হতে, সমমানের সি কোড (কোড যা ম্যানুয়ালি রানটাইম পলিমারফিজম অনুকরণ করে) সম্পর্কেও একই কথা বলা যেতে পারে। সবচেয়ে বড় পার্থক্যটি হ'ল আমি বিশ্বাস করি যে কম্পাইলারের পক্ষে সি ++ তে ফাংশনটি অন্তর্ভুক্ত করা যেতে পারে কিনা তা নির্ধারণ করা আরও সহজ হবে।
টমাস এডিং

14

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

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

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

আপনি চাইলে সি ++ ব্যবহার করুন। যখন আপনি জানেন না যে নীচের অংশে কী রয়েছে তবে বিমূর্ততাগুলির আপাতদৃষ্টির সুবিধার্থে প্রবঞ্চনা করবেন না।

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


5

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

এই কথাটি বলে আমি সম্প্রতি লাইব্রেরি বিকাশের বিষয়ে একটি দুর্দান্ত কৌশল সম্পর্কে পড়েছিলাম যা আমি মনে করি যে আপনার প্রশ্নের সাথে সরাসরি প্রাসঙ্গিক। নিবন্ধটি শিরোনাম করা হয় "এসি ত্রুটি পরিচালনার স্টাইল যা সি ++ ব্যতিক্রমগুলির সাথে দুর্দান্ত খেলায় " স্টেফানু ডু টাইট এই কৌশলটিকে " ঘন্টাঘড়ি" প্যাটার্ন হিসাবে উল্লেখ করে refers নিবন্ধের প্রথম অনুচ্ছেদ:

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


এখন আপনার প্রাথমিক উদ্বেগের সমাধান করার জন্য: কর্মক্ষমতা।

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

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


ভাষার বৈশিষ্ট্য এবং অপ্টিমাইজেশন কীভাবে সত্যই আপনার পক্ষে কাজ করতে পারে সে সম্পর্কে কিছু মজাদার পড়ার জন্য:

std :: অনন্য_পিটারের শূন্য ওভারহেড রয়েছে

কনসেটেপ্স সংকলন-সময় গণনার অনুমতি দেয়

শব্দার্থিক পদক্ষেপ অপ্রয়োজনীয় অস্থায়ী বস্তু প্রতিরোধ করে


std::unique_ptr has zero overheadএটি সম্ভবত সত্য হতে পারে না (প্রযুক্তিগতভাবে বলতে হয়) কারণ যদি কোনও ব্যতিক্রমের কারণে স্ট্যাকটি খুলে না যায় তবে তার কনস্ট্রাক্টরকে কল করতে হবে। কোনও কাঁচা পয়েন্টারের এই ওভারহেড নেই এবং এখনও আপনার কোডটি নিক্ষেপ না করে সঠিক হতে পারে। একটি সংকলক সাধারণ ক্ষেত্রে এটি প্রমাণ করতে সক্ষম হবে না।
টমাস এডিং

2
@ থমাসডিং আমি ব্যতিক্রম-মুক্ত কোডের ক্ষেত্রে আকার এবং রানটাইম ওভারহেডের কথা উল্লেখ করছিলাম। আমি ভুল হলে আমাকে সংশোধন করুন, তবে এক্সিকিউশন মডেলগুলি রয়েছে যেগুলি শূন্য রানটাইম ওভারহেড ব্যয় করে যখন ব্যতিক্রমগুলি ছুঁড়ে দেওয়া হয় না তখনও প্রয়োজনীয়তার ক্ষেত্রে ব্যতিক্রমগুলি প্রচার করার অনুমতি দেয়। তবুও, কখনই কোনও ব্যতিক্রম নির্মাতায় নিক্ষেপ করা যেতে পারে unique_ptr? এটি ঘোষিত হয়েছে noexcept, এবং তাই খুব কমপক্ষে এটি সমস্ত ব্যতিক্রমগুলি পরিচালনা করে তবে আমি কী ধরণের ব্যতিক্রম এমনকি প্রথম স্থানে ফেলে দিতে পারি তা কল্পনাও করতে পারি না।
vmrob

ভিএমরোব: আমাকে ক্ষমা করুন ... আমি "কনস্ট্রাক্টর" এর পরিবর্তে "ডেস্ট্রাক্টর" লিখতে চাইছিলাম। আমি বোঝাতে চেয়েছিলাম "প্রবক্তা নিক্ষেপ করবে না" খুব। Eeek!
থমাস এডিং

2
@ থমাসডিং আপনি জানেন, ধ্বংসাত্মক কোনও ব্যতিক্রম ছুঁড়ে মারলেও তা বিবেচ্য হবে না বলে আমি মনে করি। যতক্ষণ না ডেস্ট্রাক্টর কোনও নতুন ব্যতিক্রম প্রবর্তন করে না ততক্ষণ পর্যন্ত এটি শূন্যের ওভারহেড ধ্বংস। তদুপরি, আমি বিশ্বাস করি যে পুরো ডেস্ট্রাক্টর অপটিমাইজেশন সহ একক মুছে ফ্রি / ফ্রি কলের সাথে অন্তর্ভুক্ত।
vmrob

4

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

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

সি ++ আপনি যে ধরণের ব্যয়বহুল জিনিসগুলির জন্য প্ররোচিত হন তা হ'ল অতিরিক্ত মেমরি পরিচালনা, বিজ্ঞপ্তি-স্টাইল প্রোগ্রামিং, আপনার প্রোগ্রামকে বহু স্তরের বিমূর্ত গ্রন্থাগারগুলির বিরুদ্ধে বিশ্বাস (যেমন @ ইয়ান বলেছেন), আস্তে আড়াল করা ইত্যাদি are


2

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

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


1
এটি 6 পূর্ববর্তী উত্তরগুলিতে যা ব্যাখ্যা করা হয়েছিল তার চেয়ে বেশি কিছু দেওয়ার প্রস্তাব বলে মনে হচ্ছে না
gnat

আমি মনে করি যে এই উত্তরে একটি গুরুত্বপূর্ণ পয়েন্ট উল্লেখ করা হয়েছে যা অন্য কেউ উল্লেখ করেনি। প্রথম নজরে দেখে মনে হচ্ছে সি ++ হ'ল একটি সুপারসেট, সুতরাং আপনি যদি দ্রুত সি বাস্তবায়ন লিখতে পারেন তবে আপনার সমতুল্য একটি সি ++ বাস্তবায়ন লিখতে সক্ষম হওয়া উচিত। যাইহোক, C99 সীমাবদ্ধ কীওয়ার্ডটিকে সমর্থন করে যা অনিচ্ছাকৃত পয়েন্টার এলিয়াসিং এড়াতে অনুমতি দেয়। সি ++ এর মতো কোনও সমর্থন নেই। পয়েন্টার অ্যালাইজিং এড়ানোর ক্ষমতা ফোর্টরানের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা এটি উচ্চ কার্যকারিতা অ্যাপ্লিকেশনগুলির জন্য দরকারী করে। আমি আশা করি অনুরূপ ডোমেনগুলিতে সি ++ এর তুলনায় C99 এর থেকে আরও ভাল পারফরম্যান্স ধরা সম্ভব।
ব্যবহারকারী27539
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.