টেম্পলেটগুলির সাথে কাজ করার সময় আপনি কীভাবে দীর্ঘতর সংকলন বার পরিচালনা করবেন?


13

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

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

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

টেমপ্লেট (আরও ভাল / দ্রুত সংকলক ছাড়াও :-) ছাড়াও) সময় বাড়ানোর (এবং কেবল নয়) সংকলন পরিচালনা করার আপনার উপায়গুলি কী?


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

5
আপনি কি সি ++ 11 ব্যবহার করছেন? দেখতে en.wikipedia.org/wiki/C%2B%2B11#Extern_template
mike30

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

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

4
@DocBrown। বিপরীতে, আপনি বলতে পারছেন যে বিল্ড পারফরম্যান্স উন্নত করতে টেমপ্লেটগুলি এড়ানো একটি অকাল অপটিমাইজেশন। টেমপ্লেটগুলি অনেক সমস্যার জন্য আদর্শ বিমূর্ততা।
মাইকে

উত্তর:


9

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

উদাহরণস্বরূপ, aaa.hআপনি শুধুমাত্র টেম্পলেট ফাংশন fএবং ঘোষণা g:

template <int n>
int f();

template <class T>
void g(int a);

ধরে nটেমপ্লেট প্যারামিটার শুধুমাত্র 1, 3, 6 হতে পারে, এবং Tটেমপ্লেট প্যারামিটার শুধুমাত্র হতে পারে int, longএবং void *

তারপরে আপনি এগুলিকে aaa.cppএভাবে সংজ্ঞায়িত করুন :

template <int n>
int f()
{
    ...
}

template <class T>
void g(int a)
{
    ...
}

template int f<1>();
template int f<3>();
template int f<6>();

template void g<int>(int a);
template void g<long>(int a);
template void g<void *>(int a);

এইভাবে সংকলক সংকলন করার সময় প্রদত্ত প্যারামিটারগুলির জন্য টেম্পলেটটি ইনস্ট্যান্ট করে aaa.cpp। ক্লায়েন্ট কোড সংকলন করার সময়, এটি ধরে নেওয়া হয় যে সংজ্ঞাগুলি কোথাও উপস্থিত রয়েছে এবং লিঙ্কার এটি যত্ন নেবে।

#include "aaa.h"

int main()
{
    f<1>();
    f<3>();
    f<6>();

    g<int>(5);
    g<long>(5);
    g<void *>(5);
}

আপনি স্পষ্টভাবে টেম্পলেট ক্লাস ইনস্ট্যান্ট করতে পারেন। অপূর্ণতা হ'ল আপনি ব্যবহার করতে পারবেন না fবা gঅন্যান্য টেম্পলেট পরামিতি সহ।

#include "aaa.h"

int main()
{
    f<5>();
}

ফলাফল স্বরূপ

undefined reference to `int f<5>()'

আমি এই প্রযুক্তিটি এমন একটি প্রকল্পে ব্যবহার করেছি যেখানে কয়েকটি জটিল শ্রেণি একটি ছোট (<10) পূর্ণসংখ্যার টেম্পলেট প্যারামিটারগুলির সেটের উপর নির্ভর করে এবং এটি সংকলনের সময় উল্লেখযোগ্যভাবে হ্রাস পেয়েছে (যেহেতু সংকলক ক্লায়েন্ট কোডটি সংকলন করার সময় জটিল টেম্পলেট সংজ্ঞাগুলি পার্স করতে পারেনি) । প্রকৃত কোডের উপর নির্ভর করে আপনি কম উন্নতি পেতে পারেন।


2

একবার আমি একই ধরণের সমস্যার জন্য একটি অদ্ভুত সমাধান ব্যবহার করেছি: এসটিএল লিড সহ উত্স ফাইলের জন্য কয়েক সেকেন্ডের মতো বার সংকলন করা - এটি যত ক্ষুদ্রই হোক না কেন। সুতরাং আমি আমার সমস্ত উত্স ফাইলগুলিকে একটি মাস্টার ফাইলে অন্তর্ভুক্ত করেছি এবং ফাইলের প্রতি সংকলনের সময়টি খুব কমই বদলেছে ... যার অর্থ 20+ ফ্যাক্টরের গতি বৃদ্ধি করা কারণ আমার কাছে একটি সংকলন করার জন্য কেবল একটি ফাইল ছিল।

নকশাটি পরিষ্কার রাখার জন্য আমি একটি মেকফাইল বজায় রেখেছি, তবে বাস্তবে কখনও এটি ব্যবহার করিনি (এটি এখনও কাজ করে যাচাই করা ছাড়া)।


0

আমরা আমাদের পূর্বনির্ধারিত শিরোনাম এবং প্রম্পম্পাইলযুক্ত টেমপ্লেটগুলি রাতারাতি তৈরি করার জন্য একটি বড় কাজ শুরু করে দিয়েছিলাম এবং কেবল পরের দিনগুলির বিরুদ্ধে তৈরি করি।

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