লাইব্রেরি ব্যবহার করার সময় দক্ষতা দেওয়া কেন কঠিন?


10

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

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

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

একক শটে :

  • কোডটি নিজের দ্বারা সম্পাদনের গ্যারান্টি তৈরি করে কী?
  • যখন আপনাকে উচ্চ কার্যকারিতা নিশ্চিত করতে হবে তখন ফ্রেমওয়ার্ক / লাইব্রেরিগুলির উপর নির্ভর করা কেন ঝুঁকিপূর্ণ ?

1
আপনি কি সঠিক প্রশ্নটি পরিষ্কার করতে পারবেন? আপনার মনে রাখা কিছু সম্ভাব্য উত্তরগুলিও সহায়তা করতে পারে।
আমির আলী আকবরী

@ আমিরআলিআকবাড়ি শন ওউইন একটি উত্তর পোস্ট করেছে এবং আমি আমার প্রশ্নের নির্দিষ্টতার অভাব লক্ষ্য করেছি। আমি তার পোস্টে একটি মন্তব্য যুক্ত করেছি। দয়া করে পোস্টটিতে কোনও উন্নতির পরামর্শ দিতে দ্বিধা বোধ করুন - আমি অন্যথায় এটি মুছে ফেলার পরিকল্পনা করছি।
রুবেন্স

উত্তর:


4

পুনঃলিখনের খেলাটি আমার নিজের উপর এবং পরে (এবং এখনও এটি করা) করার পরে, আমার তাত্ক্ষণিক প্রতিক্রিয়াটি ছিল অভিযোজনযোগ্যতা

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

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

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

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

সময়ের সাথে সাথে, বাস্তব বিশ্বের এবং মডেলগুলির মধ্যে তাত্পর্য আরও বাড়বে। একটি বন্ধ-বালুচর ফ্রেমওয়ার্ক আপনি তাড়াতাড়ি মত প্রশ্ন সম্মুখীন হতে চাই: আমি কিভাবে উপস্থাপন করতে পারেন thisমধ্যে thatবা কিভাবে করতে রুটিন না Xগ্রহণ / উত্পাদন Y

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


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

7

আমি মনে করি না যে পারফরম্যান্স কোনও সমস্যা হলে প্রত্যেকে সি / সি ++ এ পৌঁছে যায়।

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

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

বিতরণকৃত "বিগ ডেটা" প্রসঙ্গে আপনি ডেটা চলাচলে আরও সাধারণভাবে বাধা: নেটওয়ার্ক ট্রান্সফার এবং আই / ও। নেটিভ কোড সাহায্য করে না। যা সাহায্য করে তা দ্রুত চালানোর জন্য একই কোডটি লেখা নয়, তবে স্মার্ট কোড লেখা।

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

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

"অনুদান" এবং "অক্ষম" এবং "দাবী" সম্পর্কে ফলোআপ আমি বুঝতে পারি না?


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

1
না এটি দুর্দান্ত প্রশ্ন, আপনি যদি চান তবে আপনার সম্পাদনাগুলিতে আপনার মন্তব্যগুলি এখানে প্রতিবিম্বিত করতে পারেন।
শন

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

4

যেমনটি আমরা জানি, ডিজিটাল বিশ্বে একই কাজ করার / প্রত্যাশিত ফলাফল পাওয়ার অনেকগুলি উপায় রয়েছে ..

এবং কোড থেকে আসা দায়িত্ব / ঝুঁকিগুলি বিকাশকারীদের কাঁধে থাকে ..

এটি ছোট তবে আমার কাছে নেট নেট ওয়ার্ডের একটি খুব দরকারী উদাহরণ রয়েছে gu

সুতরাং অনেক। নেট বিকাশকারীগণ পারফরম্যান্সের জন্য / তাদের প্রক্রিয়া নিয়ন্ত্রণের জন্য অন্তর্নির্মিত বাইনারিআডার - বাইনারিউইটারকে তাদের ডেটা সিরিয়ালায়নে ব্যবহার করে ..

