সি ++ সংকলনের সময়ের গতি বাড়ানোর জন্য কোন কৌশলগুলি ব্যবহার করা যেতে পারে?


249

সি ++ সংকলনের সময়ের গতি বাড়ানোর জন্য কোন কৌশলগুলি ব্যবহার করা যেতে পারে?

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

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


1
আপনি আমাদের কিছু প্রসঙ্গ দিতে পারেন? অথবা আপনি খুব সাধারণ উত্তর খুঁজছেন?
পাইরোলিস্টিকাল

1
এই প্রশ্নের সাথে খুব মিল: স্ট্যাকওভারফ্লো.com
অ্যাডাম রোজেনফিল্ড

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

লক্ষ্য করুন যে প্রায়শই বিল্ড সময়ের প্রাসঙ্গিক অংশটি সংকলক দ্বারা নয় তবে বিল্ড স্ক্রিপ্টগুলি ব্যবহার করে
thg gg

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

উত্তর:


257

ভাষা কৌশল

পিম্পল ইডিয়ম

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

ফরোয়ার্ড ঘোষণা

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

ইনপুট / আউটপুট স্ট্রিম বিশেষ করে নিচে তৈরী করে গতি কমে জন্য পরিচিত হয়। যদি আপনার একটি শিরোনাম ফাইলে তাদের প্রয়োজন হয় তবে <iosfwd>পরিবর্তে <iostream># অন্তর্ভুক্ত করার চেষ্টা করুন এবং <iostream>কেবলমাত্র প্রয়োগকারী ফাইলের মধ্যে শিরোনাম অন্তর্ভুক্ত করুন । <iosfwd>শিরোনাম কেবল সামনে ঘোষণা রাখে। দুর্ভাগ্যক্রমে অন্যান্য স্ট্যান্ডার্ড শিরোনামগুলির একটি संबंधित ঘোষণার শিরোনাম নেই।

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

গার্ড শর্তাবলী

একক অনুবাদ ইউনিটে একাধিকবার অন্তর্ভুক্ত হওয়া থেকে হেডার ফাইলগুলি রক্ষার জন্য রক্ষাকারী শর্তাদি ব্যবহার করুন।

#pragma once
#ifndef filename_h
#define filename_h

// Header declarations / definitions

#endif

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

আন্তঃনির্ভরতা হ্রাস করুন

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

সংকলক বিকল্প

পূর্বনির্ধারিত শিরোনাম

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

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

ccache হ'ল আরও একটি ইউটিলিটি যা জিনিসগুলি গতি বাড়ানোর জন্য ক্যাচিংয়ের কৌশলগুলি গ্রহণ করে।

সমান্তরালতা ব্যবহার করুন

অনেক সংকলক / আইডিই একসাথে সংকলন করতে একাধিক কোর / সিপিইউ ব্যবহার করে সমর্থন করে। ইন গনুহ মেক (সাধারণত জিসিসি সঙ্গে ব্যবহৃত) ব্যবহার -j [N]বিকল্প। ভিজ্যুয়াল স্টুডিওতে, সমান্তরালে একাধিক প্রকল্প নির্মাণের অনুমতি দেওয়ার জন্য পছন্দগুলির অধীনে একটি বিকল্প রয়েছে। আপনি কেবলমাত্র প্রকল্প-স্তরের paralellism এর পরিবর্তে ফাইল-স্তরের paralellism এর /MPবিকল্পটিও ব্যবহার করতে পারেন ।

অন্যান্য সমান্তরাল ইউটিলিটিস:

লোয়ার অপটিমাইজেশন স্তরটি ব্যবহার করুন

সংকলক যত বেশি অপ্টিমাইজ করার চেষ্টা করবে তত বেশি কঠিন কাজ করতে হবে।

ভাগ করা লাইব্রেরি

আপনার কম ঘন ঘন সংশোধিত কোডটিকে লাইব্রেরিতে স্থানান্তর করা সংকলনের সময় হ্রাস করতে পারে। ভাগ করা লাইব্রেরি ( .soবা .dll) ব্যবহার করে আপনি পাশাপাশি সংযোগের সময়ও হ্রাস করতে পারেন।

একটি দ্রুত কম্পিউটার পান

আরও র‌্যাম, দ্রুত হার্ড ড্রাইভ (এসএসডি সহ) এবং আরও সিপিইউ / কোর সমস্তই সংকলনের গতিতে পার্থক্য আনবে।


11
পূর্বনির্ধারিত শিরোনামগুলি নিখুঁত নয়। এগুলি ব্যবহারের একটি পার্শ্ব প্রতিক্রিয়া হ'ল আপনি প্রয়োজনের তুলনায় আরও বেশি ফাইল অন্তর্ভুক্ত করেছেন (কারণ প্রতিটি সংকলন ইউনিট একই প্রাকম্পম্পাইল্ড শিরোনাম ব্যবহার করে), যা প্রয়োজনের তুলনায় আরও প্রায়শই সম্পূর্ণ পুনরায় সংশোধন করতে বাধ্য করতে পারে। কিছু মনে রাখবেন।
jalf

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

