পিএইচপি ব্যবহার করে, এভাবে স্ট্রিং রূপান্তর করার দ্রুততম "123"
উপায়টি কী : একটি পূর্ণসংখ্যায়?
কেন সেই বিশেষ পদ্ধতিটি দ্রুত? এটি অপ্রত্যাশিত ইনপুট, যেমন "hello"
বা একটি অ্যারে পেলে কী ঘটে ?
(int)
এবং intval()
400% এরও বেশি হতে পারে!
পিএইচপি ব্যবহার করে, এভাবে স্ট্রিং রূপান্তর করার দ্রুততম "123"
উপায়টি কী : একটি পূর্ণসংখ্যায়?
কেন সেই বিশেষ পদ্ধতিটি দ্রুত? এটি অপ্রত্যাশিত ইনপুট, যেমন "hello"
বা একটি অ্যারে পেলে কী ঘটে ?
(int)
এবং intval()
400% এরও বেশি হতে পারে!
উত্তর:
আমি একটি দ্রুত বেঞ্চমার্কিং অনুশীলন স্থাপন করেছি:
Function time to run 1 million iterations
--------------------------------------------
(int) "123": 0.55029
intval("123"): 1.0115 (183%)
(int) "0": 0.42461
intval("0"): 0.95683 (225%)
(int) int: 0.1502
intval(int): 0.65716 (438%)
(int) array("a", "b"): 0.91264
intval(array("a", "b")): 1.47681 (162%)
(int) "hello": 0.42208
intval("hello"): 0.93678 (222%)
গড়ে, কল করা অবধি () আড়াইগুণ ধীর হয় এবং আপনার ইনপুটটি ইতিমধ্যে একটি পূর্ণসংখ্যা হলে পার্থক্য সবচেয়ে বেশি।
আমি কেন আগ্রহী তা জানতে আগ্রহী ।
আপডেট: আমি আবারও জোর করে পরীক্ষা চালিয়েছি (0 + $var)
| INPUT ($x) | (int) $x |intval($x) | 0 + $x |
|-----------------|------------|-----------|-----------|
| "123" | 0.51541 | 0.96924 | 0.33828 |
| "0" | 0.42723 | 0.97418 | 0.31353 |
| 123 | 0.15011 | 0.61690 | 0.15452 |
| array("a", "b") | 0.8893 | 1.45109 | err! |
| "hello" | 0.42618 | 0.88803 | 0.1691 |
|-----------------|------------|-----------|-----------|
সংযোজন: আমি কিছুটা অপ্রত্যাশিত আচরণের মুখোমুখি হয়েছি যা সম্পর্কে এই পদ্ধতিগুলির মধ্যে একটি নির্বাচন করার সময় আপনার সচেতন হওয়া উচিত:
$x = "11";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11)
$x = "0x11";
(int) $x; // int(0)
intval($x); // int(0)
$x + 0; // int(17) !
$x = "011";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11) (not 9)
পিএইচপি 5.3.1 ব্যবহার করে পরীক্ষিত
+"15" == 15
(int)
এবং intval
, এবং প্রতিটি জোড়ায়, উপর একটি% দেয় intval
, বেস কেস হওয়া আবশ্যক (int)
। তবে আপনার একটি ভাল বক্তব্য আছে যে তিনি যদি স্পষ্টভাবে বলেন তবে বিশেষত যেহেতু তিনি পরে তৃতীয় কেস যুক্ত করেছিলেন তা পরিষ্কার হয়ে যেত!
আমি ব্যক্তিগতভাবে মনে করি castালাই সবচেয়ে সুন্দর।
$iSomeVar = (int) $sSomeOtherVar;
'হ্যালো' এর মতো একটি স্ট্রিং যদি প্রেরণ করা হয় তবে এটি পূর্ণসংখ্যা 0 এ castালবে ''২২ বছর বয়সী' এর মতো স্ট্রিংয়ের জন্য এটি পূর্ণসংখ্যার ২২ এ কাস্ট করা হবে Any
আপনি যদি সত্যিই গতিটির প্রয়োজন হয় তবে আমার ধারণা এখানে অন্যান্য পরামর্শগুলি জোর করে দ্রুততম ধরা অনুমানের ক্ষেত্রে সঠিক।
একটি পরীক্ষা চালান।
string coerce: 7.42296099663
string cast: 8.05654597282
string fail coerce: 7.14159703255
string fail cast: 7.87444186211
এটি একটি পরীক্ষা যা প্রতিটি দৃশ্যের 10,000,000 বার চালিত। :-)
সহকর্ম হয় 0 + "123"
কাস্টিং হয় (integer)"123"
আমি মনে করি কো-ইরসিওন একটি সামান্য বিট দ্রুত। ওহ, এবং চেষ্টা 0 + array('123')
করা পিএইচপি-তে মারাত্মক ত্রুটি। আপনি আপনার কোডটি সরবরাহ করা মানের ধরণের চেক করতে চান।
আমার পরীক্ষার কোডটি নীচে।
function test_string_coerce($s) {
return 0 + $s;
}
function test_string_cast($s) {
return (integer)$s;
}
$iter = 10000000;
print "-- running each text $iter times.\n";
// string co-erce
$string_coerce = new Timer;
$string_coerce->Start();
print "String Coerce test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce('123');
}
$string_coerce->Stop();
// string cast
$string_cast = new Timer;
$string_cast->Start();
print "String Cast test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast('123');
}
$string_cast->Stop();
// string co-erce fail.
$string_coerce_fail = new Timer;
$string_coerce_fail->Start();
print "String Coerce fail test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce('hello');
}
$string_coerce_fail->Stop();
// string cast fail
$string_cast_fail = new Timer;
$string_cast_fail->Start();
print "String Cast fail test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast('hello');
}
$string_cast_fail->Stop();
// -----------------
print "\n";
print "string coerce: ".$string_coerce->Elapsed()."\n";
print "string cast: ".$string_cast->Elapsed()."\n";
print "string fail coerce: ".$string_coerce_fail->Elapsed()."\n";
print "string fail cast: ".$string_cast_fail->Elapsed()."\n";
class Timer {
var $ticking = null;
var $started_at = false;
var $elapsed = 0;
function Timer() {
$this->ticking = null;
}
function Start() {
$this->ticking = true;
$this->started_at = microtime(TRUE);
}
function Stop() {
if( $this->ticking )
$this->elapsed = microtime(TRUE) - $this->started_at;
$this->ticking = false;
}
function Elapsed() {
switch( $this->ticking ) {
case true: return "Still Running";
case false: return $this->elapsed;
case null: return "Not Started";
}
}
}
settype
এই পরীক্ষায় যোগ করেছি এবং পিএইচপি 7 ব্যবহার করে এটি চালিয়েছি Cast কাস্ট সামান্য সামনে এসেছিল এবং সবার উপরে একটি বড় পারফরম্যান্স উন্নতি হয়েছে: স্ট্রিং জবরদস্তি: 1.9255340099335 স্ট্রিং কাস্ট: 1.5142338275909 স্ট্রিং সেট টাইপ: 4.149735212326 স্ট্রিং ব্যর্থ জোর: 1.2346560955048 স্ট্রিং ব্যর্থ কাস্ট: 1.3967711925507 স্ট্রিং সেট টাইপ: 4.149735212326
আপনি সহজেই ফ্লোট ব্যবহার করে দীর্ঘ স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করতে পারেন
$float = (float)$num;
অথবা আপনি যদি পূর্ণসংখ্যারকে ভাসমান ভ্যাল না চান তবে সাথে যান
$float = (int)$num;
প্রাক্তন জন্য।
(int) "1212.3" = 1212
(float) "1212.3" = 1212.3
(int)
? এটি সত্য হতে পারে যদি স্ট্রিংটিতে একটি পূর্ণসংখ্যা থাকে, এটি (float)
একটি মান প্রদান করে যা অনেকগুলি পূর্ণসংখ্যার মতো কাজ করে (যদিও এর অভ্যন্তরীণ প্রকারটি সম্ভবত float
) তবে আপনি কেন এটি করবেন যদি স্পেসিফিকেশনটি একটি পূর্ণসংখ্য মান ফেরত দেয় ? মনে করুন আগত স্ট্রিংটি "1.3"? আপনি পূর্ণসংখ্যা পাবেন না। এছাড়াও, ভবিষ্যতে কোডটি যে কারও পক্ষে পড়ার পক্ষে, আপনি যা বোঝাতে চেয়েছেন তা আপনার উচিত। যদি আপনার অর্থ "এটি একটি পূর্ণসংখ্যা হওয়া উচিত", তবে বলুন (int)
, না (float)
।
$int = settype("100", "integer"); //convert the numeric string to int
যেকোন স্ট্রিং থেকে পূর্ণসংখ্যার নিষ্কাশন
$ ইন = 'tel.123-12-33';
preg_match_all('!\d+!', $in, $matches);
$out = (int)implode('', $matches[0]);
// $ আউট = '1231233';
আরও অ্যাড-হক বেঞ্চমার্ক ফলাফল:
$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i = (integer) "-11";}'
real 2m10.397s
user 2m10.220s
sys 0m0.025s
$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i += "-11";}'
real 2m1.724s
user 2m1.635s
sys 0m0.009s
$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i = + "-11";}'
real 1m21.000s
user 1m20.964s
sys 0m0.007s
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
। আক্ষরিক মানটি "-11"
সরাসরি ব্যবহার করাও ঝুঁকিপূর্ণ , আপনি যদি নিশ্চিত হন না যে ভাষা সংকলনের সময় কিছু কাজ করবে না। সম্ভবত পিএইচপি এর মতো একটি গতিশীল ভাষার জন্য ঠিক আছে, তবে আমি অন্যান্য ভাষায় সূত্র পরীক্ষা করে যদি ভবিষ্যতের রেফারেন্সের জন্য উল্লেখ করি। $x = "-11"
পরীক্ষার লুপের আগে কোনও ভেরিয়েবল সেট করা নিরাপদ এবং তারপরে এটি ব্যবহার করুন। যাতে অভ্যন্তরীণ কোড হয় $i =+$x
।
একটি মানদণ্ড চালান, এবং এটি সত্যিকার পূর্ণসংখ্যার (দ্রুত উপলব্ধ সমস্ত পদ্ধতি ব্যবহার করে) পাওয়ার দ্রুততম উপায়টি রূপান্তরিত করে
$foo = (int)+"12.345";
শুধু ব্যবহার করছি
$foo = +"12.345";
একটি ভাসা ফেরত।
(int)"12.345"
? আরও কত শতাংশ?