কোন পদ্ধতিটি স্ট্রাস্টার বা স্ট্রপসকে প্রাধান্য দেওয়া হয়?


84

আমি লক্ষ্য করেছি যে প্রচুর বিকাশকারী স্ট্রাস্টার এবং স্ট্রপোস উভয়ই স্ট্রস্ট্রিংয়ের অস্তিত্বের জন্য ব্যবহার করছেন। তাদের মধ্যে একটি পছন্দ হয় এবং কেন?


4
আপনি যে মানদণ্ডটি উল্লেখ করেছেন তা হ'ল সাবস্ট্রাস্টারের তুলনায়
ফ্লাস্ক

উত্তর:


126

পিএইচপি অনলাইন ম্যানুয়াল থেকে :

যদি আপনি কেবল এটি নির্ধারণ করতে চান যে খড়ের খোলের মধ্যে কোনও নির্দিষ্ট সূচি ঘটে কিনা, strpos() পরিবর্তে দ্রুত এবং কম মেমরি নিবিড় ফাংশনটি ব্যবহার করুন।


13
+1, আপনি স্ট্রপোস বা স্ট্রিপস ব্যবহার করতে পারেন। এবং === মিথ্যা ব্যবহার সম্পর্কে php ডকটিতে সতর্কতাগুলি পরীক্ষা করতে ভুলবেন না;
ফেডমিচ