7
এমনকি আপনার যদি ২০০৩ নয়, কেবল ভিএস ২০০৫ রয়েছে, আপনি .cpp স্তরে সমান্তরাল বিল্ডিং সক্ষম করতে সংকলনের বিকল্পগুলিতে / এমপি স্যুইচ করতে পারেন।
ম্যাকবার্ডি

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

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

43

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

সর্বাধিক সময় ব্যয়কারী বিভাগগুলি সন্ধান করা

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

পদ্ধতি 1 - আকারের ভিত্তিতে চিহ্নগুলি বাছাই করুন

nmচিহ্নগুলি তাদের আকারের উপর ভিত্তি করে তালিকা তৈরি করতে আপনি কমান্ডটি ব্যবহার করতে পারেন :

nm --print-size --size-sort --radix=d YOUR_BINARY

এই কমান্ডটিতে --radix=dআপনাকে দশমিক সংখ্যায় মাপ দেখতে দেয় (ডিফল্ট হেক্স হেক্স)। এখন বৃহত্তম প্রতীকটি দেখে আপনি শনাক্ত করতে পারেন যে আপনি সংশ্লিষ্ট বর্গটি ভেঙে ফেলতে পারেন এবং বেস-ক্লাসে অ-টেম্প্লেটেড অংশগুলি ফ্যাক্টর করে বা ক্লাসটিকে একাধিক শ্রেণিতে বিভক্ত করে পুনরায় ডিজাইনের চেষ্টা করতে পারেন।

পদ্ধতি 2 - দৈর্ঘ্যের ভিত্তিতে প্রতীকগুলি বাছাই করুন

আপনি নিয়মিত nmকমান্ড চালাতে পারেন এবং চিহ্নগুলির দৈর্ঘ্যের উপর ভিত্তি করে সাজানোর জন্য এটি আপনার প্রিয় স্ক্রিপ্ট ( এডাব্লুকে , পাইথন , ইত্যাদি) এ পাইপ করতে পারেন । আমাদের অভিজ্ঞতার ভিত্তিতে, এই পদ্ধতিটি পদ্ধতি 1 এর চেয়ে ভাল প্রার্থীদের তৈরি করা সবচেয়ে বড় সমস্যা চিহ্নিত করে।

পদ্ধতি 3 - টেম্পলাইট ব্যবহার করুন

" Templight একটি হল ঝনঝন ভিত্তিক সময় এবং টেমপ্লেট instantiations স্মৃতির খরচ প্রোফাইলে এবং টেমপ্লেট ইনস্ট্যান্স প্রক্রিয়ার মধ্যে অন্তর্দর্শন লাভ ইন্টারেক্টিভ ডিবাগিং সেশন সম্পাদন করতে টুল"।

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

প্যাচ প্রয়োগ করার পরে আপনি templight++আপনার কোডটি সংকলন করার জন্য ইনস্টলেশনের উপরে নির্দিষ্ট বিল্ড ফোল্ডারে অবস্থিত ব্যবহার করতে পারেন ।

templight++এটি আপনার রাস্তায় রয়েছে তা নিশ্চিত করুন । CXXFLAGSআপনার মেকফাইলে বা আপনার কমান্ড লাইন বিকল্পগুলিতে নিম্নলিখিত স্যুইচগুলি সংকলন করতে:

CXXFLAGS+=-Xtemplight -profiler -Xtemplight -memory -Xtemplight -ignore-system

অথবা

templight++ -Xtemplight -profiler -Xtemplight -memory -Xtemplight -ignore-system

সংকলন সম্পন্ন হওয়ার পরে, আপনি একই ফোল্ডারে একটি .trace.memory.pbf এবং .trace.pbf তৈরি করতে পারবেন। এই চিহ্নগুলি কল্পনা করতে, আপনি টেম্পলাইট সরঞ্জামগুলি ব্যবহার করতে পারেন যা এগুলিকে অন্য ফর্ম্যাটে রূপান্তর করতে পারে। টেমপ্লাইট-রূপান্তর ইনস্টল করতে এই নির্দেশাবলী অনুসরণ করুন । আমরা সাধারণত কলগ্রিনড আউটপুট ব্যবহার করি। আপনার প্রকল্পটি যদি ছোট হয় তবে আপনি গ্রাফভিজ আউটপুটও ব্যবহার করতে পারেন:

$ templight-convert --format callgrind YOUR_BINARY --output YOUR_BINARY.trace

$ templight-convert --format graphviz YOUR_BINARY --output YOUR_BINARY.dot

উত্পাদিত কলগ্রাইন্ড ফাইলটি কেচেচেগ্রিন্ড ব্যবহার করে খোলার সুযোগ রয়েছে যেখানে আপনি সর্বাধিক সময় / মেমরি গ্রহণকারী ইনস্ট্যান্টেশন ব্যবহার করতে পারেন।

টেমপ্লেট ইনস্ট্যান্টেশনের সংখ্যা হ্রাস করা হচ্ছে

