স্ট্রিং.কন্টেনস () স্ট্রিং.ইনডেক্সঅফ () এর চেয়ে দ্রুত?


111

আমার প্রায় 2000 টি অক্ষরের স্ট্রিং বাফার রয়েছে এবং এতে যদি একটি নির্দিষ্ট স্ট্রিং থাকে তবে বাফারটি পরীক্ষা করতে হবে।
প্রতিটি ওয়েব-রিকোয়েস্টের জন্য একটি এএসপি.নেট ২.০ ওয়েব অ্যাপে চেক করবে।

স্ট্রিং.কন্টেনস পদ্ধতিটি আরও ভাল পারফর্ম করে কিনা তা কি কেউ জানেন String.IndexOf পদ্ধতি ?

    // 2000 characters in s1, search token in s2
    string s1 = "Many characters. The quick brown fox jumps over the lazy dog"; 
    string s2 = "fox";
    bool b;
    b = s1.Contains(s2);
    int i;
    i = s1.IndexOf(s2);

মজার ব্যাপার


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

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

উত্তর:


174

Containsকল IndexOf:

public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

কোন কল CompareInfo.IndexOf, যা শেষ পর্যন্ত একটি সিএলআর বাস্তবায়ন ব্যবহার করে।

আপনি যদি দেখতে চান যে সিএলআরতে স্ট্রিংগুলি কীভাবে তুলনা করা হয় তা এটি আপনাকে প্রদর্শন করবে ( কেসআইসেনসেটিভকম্পহেল্পার সন্ধান করুন )।

IndexOf(string)কোনও বিকল্প নেই এবং Contains()একটি অর্ডিনাল তুলনা ব্যবহার করে (স্মার্ট তুলনা সম্পাদনের চেষ্টা করার চেয়ে বাইট বাই বাই তুলনা, উদাহরণস্বরূপ, ই with সহ) uses

সুতরাং IndexOfসীমিতভাবে দ্রুত (তত্ত্ব) হতে হবে IndexOfএকটি স্ট্রিং সার্চ kernel32.dll থেকে FindNLSString ব্যবহার করে সোজা যায় (প্রতিফলক শক্তি!)।

.NET 4.0 এর জন্য আপডেট হয়েছে - সূচিপত্র আর অর্ডিনাল তুলনা ব্যবহার করে না এবং তাই এতে ধারণগুলি আরও দ্রুত হতে পারে। নীচে মন্তব্য দেখুন।


3
এই উত্তরটি কোথাও সঠিক কাছাকাছি, শুধু একবার দেখে এখানে নেওয়া stackoverflow.com/posts/498880/revisions জন্য ব্যাখ্যা
pzaj

55
আমার উত্তরটি 7 বছরের পুরানো এবং। নেট 2 ফ্রেমওয়ার্কের ভিত্তিতে। সংস্করণ 4 IndexOf()প্রকৃতপক্ষে ব্যবহার StringComparison.CurrentCultureএবং Contains()ব্যবহার করে StringComparison.Ordinalযা দ্রুত হবে। তবে সত্যই আমরা যে গতির পার্থক্যের কথা বলছি তা হ'ল মিনিট - বিন্দুটি হ'ল অন্যজনকে কল করে, এবং সূচকের প্রয়োজন না থাকলে কনটেন্টগুলি আরও পঠনযোগ্য। অন্য কথায় এটি সম্পর্কে চিন্তা করবেন না।
ক্রিস এস

21

সম্ভবত, এটি কিছু হবে না। কোডিং হরর এ পোস্টটি পড়ুন;): http://www.codinghorror.com/blog/archives/001218.html


4
সাহেবের কাছে চুষছি আমরা ...? : ডি আপনি যদিও ঠিক অনুরূপ, একটি http অনুরোধটি পরিবেশন করতে যে সময়ের সাথে তুলনা করা হয়েছে তার তুলনায়, একবার সংক্ষিপ্ত স্ট্রিংয়ের মাধ্যমে অনুসন্ধান করা তাত্পর্যপূর্ণ নয়।
পাখি

খুব মনোরঞ্জনযোগ্য পড়া, তবে এটি আমাকে বিরক্ত করে তার প্রাথমিক অভিযোগটি স্মৃতিশক্তি ব্যবহার, তারপরে তিনি কেবল স্ট্রিংগুলি একত্রিত করার বিভিন্ন উপায়ে ব্যয় করা সময়ের জন্য পরীক্ষা করেন।
sab669

