c - যদি আমি আউটপুটকে/dev/null এ পুনঃনির্দেশিত করি তবেও মুদ্রণফের কি কোনও খরচ হবে?




linux performance (4)

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

অকার্যকর printf2 (গঠন গৃহস্থালি * বিন্যাস, ...);

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

আমার সহকর্মী এবং আমি একটি মতবিরোধ আছে। তিনি মনে করেন আমরা কেবল সবকিছু / dev / null তে পুনঃনির্দেশিত করতে পারি। এটা কোন আইওও খরচ হবে না তাই প্রেম সংক্ষিপ্ত হতে হবে। কিন্তু আমি মনে করি এটি এখনও CPU খরচ হবে এবং আমরা printf এর জন্য একটি ম্যাক্রো আরও ভালভাবে সংজ্ঞায়িত করব যাতে আমরা "printf" (সম্ভবত কেবলমাত্র ফেরত) লিখতে পারি।

তাই আমার সঠিক মতামত সম্পর্কে কিছু মতামত দরকার। লিনাক্স কি printf optimize যথেষ্ট স্মার্ট হবে? আমি সত্যিই এটা সন্দেহ।


যথেষ্ট.

যখন আপনি প্রোগ্রামটির স্টডাউটকে /dev/null পুনঃনির্দেশিত করেন তখন printf(3) যেকোন কলটি এখনও সমস্ত আর্গুমেন্টগুলি মূল্যায়ন করবে এবং স্ট্রিং ফর্ম্যাটিং প্রক্রিয়াটি এখনও write(2) , যা সম্পূর্ণ ফর্ম্যাট করা স্ট্রিং লিখেছে প্রক্রিয়ার মান আউটপুট। এটি কার্নেল পর্যায়ে রয়েছে যে তথ্য ডিস্কে লেখা হয় না, তবে বিশেষ ডিভাইস /dev/null সাথে যুক্ত হ্যান্ডলার দ্বারা বাতিল করা হয়।

সুতরাং খুব ভালভাবে, আপনি আর্গুমেন্টগুলির মূল্যায়ন এবং printf- এ মুদ্রণ, স্ট্রিংফ্টের পিছনে স্ট্রিং ফর্ম্যাটিংয়ের কাজ এবং অন্তত একটি সিস্টেম কলটি লেখার জন্য স্টেডাউট থেকে /dev/null । আচ্ছা, এটি লিনাক্সে সত্যিকারের পার্থক্য। বাস্তবায়নটি শুধুমাত্র আপনি লিখতে চেয়েছিলেন এমন বাইটগুলির সংখ্যাটি ফেরত দেয় (আপনার কলটির তৃতীয় তর্কের দ্বারা write(2) ) এবং অন্য সবকিছু উপেক্ষা করে ( এই উত্তরটি দেখুন )। আপনি লিখিত তথ্যের পরিমাণ এবং লক্ষ্য ডিভাইসের গতি (ডিস্ক বা টার্মিনাল) এর উপর নির্ভর করে, পারফরম্যান্সের পার্থক্য অনেক পরিবর্তিত হতে পারে। এম্বেডেড সিস্টেমে, সাধারণত, ডিভিডি লেখাটি কে /dev/null পুনঃনির্দেশিত করে কাটা বন্ধ করে, কিছুটা স্বতন্ত্র লিখিত ডেটা সংরক্ষণ করতে পারে।

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

POSIX স্ট্যান্ডার্ড ম্যান্ডেটগুলি printf(3) যেকোনো কলটির জন্য স্ট্যান্ডার্ড আউটপুটতে লেখা হয়, তাই সংশ্লিষ্ট ফাইল বর্ণনাকারীর উপর নির্ভর করে কলটি চাপতে write(2) চাপ প্রয়োগের জন্য আদর্শ-রূপান্তর করা হয় না। POSIX প্রয়োজনীয়তা সম্পর্কে আরও বিস্তারিত জানার জন্য, আপনি Damon এর উত্তর পড়তে পারেন। ওহ, এবং একটি দ্রুত দ্রষ্টব্য: সমস্ত লিনাক্স ডিস্ট্রোগুলি কার্যত পসিক্স-সঙ্গতিপূর্ণ, যদিও এটির প্রত্যয়িত না হওয়া সত্ত্বেও।

সচেতন থাকুন যে আপনি যদি সম্পূর্ণরূপে printf প্রতিস্থাপন করেন তবে কিছু পার্শ্ব প্রতিক্রিয়া ভুল হতে পারে, উদাহরণস্বরূপ printf("%d%n", a++, &b) । প্রোগ্রাম এক্সিকিউশন এনভায়রনমেন্টের উপর নির্ভর করে যদি আপনি সত্যিই আউটপুট দমন করতে চান তবে মুদ্রণ করার আগে পতাকাটি পরীক্ষা করতে একটি বিশ্বব্যাপী পতাকা সেট করুন এবং printf মোড়ানো বিবেচনা করুন - এটি প্রোগ্রামটিকে হ্রাস করতে যাচ্ছে না যেখানে কর্মক্ষমতা হ্রাস দৃশ্যমান , একটি একক অবস্থা চেক হিসাবে printf কলিং এবং সব স্ট্রিং ফর্ম্যাটিং চেয়ে অনেক দ্রুত।


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

এই উত্তরটি POSIX এর নির্দিষ্ট ডকুমেন্টেশন উপর ভিত্তি করে।

সিস্টেম ইন্টারফেস
dprintf, fprintf, printf, snprintf, sprintf - মুদ্রণ বিন্যাস আউটপুট

Fprintf () ফাংশন নামযুক্ত আউটপুট প্রবাহ আউটপুট স্থাপন করা হবে। Printf () ফাংশনটি স্ট্যান্ডার্ড আউটপুট স্ট্রিম স্টডাউটের আউটপুট স্থাপন করবে। স্প্রিন্টফ () ফাংশনটি আউটপুটটি অনুসরণ করবে, নল বাইট, '\ 0' দ্বারা অনুসরণ করা হবে, যা * s থেকে শুরু হওয়া বাইটগুলিতে থাকবে; পর্যাপ্ত স্থান পাওয়া নিশ্চিত করার জন্য এটি ব্যবহারকারীর দায়িত্ব।

বেস সংজ্ঞা
হইবে
POSIX.1-2017 অনুসারে একটি বাস্তবায়নের জন্য, এমন একটি বৈশিষ্ট্য বা আচরণ বর্ণনা করে যা বাধ্যতামূলক। একটি অ্যাপ্লিকেশন বৈশিষ্ট্য বা আচরণ অস্তিত্ব উপর নির্ভর করতে পারেন।


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







dev-null