7
ফেডমিচের মন্তব্যটি বিস্তারিতভাবে জানাতে: আমি সর্বদা ব্যবহার করি if(strpos($haystack,$needle) !== false) { // do something }, কখনই না if(strpos($haystack,$needle)) { // do bad things }strposযদি 0 $needleএর একেবারে শুরুতে হয় $haystackএবং 0টিকে মিথ্যা হিসাবে সমান গণ্য করা হয় তবে 0 প্রদান করবে। (0 == false)সত্য মূল্যায়ন। (0 === false)মিথ্যা যাও মূল্যায়ন।
বাটল বাটকাস

4
C থেকে আসছে মানুষ ব্যবহার সম্পর্কে মনে হতে পারে strchr ফাংশন, কিন্তু পিএইচপি এটি আসলে একটি ওরফে এর strstr , তাই strpos একটি উন্নততর পছন্দ।
e2-e4

38

এখানে কিছু অন্যান্য উত্তর (+ + benchmarks) আমি আমার প্রশ্নের, যা পেয়েছিলাম হয় প্রায় একই (আমি যখন জিজ্ঞাসা পুলিশের বুঝতে পারছি না)।


এরই মধ্যে আমি আমার নিজের বেঞ্চমার্ক পরীক্ষা, যা আমি প্রতিটি প্রাসঙ্গিক কাজকর্মের জন্য 1000000 বার দৌড়ে তৈরি ( strstr(), strpos(), stristr()এবং stripos())।
কোডটি এখানে:

<?php

function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$mystring = 'blahblahblah';  
$findme = 'bla';  

echo 'strstr & strpos TEST:<pre>';
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strstr($mystring, $findme);
$time_needed_strstr = getmicrotime() - $time_start;
echo 'strstr():            ',
    round( $time_needed_strstr , 8 ). PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stristr($mystring, $findme);
$time_needed_stristr = getmicrotime() - $time_start;
echo 'stristr():           ',
    round( $time_needed_stristr , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false;
$time_needed_strpos = getmicrotime() - $time_start;
echo 'strpos() !== false:  ',
    round( $time_needed_strpos , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false;
$time_needed_stripos = getmicrotime() - $time_start;
echo 'stripos() !== false: ',
    round( $time_needed_stripos , 8 ) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_stristr - time_needed_strstr: ',
     round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL;
echo 'time_needed_stripos - time_needed_strpos: ',
     round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_strstr  - time_needed_strpos:  ',
     round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL;
echo 'time_needed_stristr - time_needed_stripos: ',
     round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;

echo '</pre>';

?>

এবং এখানে প্রথম আউটপুট, যা দেখায় যে strpos()এটি বিজয়ী :

strstr & strpos TEST:
strstr():            2.39144707
stristr():           3.65685797
strpos() !== false:  2.39055395
stripos() !== false: 3.54681897

time_needed_stristr - time_needed_strstr: 1.2654109
time_needed_stripos - time_needed_strpos: 1.15626502

time_needed_strstr  - time_needed_strpos:  0.00089312
time_needed_stristr - time_needed_stripos: 0.110039 

পরেরটি প্রথম আউটপুটটির মতো ( strpos()আবার বিজয়ী):

strstr & strpos TEST:
strstr():            2.39969015
stristr():           3.60772395
strpos() !== false:  2.38610101
stripos() !== false: 3.34951186

time_needed_stristr - time_needed_strstr: 1.2080338
time_needed_stripos - time_needed_strpos: 0.96341085

time_needed_strstr  - time_needed_strpos:  0.01358914
time_needed_stristr - time_needed_stripos: 0.25821209

নীচে অন্যটি রয়েছে যা আরও আকর্ষণীয়, কারণ এই ক্ষেত্রে, strstr()বিজয়ী:

strstr & strpos TEST:
strstr():            2.35499191
stristr():           3.60589004
strpos() !== false:  2.37646604
stripos() !== false: 3.51773095

time_needed_stristr - time_needed_strstr: 1.25089812
time_needed_stripos - time_needed_strpos: 1.14126492

time_needed_strstr  - time_needed_strpos:  -0.02147412
time_needed_stristr - time_needed_stripos: 0.08815908

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

তবে আমি মনে করি বেশিরভাগ ক্ষেত্রেইstrpos() তুলনায় বিজয়ীstrstr()

আমি আশা করি এই পরীক্ষাটি কারও জন্য কার্যকর ছিল।


4
যদিও এই মানদণ্ডটি ব্যবহারযোগ্য, এটি মেমরির খরচ পরিমাপ করে না, কেবিটেস বা এমবিটেসের মতো লম্বা স্ট্রিংগুলিও গ্রহণ করে না।

হাহ? @ ব্যবহারকারী 133408 দীর্ঘ স্ট্রিং এবং বৃহত্তর বাইট স্ট্রিংগুলি আরও বেশি সময় নিতে পারে।
নিকক নিউম্যান

7

অনেক ডেভেলপার ব্যবহার strposজন্য মাইক্রো অপ্টিমাইজেশান উদ্দেশ্যে।

ব্যবহারগুলি strstrকেবল তখনই কাজ করে যদি ফলসুল্য স্ট্রিংটিকে বুলিয়ান প্রসঙ্গে মিথ্যা হিসাবে ব্যাখ্যা করা যায় না।


11
এটি মাইক্রো অপ্টিমাইজেশন নয়, এটিকে কাজের জন্য সঠিক ফাংশন ব্যবহার করে বলা হয় । আমি যদি স্ট্রিংয়ের অবস্থানটি চাই, আমি কল করি strpos()। আমি যদি এই অবস্থানের পরে সাবস্ট্রিং চাই, আমি কল করি strstr()
Alnitak

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

4
@ মারিও কিন্তু এমন কোনও কার্য নেই যাঁর একমাত্র উদ্দেশ্য একটি স্ট্রিং রয়েছে কিনা তা যাচাই করে। অবস্থান সাবস্ট্রিং (যদি পাওয়া যায়) মুক্ত তথ্য একবার আপনি আসলে এটি পাওয়া করেছি। OTOH, strstrনা আরো তুলনায় প্রয়োজন বোধ করা হয়, যার কারণে এটি ধীর আছে।
Alnitak

@ অলনিটক: মনে আছে, খবর নয়। পারফরম্যান্সের পার্থক্য এবং কেবলমাত্র তা দেখিয়ে দেওয়ার বিষয়ে আপনি খুব অবিচল মনে হয়। এটি মাইক্রো অপ্টিমাইজেশনের একটি টেল টেল চিহ্ন। এটি প্রোফাইলারটিতে কোনও ঝাপটায় না । যেখানে এটি কোনও পার্থক্য তৈরি করে তা কোড পঠনযোগ্যতা।
মারিও

@ মারিও আসলে আমি পারফরম্যান্স সম্পর্কে খুব সামান্য যত্ন নেব। আমি কাজের জন্য সঠিক ফাংশনটি ব্যবহার করার বিষয়ে খুব যত্ন নিচ্ছি ;-)
অ্যালনিটাক

0

স্ট্রপোজ () খড়ের খণ্ডে একটি নির্দিষ্ট সূঁচ কোথায় রয়েছে তা সনাক্ত করে। স্ট্রাইস্টার () সূঁচটি খড়ের ছিটে থাকা কোথাও রয়েছে কিনা তা পরীক্ষা করে

তার জন্য স্ট্রপোজ () দ্রুত এবং কম মেমরি গ্রহণ করে

স্ট্রাস্টারের () কারণ: আপনার সূঁচটি যদি কোনও স্ট্রিংয়ের শুরুতে থাকে, স্ট্রপোজ 0 দেয় (তাই এটি === মিথ্যা দিয়ে পরীক্ষা করতে হবে)


6
এটি সম্পূর্ণ জালিয়াতি ব্যাখ্যা - strstr()সুইয়ের আগে বা পরে সমস্ত কিছু ফিরিয়ে দেয়, তাই প্রথমে এর সমতুল্য করতে হবে strpos() এবং তারপরে সেই স্ট্রিং তৈরি করতে হবে । সেখানেই পারফরম্যান্স হিট।
Alnitak

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