11

ইনডেক্সফ (এস 2) এর চেয়ে কন্টেন্টগুলি (এস 2) বহুগুণ (আমার কম্পিউটারে 10 গুণ) দ্রুত হয় কারণ ধারণাগুলি স্ট্রিংক্যাম্পেরেশন ব্যবহার করে Oআরডিনাল যা সংস্কৃতি সংবেদনশীল অনুসন্ধানের চেয়ে দ্রুত যা ইনডেক্স অফ ডিফল্টরূপে করে (তবে এটি নেট। 4.0 http এ পরিবর্তিত হতে পারে) : //davesbox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx )।

ধারণাগুলির ঠিক আমার পরীক্ষায় সূচিপত্র (এস 2, স্ট্রিংকম্পারেশন.আর্ডিনাল)> 0 এর মতোই পারফরম্যান্স রয়েছে তবে এটি সংক্ষিপ্ত এবং আপনার উদ্দেশ্য পরিষ্কার করে clear


2
আরটিএম যাওয়ার আগে .NET 4.0-এ পরিবর্তনগুলি স্পষ্টতই ফিরে গিয়েছিল তাই আমি আর্টিকেলটির উপর খুব বেশি নির্ভর করি না ব্লগস.এমএসএন
স্টিফেন কেনেডি

7