যদিও টেমপ্লেট ইনস্ট্যান্টেশনগুলির সংখ্যা হ্রাস করার কোনও সঠিক সমাধান নেই, তবে কয়েকটি নির্দেশিকা যা সহায়তা করতে পারে:

একাধিক টেম্পলেট আর্গুমেন্ট সহ রিফ্যাক্টর ক্লাস

উদাহরণস্বরূপ, যদি আপনার কোনও ক্লাস থাকে,

template <typename T, typename U>
struct foo { };

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

রিফ্যাক্টর স্বতন্ত্র অনুবাদ ইউনিটগুলিতে অ-তাত্পর্যযুক্ত কোড

এই কৌশলটি ব্যবহার করে আপনি সাধারণ বিভাগটি একবার সংকলন করতে পারেন এবং এটির পরে আপনার অন্যান্য টিউ (অনুবাদ ইউনিট) এর সাথে লিঙ্ক করতে পারেন।

বাহ্যিক টেম্পলেট ইনস্ট্যান্টেশন ব্যবহার করুন (সি ++ 11 থেকে)

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

উদাহরণস্বরূপ, এতে:

enum class PossibleChoices = {Option1, Option2, Option3}

template <PossibleChoices pc>
struct foo { };

আমরা জানি যে এই শ্রেণীর তিনটি সম্ভাব্য তাত্পর্য থাকতে পারে:

template class foo<PossibleChoices::Option1>;
template class foo<PossibleChoices::Option2>;
template class foo<PossibleChoices::Option3>;

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

extern template class foo<PossibleChoices::Option1>;
extern template class foo<PossibleChoices::Option2>;
extern template class foo<PossibleChoices::Option3>;

আপনি যদি ইনস্ট্যান্টেশনের একটি সাধারণ সেট দিয়ে বিভিন্ন পরীক্ষা সংকলন করেন তবে এই কৌশলটি আপনার সময় বাঁচাতে পারে।

দ্রষ্টব্য: এমপিআইএইচ 2 এই মুহূর্তে সুস্পষ্ট ইনস্ট্যান্টেশন উপেক্ষা করে এবং সর্বদা সমস্ত সংকলন ইউনিটে ইনস্ট্যান্টেটেড ক্লাসগুলি সংকলন করে।

Unityক্য গড়ে তোলে ব্যবহার করুন

Unityক্য তৈরির পেছনের পুরো ধারণাটি হ'ল আপনি একটি ফাইলের মধ্যে ব্যবহার করেন এমন সমস্ত .cc ফাইল অন্তর্ভুক্ত করা এবং সেই ফাইলটি কেবল একবার সংকলন করা। এই পদ্ধতিটি ব্যবহার করে, আপনি বিভিন্ন ফাইলগুলির সাধারণ বিভাগগুলিকে পুনর্বহাল করা এড়াতে পারবেন এবং যদি আপনার প্রকল্পে প্রচুর প্রচলিত ফাইল অন্তর্ভুক্ত থাকে তবে আপনি সম্ভবত ডিস্ক অ্যাক্সেসগুলিতেও সঞ্চয় করতে পারেন।

উদাহরণস্বরূপ, এর অনুমান করা আপনি তিনটি ফাইল আছে যাক foo1.cc, foo2.cc, foo3.ccএবং তারা সব অন্তর্ভুক্ত tupleথেকে STL । আপনি দেখতে এমন একটি তৈরি করতে foo-all.ccপারেন:

#include "foo1.cc"
#include "foo2.cc"
#include "foo3.cc"

আপনি কেবল একবার এই ফাইলটি সঙ্কলন করুন এবং তিনটি ফাইলের মধ্যে সাধারণ তাত্পর্যকে সম্ভাব্যভাবে হ্রাস করুন। উন্নতিটি তাৎপর্যপূর্ণ হতে পারে কি না তা সাধারণত অনুমান করা শক্ত। তবে একটি স্পষ্ট সত্য হ'ল আপনি নিজের বিল্ডগুলির মধ্যে সমান্তরালতা হারাবেন (আপনি আর তিনটি ফাইল একই সাথে সংকলন করতে পারবেন না)।

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

পূর্বনির্ধারিত শিরোনাম

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

$ g++ YOUR_HEADER.hpp

এটি একই ফোল্ডারে একটি YOUR_HEADER.hpp.gch file( .gchজিসিসিতে পিসিএইচ ফাইলগুলির জন্য এক্সটেনশন) উত্পন্ন করবে । এর অর্থ হ'ল আপনি যদি YOUR_HEADER.hppঅন্য কোনও ফাইলে অন্তর্ভুক্ত করেন তবে সংকলকটি আগের ফোল্ডারের YOUR_HEADER.hpp.gchপরিবর্তে আপনার ব্যবহার করবে YOUR_HEADER.hpp