এটি ফ্রেম ওয়ার্কের বাইনারি রাইটার শ্রেণিতে নির্মিত 'ওভারলোডেড রাইটিং মেথডগুলির মধ্যে একটি'র সিএসআরপি সোর্স কোড:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

যেমন আপনি দেখতে পাচ্ছেন, এই পদ্ধতিটি বাফার ভেরিয়েবলকে অতিরিক্ত বরাদ্দ না করেই লেখা যেতে পারে:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

বরাদ্দ না করেই আমরা কয়েক মিলি সেকেন্ড অর্জন করতে পারি..এটি কয়েক মিলিসেকেন্ড "প্রায় কিছুই নয়" হিসাবে গ্রহণ করতে পারে তবে সেখানে যদি বহু-হাজার লেখার (যেমন একটি সার্ভার প্রক্রিয়াতে) থাকে তবে কী হবে?

ধরা যাক "কয়েক" 2 (মিলিসেকেন্ড) 2 এবং বহু-হাজার উদাহরণগুলি কেবল 2.000 .. এর মানে হল 4 সেকেন্ডের আরও প্রক্রিয়া সময়..4 সেকেন্ড পরে ফিরে আসবে ..

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

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

এই ছোট লাভ আমাদের মোট কর্মক্ষমতা দেয় ..

এবং যদি আমরা বাইনারি রাইটার.ড্রাইট () পদ্ধতিতে ফিরে যাই ...

_বফার বাস্তবায়নের জন্য অতিরিক্ত অতিরিক্ত বরাদ্দ করা কোনও বিকাশকারী দোষ নয়..এটি "নিরাপদে থাকবেন" ঠিক ঠিক!

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

যদি বিকাশকারী "নিরাপদে থাকুন" সিদ্ধান্ত নেন তবে সাধারণভাবে এর অর্থ পারফরম্যান্স ব্যয়গুলি "নিরাপদে থাকুন" প্রক্রিয়া (গুলি) বাস্তবায়নের উপর নির্ভর করে।

তবে যদি বিকাশকারী "ঝুঁকিপূর্ণ হন, পারফরম্যান্স অর্জন করুন" সিদ্ধান্ত নেন তবে এটিও ত্রুটি নয় .. যতক্ষণ না "ঝুঁকিপূর্ণ" কোডিং সম্পর্কে কিছু আলোচনা হয়।

এবং একটি ছোট নোট হিসাবে: বাণিজ্যিক গ্রন্থাগার বিকাশকারীরা সর্বদা নিরাপদে থাকার চেষ্টা করে কারণ তাদের কোডটি কোথায় ব্যবহার করবে তা তারা জানে না।


4

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

পারফরম্যান্স সাধারণত গৌণ প্রতিযোগিতামূলক গ্রন্থাগারে মূল্যবান হয়। "এক্স লাইব্রেরি আরও ভাল কারণ এটি দ্রুত।" তারপরেও খুব ঘন ঘন এই লাইব্রেরিগুলি এমন একের জন্য সর্বাধিক অনুকূল সমাধানটি বাণিজ্য করবে যা ব্যাপকভাবে লাভ করা যায়।

যে কোনও ফ্রেমওয়ার্ক ব্যবহার করে আপনি সহজাতভাবে একটি ঝুঁকি নিচ্ছেন যে একটি দ্রুত সমাধানের উপস্থিতি রয়েছে। আমি এতদূর যেতে পারি যে একটি দ্রুত সমাধান প্রায় সর্বদা বিদ্যমান।

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

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

একটি উচ্চ-পারফরম্যান্ট পরিবেশ নির্দিষ্ট জেএসএন পার্সার তৈরির কাজটি কি একটি ভাল ধারণা? আমি 100 এর মধ্যে 99 বার সম্মানিত গ্রন্থাগারটি নিয়ে যাব that সেই এক পৃথক দৃষ্টিতে কয়েক মিলিয়ন পুনরাবৃত্তি দ্বারা গুণিত কয়েকটি অতিরিক্ত সিপিইউ চক্রটি উন্নয়নের সময়টিকে উপযুক্ত করে তুলবে।

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