আমি একটি আসল কেস চালাচ্ছি (সিনথেটিক মানদণ্ডের বিপরীতে)

 if("=,<=,=>,<>,<,>,!=,==,".IndexOf(tmps)>=0) {

বনাম

 if("=,<=,=>,<>,<,>,!=,==,".Contains(tmps)) {

এটি আমার সিস্টেমের একটি গুরুত্বপূর্ণ অংশ এবং এটি 131,953 বার কার্যকর করা হয়েছে (ধন্যবাদ ডটট্রেস)।

তবে চমকপ্রদ অবাক , ফলাফলটি প্রত্যাশিত বিপরীত

  • সূচিপত্র 533ms।
  • 266ms রয়েছে।

: - /

নেট ফ্রেমওয়ার্ক 4.0 (13-02-2012 হিসাবে আপডেট হয়েছে)


1
কারণ এর INTচেয়ে অনেক বড় BOOL, এবং IndexOf>=0আরও একটি পদক্ষেপ তৈরি করতে পারে
এরিক ইয়িন

3
আপনি'StringComparison.Ordinal' ব্যবহার করতে ভুলে গেছি
Davi Fiamenghi

6

রিফ্লেক্টর ব্যবহার করে আপনি দেখতে পাবেন যে সূচকগুলি ইনডেক্সফ ব্যবহার করে প্রয়োগ করা হয়েছে। এখানে বাস্তবায়ন।

public bool Contains(string value)
{
   return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

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


1
হ্যাঁ, তবে সূচিপত্রকে বুল হিসাবে ব্যবহার করতে হলে তাকে ফাংশনের বাইরে তুলনা করতে হবে। এটি সম্ভবত কন্টেন্টগুলির মতো একই ফলাফল দেয়, তাই না?
গঞ্জালো কুইরো

1
সম্ভবত, তবে আপনি একটি পদ্ধতি কল সংরক্ষণ করবেন না (যদি না এটি ইনলাইন করা যায় না)। আমি যেমন বলেছি, এটি সম্ভবত কখনই তাৎপর্যপূর্ণ হবে না।
ব্রায়ান রাসমুসেন

6

আপনি যদি সত্যিই আপনার কোডটিকে মাইক্রোমাইজ করতে চান তবে আপনার সেরা পন্থা সর্বদা বেঞ্চমার্কিং।

.NET কাঠামোর একটি দুর্দান্ত স্টপওয়াচ বাস্তবায়ন রয়েছে - System.Diagnostics.Shopwatch


এটি সেরা তবে আপনি যদি দ্রুত পদ্ধতির চান তবে কেবল একটি ডিবাগ সেশনে বিরতি বোতামটি টিপুন। কোড নিয়ন্ত্রণটি প্রায় 50% সময়ের ধীরতম অংশে থামতে পারে ।
জেরেমি থম্পসন

4

কিছুটা পড়া থেকে, এটি স্ট্রিং.স কনটেনস পদ্ধতিতে হুডের নীচে স্ট্রিং.ইনডেক্সঅফ কল করে appears পার্থক্যটি স্ট্রিং। কনটেনস একটি বুলিয়ান দেয় যখন স্ট্রিং I ইন্ডেক্সঅফ একটি পূর্ণসংখ্যা প্রদান করে (-1) প্রতিনিধিত্ব করে যে সাবস্ট্রিংটি পাওয়া যায় নি।

আমি 100,000 বা তাই পুনরাবৃত্তির সাথে একটি সামান্য পরীক্ষা লেখার পরামর্শ দেব এবং নিজের জন্য দেখুন। যদি আমি অনুমান করি তবে আমি বলব যে সূচিপত্রটি কিছুটা দ্রুত হতে পারে তবে আমি কেবল এটি অনুমান করে বলেছিলাম।

জেফ আতউড তার ব্লগে স্ট্রিং সম্পর্কে একটি ভাল নিবন্ধ আছে । এটি কনক্রিটেশন সম্পর্কিত আরও কিছু তবে তবুও এটি সহায়ক হতে পারে।


3

ঠিক এইভাবে আমি কিছু পরীক্ষা নিরীক্ষা করে চলেছি এবং আপনার ইনপুট স্ট্রিং সরবরাহ করা মোটামুটি বড় তবে সমান্তরাল রেজেক্স আমি খুঁজে পেয়েছি দ্রুততম সি # পদ্ধতিটি (আপনার কল্পনা করার চেয়েও বেশি একটি কোর সরবরাহ করে)

উদাহরণস্বরূপ মোট মিলের পরিমাণ পাওয়া -

needles.AsParallel ( ).Sum ( l => Regex.IsMatch ( haystack , Regex.Escape ( l ) ) ? 1 : 0 );

আশাকরি এটা সাহায্য করবে!


1
হাই ফিল্ড পৃথক থ্রেড এ টোমস্পট.না. / আর্টিকেলস / হাহোকোরাসিক.এএসপিএক্স এর সংস্করণ সহ এটি আপডেট করেছে যা আপনার কীওয়ার্ডগুলি (সূঁচ) পরিবর্তন করে না তা সরবরাহ করা খুব দ্রুত।
গ্যারি

2

এটি পরিমাপ করার জন্য জোন স্কিটের সাম্প্রতিক কালের মতো একটি মানদণ্ডের গ্রন্থাগার ব্যবহার করুন Use

ক্যাভেট এমপোটার

সমস্ত (মাইক্রো) পারফরম্যান্স প্রশ্ন হিসাবে, এটি আপনার ব্যবহার করা সফ্টওয়্যারগুলির সংস্করণগুলি, পরিদর্শন করা ডেটার বিশদ এবং কলকে ঘিরে কোডের উপর নির্ভর করে।

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


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

লিঙ্কযুক্ত লাইব্রেরি অনেকের মধ্যে একটি, এবং উত্তরের মূল খোঁচা নয়। আমি মনে করি না যে গ্রন্থাগারগুলির উত্স বা বিবরণ পোস্ট করলে উত্তর, এই সাইট বা বিশ্বের উন্নতি হবে।
ডেভিড স্মিট

3
-1; প্রশ্নটি ছিল "স্ট্রিং.কন্টেনস পদ্ধতিটি স্ট্রিংয়ের চেয়ে ভাল অভিনয় করে কিনা তা কি কেউ জানেন? - আপনার উত্তরটি হ'ল "একটি বেঞ্চমার্ক লাইব্রেরি ব্যবহার করুন", যার মূল অর্থ "আমি জানি না, এটি নিজেই করুন", "এটি নির্ভর করে" যার অর্থ "আমি জানি না", এবং "একটি চলমান সংস্করণ এবং প্রোফাইল পান" , যার অর্থ "আমি জানি না, এটি নিজে করুন"। এটি 'ঝুঁকিপূর্ণ' নয় - অনুগ্রহ করে জিজ্ঞাসা করা প্রশ্নের একটি উত্তর সরবরাহ করুন , কীভাবে ধারণাগুলি নয় - তাদের স্থান মন্তব্যগুলিতে

-7

যে কেউ এখনও এটি পড়ছেন, সূচিপত্র () সম্ভবত বেশিরভাগ এন্টারপ্রাইজ সিস্টেমে আরও ভাল পারফরম্যান্স করবে, যেমন () রয়েছে আইইয়ের সাথে সামঞ্জস্যপূর্ণ নয়!


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