এই কৌশলটি নিয়ে দুটি সমস্যা রয়েছে:

  1. আপনাকে নিশ্চিত করতে হবে যে হেডার ফাইলগুলি পূর্বনির্ধারিত হচ্ছে স্থিতিশীল এবং কোনও পরিবর্তন হচ্ছে না ( আপনি সর্বদা নিজের মেকফিল পরিবর্তন করতে পারেন )
  2. আপনি কেবল প্রতি সংকলন ইউনিটে একটি পিসিএইচ অন্তর্ভুক্ত করতে পারেন (বেশিরভাগ সংকলককে)। এর অর্থ হ'ল যদি আপনার একাধিক হেডার ফাইল প্রাকপম্পাইল করতে হয় তবে আপনাকে সেগুলি একটি ফাইলে অন্তর্ভুক্ত করতে হবে (যেমন, all-my-headers.hpp)। তবে এর অর্থ হ'ল আপনাকে নতুন জায়গায় সমস্ত জায়গায় অন্তর্ভুক্ত করতে হবে। ভাগ্যক্রমে, জিসিসির কাছে এই সমস্যার সমাধান রয়েছে। এটি ব্যবহার -includeকরে নতুন হেডার ফাইলটি দিন। আপনি এই কৌশলটি ব্যবহার করে কমা বিভিন্ন ফাইল পৃথক করতে পারেন।

উদাহরণ স্বরূপ:

g++ foo.cc -include all-my-headers.hpp

নামবিহীন বা নামবিহীন নেমস্পেস ব্যবহার করুন

নামবিহীন নেমস্পেসস (ওরফে নামবিহীন নেমস্পেসস) উত্পাদিত বাইনারি আকারগুলি উল্লেখযোগ্যভাবে হ্রাস করতে পারে। নামবিহীন নেমস্পেসগুলি অভ্যন্তরীণ লিঙ্কেজ ব্যবহার করে, যার অর্থ এই যে নামগুলি স্পেসে উত্পন্ন চিহ্নগুলি অন্যান্য টিইউতে (অনুবাদ বা সংকলনের ইউনিট) দৃশ্যমান হবে না। সংকলক সাধারণত নামবিহীন নামের জন্য অনন্য নাম উত্পন্ন করে। এর অর্থ হল আপনার যদি foo.hpp ফাইল থাকে:

namespace {

template <typename T>
struct foo { };
} // Anonymous namespace
using A = foo<int>;

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

দৃশ্যমানতার বিকল্পগুলি পরিবর্তন করা

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

দৃশ্যমানতার সাহায্যে আপনি যে চিহ্নগুলি তৈরি করেছেন তা ভাগ করা বস্তুগুলি থেকে ব্যক্তিগত হিসাবে বিবেচনা করতে পারবেন hide জিসিসিতে আপনি -visibilityআপনার সংকলকটির বিকল্পটিতে ডিফল্ট বা লুকিয়ে রেখে চিহ্নগুলির দৃশ্যমানতা নিয়ন্ত্রণ করতে পারেন । এটি কিছুটা নামবিহীন নেমস্পেসের অনুরূপ তবে আরও বিস্তৃত এবং অনুপ্রবেশজনক উপায়ে।

আপনি যদি প্রতি কেস দৃশ্যমানতা নির্দিষ্ট করতে চান, আপনাকে আপনার ফাংশন, ভেরিয়েবল এবং ক্লাসে নিম্নলিখিত বৈশিষ্ট্যগুলি যুক্ত করতে হবে:

__attribute__((visibility("default"))) void  foo1() { }
__attribute__((visibility("hidden")))  void  foo2() { }
__attribute__((visibility("hidden")))  class foo3   { };
void foo4() { }

জিসিসিতে ডিফল্ট দৃশ্যমানতা ডিফল্ট (সর্বজনীন), এর অর্থ হ'ল আপনি উপরেরটি একটি ভাগ করা লাইব্রেরি ( -shared) পদ্ধতি হিসাবে সংকলন করেন foo2এবং ক্লাসটি foo3অন্যান্য টিইউতে দৃশ্যমান হবে না ( foo1এবং foo4দৃশ্যমান হবে)। আপনি যদি সংকলন করেন -visibility=hiddenতবে কেবল foo1দৃশ্যমান হবে। এমনকি foo4গোপন করা হবে।

আপনি জিসিসি উইকিতে দৃশ্যমানতা সম্পর্কে আরও পড়তে পারেন ।


32

আমি এই নিবন্ধগুলিকে "গেমসের ভিতর থেকে, ইনডি গেম ডিজাইন এবং প্রোগ্রামিং" থেকে সুপারিশ করব:

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


17

একটি কৌশল যা অতীতে আমার পক্ষে বেশ ভালভাবে কাজ করেছিল: একাধিক সি ++ উত্স ফাইলগুলি স্বতন্ত্রভাবে সংকলন করবেন না, বরং একটি সি ++ ফাইল উত্পন্ন করুন যার মধ্যে অন্যান্য সমস্ত ফাইল রয়েছে:

// myproject_all.cpp
// Automatically generated file - don't edit this by hand!
#include "main.cpp"
#include "mainwindow.cpp"
#include "filterdialog.cpp"
#include "database.cpp"

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

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

