অন্যান্য পূর্ণসংখ্যার ধরণের চেয়ে দ্রুত পূর্ণসংখ্যার প্রকারগুলি কেন দ্রুত?


107

আইএসও / আইইসি 9899: 2018 (সি 18) এ এটি 7.20.1.3 এর অধীনে বলা হয়েছে:

7.20.1.3 দ্রুততম সর্বনিম্ন-প্রস্থের পূর্ণসংখ্যার প্রকারগুলি

1 নিম্নলিখিত ধরণের প্রত্যেকটি একটি পূর্ণসংখ্যার প্রকার নির্ধারণ করে যা সাধারণত দ্রুততম 268 হয়) কমপক্ষে নির্দিষ্ট প্রস্থের সমস্ত পূর্ণসংখ্যার ধরণের মধ্যে কাজ করে।

2 টাইপডিফ নামটি int_fastN_tকমপক্ষে এন এর uint_fastN_tপ্রস্থ সহ দ্রুততম স্বাক্ষরিত পূর্ণসংখ্যার প্রকারটি নির্ধারণ করে The

3 নিম্নলিখিত ধরণের প্রয়োজন:

int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t,uint_fast64_t

এই ফর্মের অন্যান্য সমস্ত ধরণের alচ্ছিক।


268) নির্ধারিত ধরণেরটি সমস্ত উদ্দেশ্যে দ্রুত হওয়ার গ্যারান্টিযুক্ত নয়; যদি প্রয়োগের অন্য ধরণের জন্য কোনও প্রকারের চয়ন করার কোনও সুস্পষ্ট ভিত্তি না থাকে তবে এটি স্বাক্ষর এবং প্রস্থের প্রয়োজনীয়তাগুলি পূরণ করে কিছু পূর্ণসংখ্যার ধরণের পছন্দ করবে।


তবে এই "দ্রুত" পূর্ণসংখ্যার ধরণ কেন দ্রুত হয় তা বলা হয়নি।

  • এই পূর্ণসংখ্যার ধরণগুলি অন্যান্য পূর্ণসংখ্যার ধরণের চেয়ে দ্রুত কেন?

আমি প্রশ্নটি সি ++ দিয়ে ট্যাগ করেছি, কারণ দ্রুত পূর্ণসংখ্যার প্রকারগুলি এর শিরোলেখ ফাইলটিতে সি ++ 17 এও পাওয়া যায় cstdint। দুর্ভাগ্যক্রমে, আইএসও / আইইসি 14882: 2017 (সি ++ 17) এ তাদের ব্যাখ্যা সম্পর্কে এমন কোনও বিভাগ নেই; আমি অন্যথায় প্রশ্নের অংশে প্রয়োগ করেছি।


তথ্য: সি তে, তারা এর শিরোনাম ফাইলটিতে ঘোষিত হয় stdint.h


24
এখানে মূল বক্তব্যটি হ'ল এই পূর্ণসংখ্যার প্রকারগুলি পৃথক নয়, যাদুগতভাবে দ্রুত প্রকারের। এই অপারেশনের জন্য যে মেশিনে সাধারণ বিদ্যমান প্রকারের তাড়াতাড়ি সবচেয়ে সাধারণ যেগুলি তার কাছে কেবলমাত্র তারা উপাধি।
mtraceur

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

1
@ রবার্টস-রেইনস্টেটমোনিকা সুনির্দিষ্টভাবে বলতে গেলে এই "এলিয়াসগুলি" কেবলমাত্র typedefবিবৃতি। সুতরাং সাধারণত , এটি স্ট্যান্ডার্ড গ্রন্থাগার পর্যায়ে করা হয়। অবশ্যই, সি মান রাখে কোনো সত্যিকারের তারা কি সীমাবদ্ধতা typedefসুতরাং উদাহরণস্বরূপ একটি টিপিক্যাল বাস্তবায়ন করা হয় - এতে int_fast32_tএকটি typedefএর intএকটি 32 বিট সিস্টেমে, কিন্তু একটি প্রকল্পিত কম্পাইলার পারে উদাহরণস্বরূপ একটি বাস্তবায়ন __int_fastস্বকীয় ধরন এবং কিছু অভিনব করতে অঙ্গীকার সেই ধরণের ভেরিয়েবলের ক্ষেত্রে কেস-বাই-কেস ভিত্তিতে দ্রুততম মেশিনের প্রকারটি চয়ন করতে অপ্টিমাইজেশন এবং তারপরে গ্রন্থাগারটি কেবল এটির পক্ষে পারে typedef
mtraceur

1
@ রবার্টস-রেইনস্টেটমোনিকা হ্যাঁ, সত্য। আপনি আর্কিটেকচার নির্দিষ্ট সংকলন পতাকা সহ সর্বাধিক পারফরম্যান্স প্রোগ্রাম পান যা বাইনারিটিকে কম পোর্টেবল করে তোলে।
পিটার - মনিকা পুনরায় ইনস্টল করুন

