এর জন্য কিছু বিবরণ / পটভূমি সম্পর্কে মন্তব্যগুলিতে অনেকগুলি (সামান্য বা সম্পূর্ণ) ভুল অনুমান হয়েছে।
আপনি গিলিবির অপ্টিমাইজড সি ফ্যালব্যাক অনুকূলিতকরণ বাস্তবায়নটির দিকে তাকিয়ে আছেন । (আইএসএগুলির জন্য যাদের হাতে লিখিত asm বাস্তবায়ন নেই) । বা সেই কোডটির একটি পুরানো সংস্করণ, যা এখনও গ্লিবসি উত্স ট্রিতে রয়েছে। https://code.woboq.org/userspace/glibc/string/strlen.c.html একটি কোড ব্রাউজার যা বর্তমান গ্লিবসি গিট ট্রি উপর ভিত্তি করে। স্পষ্টতই এটি এখনও এমআইপিএস সহ কয়েকটি মূলধারার গ্লিবসি লক্ষ্যগুলি ব্যবহার করে। (ধন্যবাদ @ জেওল)
X86 এবং এআরএম এর মতো জনপ্রিয় আইএসএ-তে, গ্লিবসি হস্ত-লিখিত এসএমটি ব্যবহার করে
সুতরাং এই কোডটি সম্পর্কে যে কোনও কিছু পরিবর্তনের উত্সাহ আপনার ভাবার চেয়ে কম।
এই বিট্যাক কোডটি ( https://ographicics.stanford.edu/~seender/bithacks.html#ZeroInWord ) আসলে আপনার সার্ভার / ডেস্কটপ / ল্যাপটপ / স্মার্টফোনে চালিত নয়। এটি নিখরচায় বাইট-এ-এ-টাইম লুপের চেয়ে ভাল, তবে আধুনিক সিপিইউগুলির জন্য দক্ষ এসএমের তুলনায় এই বিটাকটি বেশ খারাপ (বিশেষত x86 যেখানে AVX2 সিমডি একটি ঘড়ি প্রতি 32 থেকে 64 বাইটের অনুমতি দিয়ে একটি দম্পতি নির্দেশনা দিয়ে 32 বাইট চেক করতে দেয় 2 / ঘড়ি ভেক্টর লোড এবং ALU থ্রুপুট সহ আধুনিক সিপিইউগুলিতে L1d ক্যাশে ডেটা গরম থাকলে প্রধান লুপটিতে চক্র ie অর্থাত্ মাঝারি আকারের স্ট্রিংগুলির জন্য যেখানে স্টার্টআপ ওভারহেড প্রাধান্য পায় না))
গ্লিবিসি strlen
আপনার সিপিইউয়ের জন্য অনুকূল সংস্করণের সমাধানের জন্য ডায়নামিক লিঙ্কিং ট্রিকস ব্যবহার করে , তাই x86 এর মধ্যে একটি এসএসই 2 সংস্করণ (16-বাইট ভেক্টর, x86-64 এর বেসলাইন) এবং একটি এভিএক্স 2 সংস্করণ (32-বাইট ভেক্টর) রয়েছে।
x86 এর ভেক্টর এবং সাধারণ-উদ্দেশ্য রেজিস্টারগুলির মধ্যে দক্ষ ডেটা ট্রান্সফার রয়েছে, যা লুপ নিয়ন্ত্রণ ডেটা নির্ভরশীল যেখানে অন্তর্নিহিত দৈর্ঘ্যের স্ট্রিংগুলিতে সিমড ব্যবহারের জন্য এটি অনন্যভাবে (?) ভাল করে তোলে। pcmpeqb
/ pmovmskb
একবারে 16 টি পৃথক বাইট পরীক্ষা করা সম্ভব করে তোলে।
গ্লিবির অ্যাডসআইএমডি ব্যবহার করে এর মতো একটি আআরচ version৪ সংস্করণ রয়েছে এবং এআরচ CP৪ সিপিইউগুলির একটি সংস্করণ যেখানে ভেক্টর-> জিপি রেজিস্টার পাইপলাইন স্টল করে, তাই এটি আসলে এই বিট্যাকটি ব্যবহার করে না । তবে একবার হিট হয়ে গেলে বাইট-ইন-রেজিস্টার সন্ধান করতে গণনা-শীর্ষস্থানীয়-জিরো ব্যবহার করে এবং পৃষ্ঠা-ক্রসিংয়ের জন্য যাচাইয়ের পরে এআরচ's৪ এর দক্ষ অ-স্বাক্ষরিত অ্যাক্সেসগুলির সুবিধা গ্রহণ করে।
এছাড়াও সম্পর্কিত: এই কোডটি 6.5x কেন অপ্টিমাইজেশান সহ ধীর? strlen
বৃহত্তর বাফার সহ x86 এএসএম ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে হ্রাস পেতে আরও কিছু বিশদ রয়েছে এবং একটি সাধারণ এএসএম বাস্তবায়ন যা কীভাবে ইনলাইন করতে হয় তা জিসিসির পক্ষে ভাল হতে পারে। (কিছু জিসিসি সংস্করণ অজ্ঞাতসারে ইনলাইন rep scasb
যা খুব ধীর, বা 4-বাইট-এ-এ-টাইম বিট্যাক এর মতো So তাই জিসিসির ইনলাইন-স্ট্রলন রেসিপিটির আপডেট বা অক্ষম করা দরকার))
আসমের সি-স্টাইলের "অপরিজ্ঞাত আচরণ" নেই ; আপনার পছন্দ মতো মেমরির বাইটগুলি অ্যাক্সেস করা নিরাপদ এবং কোনও প্রান্তিক লোড যাতে কোনও বৈধ বাইট অন্তর্ভুক্ত করতে পারে তা দোষ দিতে পারে না। সারিবদ্ধ পৃষ্ঠাগুলি সহ স্মৃতি সুরক্ষা ঘটে; এর চেয়ে সংকীর্ণ অ্যাক্সেসগুলি পৃষ্ঠার সীমানা অতিক্রম করতে পারে না। X86 এবং x64 এ একই পৃষ্ঠার মধ্যে বাফারের শেষটি পড়া কি নিরাপদ? এই সি সি হ্যাকটি এই ফাংশনটির এককভাবে অ-ইনলাইন প্রয়োগের জন্য সংযোজকগণ তৈরি করে এমন মেশিন-কোডেও একই যুক্তি প্রযোজ্য।
যখন কোনও সংকলক অজানা নন-ইনলাইন ফাংশনটি কল করার জন্য কোডটি প্রেরণ করে, তখন ধরে নিতে হবে যে ফাংশনটি কোনও / সমস্ত গ্লোবাল ভেরিয়েবল এবং কোনও মেমরির সম্ভবত এটির একটি পয়েন্টার থাকতে পারে। উদাহরণস্বরূপ স্থানীয়দের বাদে সমস্ত কিছুই যাদের ঠিকানা পালাতে পারে নি, সমস্ত কল জুড়ে মেমরির সাথে সিঙ্কে থাকতে হবে। এটি asm এ লেখা ফাংশনগুলিতে স্পষ্টতই, তবে গ্রন্থাগারের ফাংশনেও প্রযোজ্য। আপনি যদি লিংক-সময় অপ্টিমাইজেশন সক্ষম না করে থাকেন তবে এটি পৃথক অনুবাদ ইউনিট (উত্স ফাইল )গুলিতেও প্রযোজ্য।
এটি গ্লিবসি অংশ হিসাবে নিরাপদ তবে অন্যথায় নয় ।
সর্বাধিক গুরুত্বপূর্ণ বিষয়টি হ'ল এটি strlen
অন্য কোনও কিছুর সাথে ইনলাইন করতে পারে না। এটি তার পক্ষে নিরাপদ নয়; এটিতে কঠোর-আলিয়াজিং ইউবি রয়েছে ( char
একটি মাধ্যমে ডেটা পড়া unsigned long*
)। char*
অন্য ওরফে কিছু অনুমতি দেওয়া হয় কিন্তু বিপরীত হয় না সত্য ।
এটি সামনের সময়ের সংকলিত লাইব্রেরি (গ্লিবসি) এর জন্য একটি লাইব্রেরি ফাংশন। এটি কলকারীদের সাথে লিঙ্ক-টাইম-অপ্টিমাইজেশানের সাথে মিলিত হবে না। এর অর্থ এটির একা একা থাকা সংস্করণের জন্য নিরাপদ মেশিন কোডে সংকলন করতে হবে strlen
। এটি পোর্টেবল / নিরাপদ সি হতে হবে না
জিএনইউ সি লাইব্রেরিতে কেবল জিসিসির সাথে সংকলন করতে হবে। স্পষ্টতই এটি জঞ্জাল বা আইসিসি দিয়ে সংকলন করার জন্য সমর্থিত নয় , যদিও তারা জিএনইউ এক্সটেনশানগুলিকে সমর্থন করে। জি সি সি হ'ল আগাম সংকলক যা একটি সি উত্স ফাইলটিকে মেশিন কোডের একটি অবজেক্ট ফাইলে পরিণত করে। কোনও দোভাষী না, সুতরাং এটি সংকলনের সময় ইনলাইন না করা পর্যন্ত, মেমরির বাইটগুলি মেমরিতে কেবল বাইট হয়। অর্থাত্ কড়া-আলিয়াজিং ইউবি বিপজ্জনক নয় যখন বিভিন্ন ধরণের অ্যাক্সেসগুলি বিভিন্ন ফাংশনে ঘটে যা একে অপরের সাথে ইনলাইন করে না।
মনে রাখবেন যে strlen
এর আচরণটি আইএসও সি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়েছে । এই ফাংশনটির নামটি বাস্তবায়নের অংশ । জিসিসি মত কম্পাইলার এমনকি একটি বিল্ট-ইন ফাংশন যদি না আপনি ব্যবহার নাম চিকিত্সা -fno-builtin-strlen
, তাই strlen("foo")
একটি কম্পাইল-টাইম ধ্রুবক হতে পারে 3
। গ্রন্থাগারের সংজ্ঞাটি কেবল তখনই ব্যবহৃত হয় যখন জিসিসি তার নিজস্ব রেসিপি বা কোনও কিছু অন্তর্ভুক্ত না করে পরিবর্তে কোনও কলটি প্রেরণ করার সিদ্ধান্ত নেয়।
সংকলনের সময় ইউবি যখন সংকলকের কাছে দৃশ্যমান নয় , আপনি স্যান মেশিন কোড পান। মেশিন কোডটি নো-ইউবি মামলার জন্য কাজ করতে হবে এবং আপনি চাইলেও , এসএমের পক্ষে পয়েন্ট-টু মেমোরিতে কলকারী কীভাবে ডেটা ব্যবহার করতেন তা সনাক্ত করার উপায় নেই।
গ্লিবসি একটি স্ট্যান্ড-একা স্ট্যাটিক বা গতিশীল লাইব্রেরিতে সংকলিত হয়েছে যা লিঙ্ক-টাইম অপ্টিমাইজেশানের সাথে ইনলাইন করতে পারে না। গ্লিবিসি-র বিল্ড স্ক্রিপ্টগুলি কোনও প্রোগ্রামের অভ্যন্তরে প্রবেশের সময় লিঙ্ক-টাইম অপ্টিমাইজেশনের জন্য মেশিন কোড + জিসিসি জিমপ্লে অভ্যন্তরীণ উপস্থাপনাযুক্ত "ফ্যাট" স্ট্যাটিক লাইব্রেরি তৈরি করে না। (অর্থাত্ মূল প্রোগ্রামে লিঙ্ক-টাইম অপ্টিমাইজেশনে libc.a
অংশ নেবে না -flto
)) গ্লিবিসি তৈরি করা সেই লক্ষ্যে প্রকৃতপক্ষে.c
নিরাপদ হবে যা প্রকৃতপক্ষে এটি ব্যবহার করে ।
আসলে @zwol মন্তব্য হিসাবে, গ্লিবিসি নিজেই তৈরি করার সময় এলটিও ব্যবহার করা যাবে না , কারণ "ব্রিটল" কোডটির কারণে এটি যদি ভঙ্গ করতে পারে যদি গ্লিবিক উত্স ফাইলগুলির মধ্যে ইনলাইনিং করা সম্ভব হত। (কিছু অভ্যন্তরীণ ব্যবহার রয়েছে strlen
, উদাহরণস্বরূপ সম্ভবত printf
বাস্তবায়নের অংশ হিসাবে )
এটি strlen
কিছু অনুমান করে:
CHAR_BIT
8 এর একাধিক । সমস্ত জিএনইউ সিস্টেমে সত্য। পজিক্স 2001 এমনকি গ্যারান্টি দেয় CHAR_BIT == 8
। (এটি কিছু ডিএসপির মতো CHAR_BIT= 16
বা এর জন্য সিস্টেমগুলির জন্য নিরাপদ বলে মনে হয় 32
; স্বাক্ষরবিহীন-প্রলুগ লুপটি সর্বদা 0 পুনরাবৃত্তি চলবে যদি sizeof(long) = sizeof(char) = 1
প্রতিটি পয়েন্টার সর্বদা সারিবদ্ধ থাকে এবং p & sizeof(long)-1
সর্বদা শূন্য থাকে)) তবে আপনার যদি অ-ASCII অক্ষর সেট থাকে যেখানে অক্ষর 9 হয় বা 12 বিট প্রশস্ত, 0x8080...
এটি ভুল প্যাটার্ন।
- (সম্ভবত)
unsigned long
4 বা 8 বাইট হয়। অথবা সম্ভবত এটি unsigned long
8 টি পর্যন্ত কোনও আকারের জন্য কাজ করবে এবং এটি এটির assert()
জন্য একটি ব্যবহার করে।
এই দুটি সম্ভাব্য ইউবি নয়, তারা কিছু সি বাস্তবায়নের কেবল অ-বহনযোগ্যতা। এই কোডটি প্ল্যাটফর্মগুলিতে যেখানে এটি কাজ করে সেখানে সি প্রয়োগের অংশ (বা ছিল) , সুতরাং এটি ঠিক।
পরবর্তী অনুমানটি সম্ভাব্য সি ইউবি:
- কোনও প্রান্তিক লোড যাতে কোনও বৈধ বাইট থাকে তা দোষ দিতে পারে না , এবং যতক্ষণ না আপনি প্রকৃতপক্ষে অবজেক্টের বাইরের বাইটগুলি উপেক্ষা করবেন ততক্ষণ নিরাপদ থাকে। (প্রতিটি জিএনইউ সিস্টেমে সত্য হিসাবে সত্য, এবং সমস্ত সাধারণ সিপিইউতে সত্য যেহেতু মেমরি সুরক্ষা প্রান্তিকৃত পৃষ্ঠার গ্রানুলারিটির সাথে ঘটে x একই পৃষ্ঠায় x86 এবং x64 এর মধ্যে কোনও বাফারের শেষে পড়া কি নিরাপদ ? সিবিতে সুরক্ষিত থাকলে নিরাপদ ? সংকলনের সময় দৃশ্যমান নয় in ইনলাইনিং ব্যতীত এখানেই এটি। সংকলক প্রমাণ করতে পারে না যে প্রথমটি পড়া শেষ
0
ইউবি; এটি উদাহরণস্বরূপ একটি সি char[]
অ্যারে হতে পারে {1,2,0,3}
)
এই শেষ পয়েন্টটি এখানে কোন সি এর অবজেক্টের শেষে পড়া নিরাপদ করে তোলে। বর্তমান সংকলকগুলির সাথে সন্নিবেশ করা সত্ত্বেও এটি বেশ নিরাপদ কারণ আমি মনে করি তারা বর্তমানে কার্যকর করে না যে মৃত্যুদন্ড কার্যকর করার পথটি বোঝা যায় না। তবে যাইহোক, আপনি যদি কখনও এই ইনলাইনটি ছেড়ে দেন তবে কঠোর আলিয়াজিং ইতিমধ্যে শোস্টোপার।
তারপরে আপনার লিনাক্স কার্নেলের পুরানো অনিরাপদ memcpy
সিপিপি ম্যাক্রোর মতো সমস্যা রয়েছে যা পয়েন্টার-কাস্টিং unsigned long
( জিসিসি, স্ট্রাইক-এলিয়াসিং এবং হরর স্টোরিস ) ব্যবহার করে।
এটি strlen
সেই যুগে ফিরে আসে যখন আপনি সাধারণভাবে এই জাতীয় জিনিসগুলি নিয়ে পালিয়ে যেতে পারতেন ; এটি জিসিসি 3 এর আগে "কেবলমাত্র ইনলাইনিং না করলে" ক্যাভ্যাট ব্যতীত বেশ সুরক্ষিত থাকত।
কল / রিট সীমানা জুড়ে যখন কেবল ইউবি প্রদর্শিত হয় তা আমাদের ক্ষতি করতে পারে না। (উদাহরণস্বরূপ এটিকে কাস্ট করার char buf[]
জন্য একটি অ্যারের পরিবর্তে কল করা )। একবার মেশিনের কোডটি পাথরে সেট হয়ে গেলে এটি কেবল মেমরিতে বাইটগুলি নিয়ে কাজ করে। একটি অন-ইনলাইন ফাংশন কলকে ধরে নিতে হবে যে কলি কোনও / সমস্ত মেমরি পড়ে।unsigned long[]
const char*
কঠোর-এলিয়জিং ইউবি ছাড়াই এটি নিরাপদে লেখা ing
জিসিসি টাইপ অ্যাট্রিবিউটmay_alias
একটি টাইপ হিসাবে একই ওরফে-কিছু চিকিত্সা দেয় char*
। (@ কনরাডবোরভস্ক প্রস্তাবিত)। জিসিসির শিরোনামগুলি বর্তমানে x86 সিমডি ভেক্টর প্রকারের জন্য এটি ব্যবহার করে __m128i
যাতে আপনি সর্বদা নিরাপদে করতে পারেন _mm_loadu_si128( (__m128i*)foo )
। (দেখুন কি হার্ডওয়্যার ভেক্টর পয়েন্টার এবং এটির সাথে সম্পর্কিত টাইপটি একটি অপরিজ্ঞাত আচরণের মধ্যে `পুনরায় ব্যাখ্যা_কাস্টিং হয়? এটি কী বোঝায় এবং এর অর্থ কী না সে সম্পর্কে আরও তথ্যের জন্য))
strlen(const char *char_ptr)
{
typedef unsigned long __attribute__((may_alias)) aliasing_ulong;
aliasing_ulong *longword_ptr = (aliasing_ulong *)char_ptr;
for (;;) {
unsigned long ulong = *longword_ptr++; // can safely alias anything
...
}
}
আপনি এর aligned(1)
সাথে কোনও প্রকারটি প্রকাশ করতেও ব্যবহার করতে পারেন alignof(T) = 1
।
typedef unsigned long __attribute__((may_alias, aligned(1))) unaligned_aliasing_ulong;
আইএসওতে এলিয়াসিং লোড প্রকাশ করার একটি বহনযোগ্য উপায় রয়েছেmemcpy
, যা আধুনিক সংকলকরা জানেন যে কীভাবে একক লোড নির্দেশ হিসাবে ইনলাইন করতে হয়। যেমন
unsigned long longword;
memcpy(&longword, char_ptr, sizeof(longword));
char_ptr += sizeof(longword);
এটি স্বাক্ষরবিহীন লোডগুলির জন্যও কাজ করে কারণ এক সময় অ্যাক্সেস memcpy
বাই বাই char
-অ্যাক্সেস হিসাবে কাজ করে। তবে অনুশীলনে আধুনিক সংকলকগণ memcpy
খুব ভালভাবে বুঝতে পারেন ।
এখানে বিপদটি হ'ল যদি জিসিসি নিশ্চিতভাবে জানত না যে char_ptr
এটি শব্দ-সংযুক্ত রয়েছে, তবে এটি এটিকে কিছু প্ল্যাটফর্মগুলিতে ইনলাইন করবে না যেগুলি asm এ স্বাক্ষরযুক্ত লোডগুলিকে সমর্থন করবে না। উদাহরণস্বরূপ, এমআইপিএস 64 আর r এর আগে এমআইপিএস বা তার থেকেও পুরানো এআরএম। আপনি যদি memcpy
কেবল একটি শব্দ লোড করার জন্য একটি প্রকৃত ফাংশন কল পেয়ে থাকেন (এবং এটি অন্য স্মৃতিতে রেখে যান) তবে এটি একটি বিপর্যয় হবে। কোড কখন পয়েন্টার সারিবদ্ধ করে জিসিসি কখনও কখনও দেখতে পারে। বা চার-এ-এ-টাইম লুপের পরে যা আপনি ব্যবহার করতে পারেন এমন একটি সীমান্ত সীমানায় পৌঁছে যায়
p = __builtin_assume_aligned(p, sizeof(unsigned long));
এটি পঠিত-অতীত-অবজেক্টটিকে সম্ভাব্য ইউবি এড়াতে পারে না, তবে বর্তমান জিসিসির সাথে এটি কার্যকরভাবে বিপজ্জনক নয়।
কেন হ্যান্ড-অপ্টিমাইজড সি উত্স প্রয়োজনীয়: বর্তমান সংকলকগুলি যথেষ্ট ভাল নয়
যখন আপনি বহুল ব্যবহৃত-স্ট্যান্ডার্ড লাইব্রেরি ফাংশনটির জন্য প্রতিবারের ড্রপ কর্মক্ষমতা চান তখন হ্যান্ড-অপ্টিমাইজড এ্যাসটি আরও ভাল হতে পারে। বিশেষত যেমন কিছু জন্য memcpy
, কিন্তু strlen
। সেক্ষেত্রে এসএসই 2 এর সুবিধা নেওয়ার জন্য x86 ইন্টারনসনিক সহ সি ব্যবহার করা খুব সহজ হবে না।
তবে এখানে আমরা কেবল আইএসএ-নির্দিষ্ট বৈশিষ্ট্য ছাড়াই একটি নিষ্পাপ বনাম বিট্যাক সি সংস্করণ সম্পর্কে কথা বলছি।
(আমি মনে করি যে আমরা এটি একটি প্রদত্ত হিসাবে গ্রহণ করতে পারি যা strlen
এটি যথেষ্ট পরিমাণে ব্যবহৃত হয়েছে যে এটি যত দ্রুত সম্ভব চালানো গুরুত্বপূর্ণ। তাই প্রশ্নটি উত্সব হয়ে যায় যে আমরা সহজ উত্স থেকে দক্ষ মেশিন কোড পেতে পারি কিনা No না, আমরা পারব না))
বর্তমান জিসিসি এবং ক্ল্যাং স্বয়ংক্রিয়-ভেক্টরাইজিং লুপগুলিতে সক্ষম নয় যেখানে পুনরাবৃত্তির গণনা প্রথম পুনরাবৃত্তির আগে জানা যায় না । (উদাহরণস্বরূপ , প্রথম পুনরাবৃত্তিটি চালানোর আগে লুপটি কমপক্ষে ১ run টি পুনরাবৃত্তি চলবে কিনা তা খতিয়ে দেখতে হবে) উদাহরণস্বরূপ অটোভেস্টোরাইজিং মেমকিপি সম্ভব (স্পষ্ট দৈর্ঘ্যের বাফার) তবে স্ট্রাইক বা স্ট্রেন (অন্তর্নিহিত দৈর্ঘ্যের স্ট্রিং) নয়, বর্তমান কম্পাইলার।
এর মধ্যে অনুসন্ধানের লুপগুলি, বা কোনও ডেটা নির্ভর নির্ভর অন্য কোনও লুপ অন্তর্ভুক্ত রয়েছে if()break
।
আইসিসি (x86 এর জন্য ইন্টেলের সংকলক) কিছু অনুসন্ধান লুপগুলি স্বয়ংক্রিয়ভাবে ভেক্টরাইজ করতে পারে, তবে এখনও কেবল strlen
ওপেনবিএসডি-র লাইবসি ব্যবহারের মতো একটি সরল / নিষ্পাপ সি এর জন্য নির্দোষ বাইট-এ-এ-টাইম এসএম তৈরি করে। ( গডবোল্ট ) ( @ পেসকের উত্তর থেকে )।
strlen
বর্তমান সংকলকগুলির সাথে পারফরম্যান্সের জন্য একটি হ্যান্ড-অপ্টিমাইজড libc প্রয়োজনীয় । একবারে 1 বাইটে যাওয়া (প্রশস্ত সুপারসকলার সিপিইউগুলিতে চক্র প্রতি 2 বাইট আনারোলিং সহ) করুণ হয়ে উঠতে পারে যখন প্রধান মেমরিটি প্রতি চক্রের প্রায় 8 বাইট রাখতে পারে এবং L1d ক্যাশে প্রতি চক্র 16 থেকে 64 সরবরাহ করতে পারে। (হাসওয়েল এবং রাইজেনের পর থেকে আধুনিক মূলধারার x86 সিপিইউগুলিতে চক্রের জন্য 2x 32-বাইট লোড যদিও 256-বিট ভেক্টর সহ, AVX512VL + BW মুখোশযুক্ত একটি মাস্কের সাথে তুলনা করে ktest
বা এর উওস / পুনরাবৃত্তি হ্রাস করে আরও হাইপারথ্রেডিং বন্ধুত্বপূর্ণ kortest
করতে পারে strlen
))
আমি এখানে নন- x86 অন্তর্ভুক্ত করছি, এটি "16 বাইট"। উদাহরণস্বরূপ বেশিরভাগ আআরচ 64৪ সিপিইউ কমপক্ষে এটি করতে পারে, আমার ধারণা, এবং আরও কিছু অবশ্যই। এবং কিছু strlen
লোড ব্যান্ডউইথ সঙ্গে রাখা জন্য যথেষ্ট এক্সিকিউশন থ্রুটপুট আছে ।
অবশ্যই যে প্রোগ্রামগুলি বড় স্ট্রিংগুলির সাথে কাজ করে তাদের সাধারণত দৈর্ঘ্যের সি স্ট্রিংগুলির দৈর্ঘ্যটি প্রায়শই পুনরায় করা এড়াতে দৈর্ঘ্যের উপর নজর রাখতে হবে। তবে স্বল্প থেকে মাঝারি দৈর্ঘ্যের পারফরম্যান্সটি এখনও হাতে লিখিত প্রয়োগগুলি থেকে উপকৃত হয়েছে এবং আমি নিশ্চিত যে কিছু প্রোগ্রাম মাঝারি দৈর্ঘ্যের স্ট্রিংগুলিতে স্ট্রেন ব্যবহার করে শেষ হয়।