এটির মূল্যের জন্য, ১৯৯৯ সাল থেকে কেডিপি প্রকল্পটি ঠিক একই কৌশলটি ব্যবহার করেছে অনুকূলিত বাইনারিগুলি তৈরি করতে (সম্ভবত একটি মুক্তির জন্য)। বিল্ড কনফিগার স্ক্রিপ্টে স্যুইচ করা হয়েছিল --enable-final। প্রত্নতাত্ত্বিক আগ্রহের বাইরে আমি পোস্টিংটি খনন করেছিলাম যা এই বৈশিষ্ট্যটি ঘোষণা করেছে: http://lists.kde.org/?l=kde-devel&m=92722836009368&w=2


2
আমি সত্যিই এটি একই জিনিস কিনা তা নিশ্চিত নই, তবে আমার ধারণা, ভিসি ++ ( এমএসডিএন.মাইক্রোসফট / ওয়েবসাইট- লিবেরি / জাজি0ডে ৮০২২২ ভিএস.71০% 29.aspx ) তে "পুরো প্রোগ্রাম অপ্টিমাইজেশন" চালু করা উচিত আপনি যা পরামর্শ দিচ্ছেন তার চেয়ে রানটাইম পারফরম্যান্সে একই প্রভাব। সংকলন সময়, তবে অবশ্যই আপনার পদ্ধতির ভাল হতে পারে!
ফিলিপ

1
@ ফ্রেরিচ: আপনি ওজির উত্তরে উল্লিখিত ইউনিটি বিল্ডগুলি বর্ণনা করছেন। আমি এগুলিকে বাল্ক বিল্ডস এবং মাস্টার বিল্ডস নামেও দেখেছি।
ইডব্রি

তাহলে কোনও ইউবি কীভাবে ডাব্লুপিও / এলটিসিজির সাথে তুলনা করে?
পৌল

এটি কেবলমাত্র এককালীন সংকলনের জন্য কার্যকর, বিকাশের সময় নয় যেখানে আপনি সম্পাদনা, বিল্ডিং এবং পরীক্ষার মধ্যে চক্র রেখে চলেছেন। আধুনিক বিশ্বে চারটি কোর আদর্শ, সম্ভবত কয়েক বছর পরে মূল গণনা উল্লেখযোগ্যভাবে বেশি। যদি সংকলক এবং লিঙ্কার একাধিক থ্রেড ব্যবহার করতে সক্ষম না হয় তবে ফাইলগুলির তালিকা সম্ভবত <core-count> + Nসাবলিস্টগুলিতে বিভক্ত হতে পারে যেগুলি সমান্তরালভাবে সংকলিত যেখানে Nকিছু উপযুক্ত পূর্ণসংখ্যা রয়েছে (সিস্টেমের মেমরির উপর নির্ভর করে এবং মেশিনটি অন্যভাবে কীভাবে ব্যবহৃত হয়)।
FooF

15

এই বিষয়টিতে একটি সম্পূর্ণ বই রয়েছে, যার শিরোনাম বড়-স্কেল সি ++ সফটওয়্যার ডিজাইন (জন লাকোস দ্বারা রচিত)।

পুর্বে প্রাক-তারিখের টেম্পলেটগুলি, সুতরাং সেই বইয়ের বিষয়বস্তুগুলিতে "টেমপ্লেটগুলি ব্যবহার করেও সংকলকটি ধীর করে দিতে পারে"।


বইটি প্রায়শই এই ধরণের বিষয়গুলিতে উল্লেখ করা হয় তবে আমার জন্য এটি তথ্যের ক্ষেত্রে খুব কম ছিল। এটি মূলত যতটা সম্ভব ফরোয়ার্ড ডিক্লেয়ারেশন এবং ডিকپل নির্ভরতা নির্ভর করে বলে states এটি পিপল আইডিয়ম ব্যবহারের রানটাইম ঘাটতি রয়েছে তা ছাড়াও স্পষ্ট করে বলা কিছুটা।
gast128

@ gast128 আমি মনে করি এর বিন্দুটি কোডিং আইডিয়ামগুলি ব্যবহার করা যা বর্ধিত পুনরায় সংকলনের অনুমতি দেয়, অর্থাত্, যদি আপনি কোথাও কিছু উত্স পরিবর্তন করেন তবে আপনাকে সবকিছু পুনরায় সংকলন করতে হবে না।
ক্রিসডাব্লু

15

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

অন্য বিকল্পটি হ'ল, আপনি যখন জিএনইউ মেকের সাথে কাজ করবেন তখন -j<N>বিকল্পটি চালু করতে হবে :

  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.

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

তবে লিঙ্কারটি নিজেই থ্রেড করা যায় এবং ইএলএফ লিঙ্কার এটি করে। এটি থ্রেডেড সি ++ কোডটি অপ্টিমাইজড যা বলা হয়ে থাকে যে ইএলএফ অবজেক্ট ফাইলগুলি পুরাতন (এবং আসলে বাইনুটিলে অন্তর্ভুক্ত ছিল ) এর চেয়ে দ্রুততর সংযোগ দেয় toGNU gold ld