1
@ রবার্টস-ReinstateMonica এটা প্ল্যাটফর্ম এটিকে সংকলিত হয়েছিল সবচেয়ে বেশি কার্যকরী হবে জন্য , অগত্যা না উপর
হাবিও

উত্তর:


152

এমন একটি সিপিইউ কল্পনা করুন যা কেবলমাত্র 64 বিট গাণিতিক ক্রিয়াকলাপ সম্পাদন করে। এখন আপনি কীভাবে এই জাতীয় সিপিইউতে স্বাক্ষরবিহীন 8 বিট সংযোজনটি প্রয়োগ করবেন তা কল্পনা করুন। সঠিক ফল পেতে অগত্যা একাধিক অপারেশন জড়িত। এই জাতীয় সিপিইউতে inte৪ বিট অপারেশন অন্যান্য পূর্ণসংখ্যার প্রস্থের ক্রিয়াকলাপগুলির চেয়ে দ্রুত হয়। এই পরিস্থিতিতে, Xint_fastY_tসম্ভবত সমস্তগুলি সম্ভবত 64 বিট প্রকারের একটি উপনাম হতে পারে।

যদি কোনও সিপিইউ সংকীর্ণ পূর্ণসংখ্যার প্রকারের জন্য দ্রুত ক্রিয়াকলাপ সমর্থন করে এবং এইভাবে বৃহত্তর প্রকারটি সংকীর্ণের চেয়ে দ্রুত না হয় তবে Xint_fastY_tসমস্ত ওয়াই বিট উপস্থাপনের জন্য প্রয়োজনীয় প্রস্থের চেয়ে বৃহত্তর প্রকারের একটি উপকরণ হবে না।

কৌতূহলের বাইরে, আমি কিছু স্থাপত্যের উপর একটি নির্দিষ্ট প্রয়োগের (জিএনইউ, লিনাক্স) আকারগুলি পরীক্ষা করেছিলাম। একই আর্কিটেকচারের সমস্ত বাস্তবায়ন জুড়ে এগুলি এক নয়:

┌────╥───────────────────────────────────────────────────────────┐
 Y     sizeof(Xint_fastY_t) * CHAR_BIT                         
    ╟────────┬─────┬───────┬─────┬────────┬──────┬────────┬─────┤
     x86-64  x86  ARM64  ARM  MIPS64  MIPS  MSP430  AVR 
╞════╬════════╪═════╪═══════╪═════╪════════╪══════╪════════╪═════╡
 8   8       8    8      32   8       8     16      8   
 16  64      32   64     32   64      32    16      16  
 32  64      32   64     32   64      32    32      32  
 64  64      64   64     64   64      64    64      64  
└────╨────────┴─────┴───────┴─────┴────────┴──────┴────────┴─────┘

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


অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য টেবিলের স্ক্রিনশট:

উপরের টেবিলের স্ক্রিনশট

(অ্যান্ড্রয়েডের মনো ফন্টে বাক্স আঁকার অক্ষর নেই - রেফ )


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

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

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

11

তারা না, অন্তত নির্ভরযোগ্যভাবে না।

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

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

তবে ক্যাশে চাপের প্রতিযোগিতামূলক উদ্বেগও রয়েছে, এমনকি যদি এটি একটি ছোট মান লোড / স্টোর / প্রক্রিয়া করার জন্য আরও নির্দেশনা নেয়। এটি যদি ক্যাশে মিস করার সংখ্যা হ্রাস করে তবে ছোট মানটি আরও ভাল পারফরম্যান্স করতে পারে।

অনেকগুলি সাধারণ প্ল্যাটফর্মের ধরণের সংজ্ঞাগুলি ভাবা হয়নি বলে মনে হয়। বিশেষত, আধুনিক 64৪-বিট প্ল্যাটফর্মগুলির 32-বিট পূর্ণসংখ্যার জন্য ভাল সমর্থন থাকতে পারে, তবুও "দ্রুত" প্রকারগুলি এই প্ল্যাটফর্মগুলিতে প্রায়শই অকারণে 64-বিট হয়।

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

"দ্রুত" প্রকারগুলি উপেক্ষা করুন। আপনি যদি সত্যই পূর্ণসংখ্যার পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে সমস্ত কোডের সাথে আপনার কোডটি বেনমার্ক করুন।


7

অন্যান্য ধরণের পূর্ণসংখ্যার চেয়ে দ্রুত প্রকারগুলি দ্রুত হয় না - এগুলি আসলে কিছু "সাধারণ" পূর্ণসংখ্যার ধরণের ( একই ধরণের জন্য তারা কেবলমাত্র একটি নাম) - যেকোন ধরণের মান ধরে রাখার জন্য সবচেয়ে দ্রুততম বলে মনে হয় কমপক্ষে যে অনেক বিট।

এটি কেবল প্ল্যাটফর্ম-নির্ভর যা প্রতিটি দ্রুত টাইপ পূর্ণসংখ্যার জন্য একটি উপাধি।

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