ঠিক আছে, হ্যাঁ দুঃখিত আমি যখন অনুসন্ধান করেছি তখন এই প্রশ্নটি আসেনি।
স্কট ল্যাংহ্যাম

তোমার দুঃখিত হওয়ার দরকার নেই এটি ভিজ্যুয়াল সি ++ এর জন্য ছিল। আপনার প্রশ্নটি কোনও সংকলকের জন্য বলে মনে হচ্ছে। তাই ঠিক আছে :)
জোহানেস স্কাউব -

12

এখানে কিছু আছে:

  • একাধিক-সংকলক কাজ শুরু করে সমস্ত প্রসেসরের কোর ব্যবহার করুন ( make -j2এটি একটি ভাল উদাহরণ)।
  • বন্ধ করুন বা নীচু অপ্টিমাইজেশন (উদাহরণস্বরূপ, জিসিসি অনেক সঙ্গে দ্রুততর -O1চেয়ে -O2বা -O3)।
  • প্রাকম্পম্পাইল্ড শিরোনাম ব্যবহার করুন

12
এফওয়াইআই, আমি পাই যে কোরগুলির চেয়ে বেশি প্রক্রিয়া শুরু করা সাধারণত দ্রুত হয়। কোয়াড কোর সিস্টেমে উদাহরণস্বরূপ, আমি সাধারণত -j8 ব্যবহার করি না -j4। এর কারণ হ'ল যখন একটি প্রক্রিয়া আই / ও-তে অবরুদ্ধ থাকে, অন্যটি সংকলন করা যায়।
মিঃ ফুজ

@ মিঃফুজ: কয়েক বছর আগে আমি লিনাক্স কার্নেলটি (র‌্যাম স্টোরেজ থেকে) একটি আই 7-২7০০ কে (৪ টি কোর, ৮ টি থ্রেড, একটি ধ্রুবক গুণক সেট করেছি) সংকলন করে পরীক্ষা করেছি। আমি সঠিক সেরা ফলাফলটি ভুলে গেছি, তবে আপনার -j12প্রস্তাব অনুসারে প্রায় -j18দ্রুততর চেয়ে দ্রুত ছিল -j8। আমি ভাবছি মেমরি ব্যান্ডউইদথ সীমিত ফ্যাক্টর হওয়ার আগে আপনার কতটি কোর থাকতে পারে ...
মার্ক কে কোয়ান

@ মার্ককোয়ান এটি অনেকগুলি বিষয়ের উপর নির্ভর করে। বিভিন্ন কম্পিউটারে বন্যভাবে বিভিন্ন মেমরির ব্যান্ডউইথ থাকে। আজকাল হাই এন্ড প্রসেসরের সাথে, মেমরি বাসটি পরিপূর্ণ করতে একাধিক কোর লাগবে। এছাড়াও, I / O এবং CPU এর মধ্যে ভারসাম্য রয়েছে। কিছু কোড সংকলন করা খুব সহজ, অন্যান্য কোড ধীর হতে পারে (যেমন প্রচুর টেমপ্লেট সহ)। আমার বর্তমান থাম্বের নিয়ম-j 2x সহ আসল কোরগুলির সংখ্যার সাথে।
মিঃ ফুজ

11

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

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

আধুনিক, ক্যাশে, একটি সংকলক ক্যাশে is এটি আবার প্রিপ্রসেসর কার্যকর করে এবং তারপরে একটি অভ্যন্তরীণ ডাটাবেস (একটি স্থানীয় ডিরেক্টরিতে অনুষ্ঠিত) সাথে পরীক্ষা করে যদি সেই প্রিপ্রসেসর ফাইলটি ইতিমধ্যে একই সংকলক পরামিতিগুলির সাথে সংকলিত হয়। এটি যদি করে তবে এটি কম্পাইলারের প্রথম রান থেকে বাইনারি এবং আউটপুটকে পপ আপ করে।

উভয়ই একই সময়ে ব্যবহার করা যেতে পারে, যাতে চক্রের স্থানীয় অনুলিপি না থাকলে এটি জালটি ট্র্যাক্টির সাথে অন্য নোডে জালটি প্রেরণ করতে পারে, অন্যথায় এটি কোনও প্রক্রিয়া ছাড়াই সমাধানটি ইনজেক্ট করতে পারে।


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

9

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

বিন্দুতে ফিরে আসা, ডুপ্লিকেট শিরোনাম সংজ্ঞা রোধ করতে নির্দেশাবলীর সাহায্যে সংকলনের সময়গুলি হ্রাস করার সময় আমি প্রথম জিনিসটি শিখেছিলাম।


1
পুরানো কিন্তু দামি. কখনও কখনও সুস্পষ্ট ভুলে যায়।
alcor

1
'রক্ষীদের অন্তর্ভুক্ত করুন'
gast128

8

আরও র‌্যাম।

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


ডস-এ আপনার খুব বেশি স্মৃতি থাকতে পারে না
ফুচলভি

6

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

উদাহরণ স্বরূপ:

// T.h
class Class2; // Forward declaration

class T {
public:
    void doSomething(Class2 &c2);
private:
    Class2 *m_Class2Ptr;
};

// T.cpp
#include "Class2.h"
void Class2::doSomething(Class2 &c2) {
    // Whatever you want here
}

আপনি যদি এটি যথেষ্ট পরিমাণে করেন তবে কম কিছুতে প্রিপ্রসেসরটির জন্য কম কাজ অন্তর্ভুক্ত থাকে।


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

1
যদি কেবল একটি অনুবাদ ইউনিট থাকে তবে কেন এটি একটি শিরোনামে রেখে বিরক্ত করবেন? সোর্স ফাইলে বিষয়বস্তু রেখে দেওয়া কি আরও বেশি অর্থবোধ করে না? শিরোলেখগুলির পুরো বিন্দুটি এটি নয় যে এটি একাধিক উত্স ফাইল দ্বারা অন্তর্ভুক্ত হতে পারে?
ইভান তেরান


5

ব্যবহার

#pragma once

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


2
যদিও ব্যাপকভাবে সমর্থিত, # প্রাগমা একবার অ-মানক। দেখুন en.wikipedia.org/wiki/Pragma_once
ChrisInEdmonton

7
এবং এই দিনগুলিতে নিয়মিত অন্তর্ভুক্ত প্রহরীদের একই প্রভাব থাকে। যতক্ষণ না তারা ফাইলের শীর্ষে রয়েছে, সংকলক তাদের একবার #pragma হিসাবে বিবেচনা করতে সম্পূর্ণরূপে সক্ষম
jalf

5

কেবল সম্পূর্ণতার জন্য: একটি বিল্ড ধীর হতে পারে কারণ বিল্ড সিস্টেমটি বোকা হওয়ার পাশাপাশি সংকলকটি এর কাজটি করতে দীর্ঘ সময় নিচ্ছে।

ইউনিক্স পরিবেশে এই বিষয়টির আলোচনার জন্য পুনরাবৃত্তিমূলক বিবেচনা করুন ক্ষতিকারক (পিডিএফ) পড়ুন ।


4
  • আপনার কম্পিউটার আপগ্রেড করুন

    1. কোয়াড কোর (বা একটি ডুয়াল-কোয়াড সিস্টেম) পান
    2. প্রচুর র‌্যাম পান।
    3. ফাইল I / O বিলম্বকে হ্রাস করতে র‌্যাম ড্রাইভ ব্যবহার করুন। (এমন কিছু সংস্থা রয়েছে যা আইডিই এবং সাটা র‌্যাম ড্রাইভ তৈরি করে যা হার্ড ড্রাইভের মতো কাজ করে)।
  • তারপরে আপনার অন্যান্য সমস্ত সাধারণ পরামর্শ রয়েছে

    1. উপলব্ধ থাকলে প্রাকম্পম্পাইল্ড শিরোনাম ব্যবহার করুন।
    2. আপনার প্রকল্পের অংশগুলির মধ্যে সংযোগের পরিমাণ হ্রাস করুন। একটি হেডার ফাইল পরিবর্তন করার জন্য সাধারণত আপনার পুরো প্রকল্পটি পুনরায় সংশোধনের প্রয়োজন হয় না।

4

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


হাহ। কেউ কেন এটিকে ভোট দিয়েছে? আমি আগামীকাল চেষ্টা করব।
স্কট ল্যাংহাম

1
আমি ডাউনভোটটি আশা করি কারণ এটি কখনই বড় পার্থক্য করে না। আপনার যদি পর্যাপ্ত অব্যবহৃত র‌্যাম থাকে তবে ওএস বুদ্ধি করে যেকোনভাবে এটি ডিস্ক ক্যাশে হিসাবে ব্যবহার করবে।
এমএসএলটারস

1
@ এসএমএলটার্স - এবং "যথেষ্ট" কত হবে? আমি জানি যে যে তত্ত্ব, কিন্তু কিছু একটা RAMdrive ব্যবহার কারণে নেই আসলে একটি উল্লেখযোগ্য সাহায্য দিতে। ফিগার যান ...
ভিলক্স-

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

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

3

ডায়নামিক লিঙ্কিং (.so) স্ট্যাটিক লিঙ্কিং (.a) এর চেয়ে অনেক বেশি দ্রুত হতে পারে। বিশেষত যখন আপনি ধীর নেটওয়ার্ক ড্রাইভ করেন। এটি হ'ল .a ফাইলটিতে আপনার সমস্ত কোড রয়েছে যা প্রক্রিয়া করা এবং লিখিতভাবে লেখা দরকার। তদ্ব্যতীত, ডিস্কের চেয়ে অনেক বড় এক্সিকিউটেবল ফাইলটি লিখতে হবে।


ডায়নামিক লিঙ্কিং অনেক ধরণের লিঙ্ক-টাইম অপ্টিমাইজেশানগুলি রোধ করে যাতে আউটপুট অনেক ক্ষেত্রে ধীর হতে পারে
phuclv

3

সংকলনের সময় সম্পর্কে নয়, তবে নির্মাণের সময় সম্পর্কে:

  • ব্যবহার করুন ccache আপনি একই ফাইল পুনর্নির্মাণের আছে যদি আপনি আপনার buildfiles কাজ করছি

  • ব্যবহার করুন নিনজা-বিল্ড করতে পরিবর্তে। আমি বর্তমানে project 100 উত্স ফাইল সহ একটি প্রকল্প সংকলন করছি এবং সবকিছু ক্যাশে দ্বারা ক্যাশে করা হয়েছে। প্রয়োজন 5 মিনিট, নিনজা 1 এর চেয়ে কম।

চ্যামেক দিয়ে আপনার নিনজা ফাইলগুলি তৈরি করতে পারেন -GNinja


3

আপনি কোথায় আপনার সময় ব্যয় করছেন? আপনি কি সিপিইউ আবদ্ধ? স্মৃতি আবদ্ধ? ডিস্ক বাউন্ড? আপনি আরও কোর ব্যবহার করতে পারেন? আরও র‌্যাম? আপনার কি রেড দরকার? আপনি কি কেবল আপনার বর্তমান সিস্টেমের দক্ষতা উন্নত করতে চান?

জিসিসি / জি ++ এর অধীনে, আপনি সিসিচে তাকিয়েছেন ? আপনি যদি make clean; makeঅনেক কিছু করেন তবে এটি সহায়ক হতে পারে ।


2

দ্রুত হার্ড ডিস্ক।

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


2

লিনাক্সে (এবং সম্ভবত কিছু অন্যান্য * NIXes), আপনি আউটপুটটিতে স্টারিং না করে এবং অন্য টিটিওয়াইতে পরিবর্তন না করে সংকলনটি সত্যই গতিতে পারেন ।

এখানে পরীক্ষা: প্রিন্টফ আমার প্রোগ্রামটি ধীর করে দেয়


2

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


2

আপনার যদি মাল্টিকোর প্রসেসর থাকে তবে উভয় ভিজ্যুয়াল স্টুডিও (2005 এবং তার পরে) পাশাপাশি জিসিসি মাল্টি-প্রসেসরের সংকলন সমর্থন করে। আপনার কাছে হার্ডওয়্যার থাকলে এটি সক্ষম করার জন্য নিশ্চিত something


2
@ ফেলম্যান, অন্যান্য উত্তরগুলির কয়েকটি দেখুন - -j # বিকল্পটি ব্যবহার করুন।
স্ট্র্যাজার

1

যদিও একটি "কৌশল" না, আমি কীভাবে উইন 32 প্রকল্পগুলি আমার "হ্যালো ওয়ার্ল্ড" খালি প্রকল্পের চেয়ে দ্রুত সংকলিত করেছি তা বুঝতে পারি না। সুতরাং, আমি আশা করি এটি আমার মতো কাউকে সহায়তা করে।

ভিজ্যুয়াল স্টুডিওতে, সংকলন বার বাড়ানোর একটি বিকল্প হ'ল ইনক্রিমেন্টাল লিঙ্কিং ( / অবৈধ )। এটি লিঙ্ক-টাইম কোড জেনারেশন ( / LTCG ) এর সাথে অসঙ্গত তাই রিলিজ বিল্ডগুলি করার সময় বর্ধিত লিঙ্কটি অক্ষম করতে মনে রাখবেন।


1
লিঙ্ক-টাইম কোড জেনারেশন অক্ষম করা ভাল পরামর্শ নয় কারণ এটি অনেকগুলি অপ্টিমাইজেশন অক্ষম করে। আপনাকে /INCREMENTALকেবল ডিবাগ মোডে সক্ষম করতে হবে
ফুক্লিভি

1

ভিজ্যুয়াল স্টুডিও 2017 দিয়ে শুরু করে আপনার সময় কি লাগে তা নিয়ে কিছু সংকলক মেট্রিক্স ধারণ করার ক্ষমতা রাখে।

প্রকল্পের বৈশিষ্ট্য উইন্ডোতে এই পরামিতিগুলিকে সি / সি ++ -> কমান্ড লাইন (অতিরিক্ত বিকল্প) যুক্ত করুন: /Bt+ /d2cgsummary /d1reportTime

আপনার এই পোস্টে আরও তথ্য থাকতে পারে ।


0

স্ট্যাটিকের পরিবর্তে ডায়নামিক লিঙ্কিং ব্যবহার আপনাকে দ্রুত সংকলক করে তোলে যা অনুভব করতে পারে।

আপনি যদি টি ক্ল্যাক ব্যবহার করেন তবে সম্পত্তিটি সক্রিয় করুন:

set(BUILD_SHARED_LIBS ON)

বিল্ড রিলিজ, স্ট্যাটিক লিঙ্ক ব্যবহার করে আরও অনুকূলিত করা যায়।

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