স্ট্রিংটি পিএইচপি-তে পূর্ণসংখ্যায় রূপান্তর করার দ্রুততম উপায়


251

পিএইচপি ব্যবহার করে, এভাবে স্ট্রিং রূপান্তর করার দ্রুততম "123"উপায়টি কী : একটি পূর্ণসংখ্যায়?

কেন সেই বিশেষ পদ্ধতিটি দ্রুত? এটি অপ্রত্যাশিত ইনপুট, যেমন "hello"বা একটি অ্যারে পেলে কী ঘটে ?


12
ভাল যদি এটি ক্ষতিগ্রস্থ না হয় (পাঠযোগ্যতা), তবে সবচেয়ে কার্যকর উপায়ে জিনিসগুলি কেন করবেন না?
নিকফ

19
যদি এটি গতিতে ক্ষতি না করে তবে কেন সবচেয়ে পঠনযোগ্য উপায়ে জিনিসগুলি সম্ভব না?
অ্যান্ডি লেস্টার

4
@ অ্যান্ডি, নীচের মানদণ্ড পরীক্ষা দেখুন। মধ্যে পার্থক্য (int)এবং intval()400% এরও বেশি হতে পারে!
নিকফ

6
দ্রুততম বিষয়গুলি কারণ ব্যবহারকারীর অভিজ্ঞতার জন্য গতি বিষয়। আপনার যখন প্রচুর অপারেশন চলছে, আপনি সেগুলি দ্রুত করতে চান!
ফিলিপ্প

13
মৃত ঘোড়াটিকে লাথি না মেরে, আমি আরও বলব যে গতি বনাম পঠনযোগ্যতার প্রশ্ন এই ক্ষেত্রে অপ্রাসঙ্গিক, কারণ প্রশ্নটি অপ্টিমাইজেশনের অধীনে ট্যাগ করা হয়েছিল। অপ্টিমাইজেশনের অধীনে ট্যাগ করা কোনও প্রশ্নের গতি চাওয়ার কারণটি স্ব-বর্ণনামূলক।
নটলিজার্ডস

উত্তর:


371

আমি একটি দ্রুত বেঞ্চমার্কিং অনুশীলন স্থাপন করেছি:

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 ব্যবহার করে পরীক্ষিত


9
এটি সম্ভবত ইন্টারপ্রেটারের এক্সপ্রেশন ক্যালকুলেটরটিতে কাস্ট সরাসরি পরিচালনা করা হয় এমন সময়সীমার () একটি ফাংশন কল করার আহ্বান জানায় with কো-ইরকিয়ন আরও দ্রুত হওয়ার কারণ এটিও হতে পারে।
স্ট্যাটিকসান

10
আপনার জবরদস্তির উদাহরণটি পিএইচপি এর সামান্য পরিচিত ইউনারী প্লাস অপারেটরটি ব্যবহার করে আরও সরল করা যেতে পারে। $ x + 0 -> + $ x
ওজি

@ ওজি এটি দুর্দান্ত। বখশিশের জন্য ধন্যবাদ! +"15" == 15
caiosm1005

1
@John কারণ তিনি যে প্রথম কোডে শুধুমাত্র দুটি মামলা পরীক্ষা (int)এবং intval, এবং প্রতিটি জোড়ায়, উপর একটি% দেয় intval, বেস কেস হওয়া আবশ্যক (int)। তবে আপনার একটি ভাল বক্তব্য আছে যে তিনি যদি স্পষ্টভাবে বলেন তবে বিশেষত যেহেতু তিনি পরে তৃতীয় কেস যুক্ত করেছিলেন তা পরিষ্কার হয়ে যেত!
টুলমেকারস্টেভ

2
নতুন পিএইচপি সংস্করণে এই ফলাফলের কোনও পরিবর্তন আছে?
আর্টিয়াম

34

আমি ব্যক্তিগতভাবে মনে করি castালাই সবচেয়ে সুন্দর।

$iSomeVar = (int) $sSomeOtherVar;

'হ্যালো' এর মতো একটি স্ট্রিং যদি প্রেরণ করা হয় তবে এটি পূর্ণসংখ্যা 0 এ castালবে ''২২ বছর বয়সী' এর মতো স্ট্রিংয়ের জন্য এটি পূর্ণসংখ্যার ২২ এ কাস্ট করা হবে Any

আপনি যদি সত্যিই গতিটির প্রয়োজন হয় তবে আমার ধারণা এখানে অন্যান্য পরামর্শগুলি জোর করে দ্রুততম ধরা অনুমানের ক্ষেত্রে সঠিক।


7
মজার বিষয় হল, অ্যারেগুলি 1 এ যাবে figure
নিকফ

2
@ নিকফ তাই নয় - এটি 0 তেও কাস্ট করা যেতে পারে। এটি একটি পূর্ণসংখ্যার জন্য এটি বুলিয়ান (সত্য | মিথ্যা) মান দেয় - 'মিথ্যা' = 0, 'সত্য' = ১। একটি অ্যারে যদি এটি 100% খালি থাকে তবে এটি মিথ্যা এবং যদি এটি কেবল খালি থাকে তবে এটিতে কোনও তথ্য থাকে তবে এটি সত্য স্ট্রিং বা নুল মান। আপনি একটি পূর্ণসংখ্যা একটি খালি অ্যারে নিক্ষেপ ছিল, এটা হয়ে যাবে 0. (হ্যাঁ, আমি সচেতন আছি এই পুরোনো!)
সুপার বিড়াল

15

একটি পরীক্ষা চালান।

   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
বস্টনি

9

আপনি সহজেই ফ্লোট ব্যবহার করে দীর্ঘ স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করতে পারেন

$float = (float)$num;

অথবা আপনি যদি পূর্ণসংখ্যারকে ভাসমান ভ্যাল না চান তবে সাথে যান

$float = (int)$num;

প্রাক্তন জন্য।

(int)   "1212.3"   = 1212 
(float) "1212.3"   = 1212.3

1
তাই না? আপনি যদি কোন int চান, আপনি কেন ব্যবহার করবেন না (int)? এটি সত্য হতে পারে যদি স্ট্রিংটিতে একটি পূর্ণসংখ্যা থাকে, এটি (float)একটি মান প্রদান করে যা অনেকগুলি পূর্ণসংখ্যার মতো কাজ করে (যদিও এর অভ্যন্তরীণ প্রকারটি সম্ভবত float) তবে আপনি কেন এটি করবেন যদি স্পেসিফিকেশনটি একটি পূর্ণসংখ্য মান ফেরত দেয় ? মনে করুন আগত স্ট্রিংটি "1.3"? আপনি পূর্ণসংখ্যা পাবেন না। এছাড়াও, ভবিষ্যতে কোডটি যে কারও পক্ষে পড়ার পক্ষে, আপনি যা বোঝাতে চেয়েছেন তা আপনার উচিত। যদি আপনার অর্থ "এটি একটি পূর্ণসংখ্যা হওয়া উচিত", তবে বলুন (int), না (float)
টুলমেকারস্টেভ

7
$int = settype("100", "integer"); //convert the numeric string to int

3
আমি বিশ্বাস করি কিছু রেফারেন্স বা প্রমাণ ক্রমযুক্ত!
মেহরান

বিবৃতিটি যদি কাজ করে তবে প্রকৃতপক্ষে এখানে একটি বুলিয়ান হবে, তবে সেটটাইপ () এর প্রথম প্যারামিটারটি রেফারেন্স দ্বারা পাস না হওয়ার পরে এটি অবশ্যই কোনও ভ্যারিয়েন হতে পারে।
কাতারে

7

যেকোন স্ট্রিং থেকে পূর্ণসংখ্যার নিষ্কাশন

$ ইন = 'tel.123-12-33';

preg_match_all('!\d+!', $in, $matches);
$out =  (int)implode('', $matches[0]);

// $ আউট = '1231233';


আপনি সেরা সেরা সেরা! আমি জসন ডেটা স্ট্রিং থেকে পূর্ণসংখ্যায় কিছু বৈকল্পিক রূপান্তর করতে ঘন্টা ব্যয় করেছি, কেবল আপনার পদ্ধতিটি সাহায্য করেছে! ধন্যবাদ!
কামনিবুল

4

আরও অ্যাড-হক বেঞ্চমার্ক ফলাফল:

$ 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

প্রতিটি লুপে 10x পরীক্ষা করা হচ্ছে স্টেটমেন্টটি লিখতে ভাল হবে, যাতে লুপের ওভারহেডের সময়টি প্রাধান্য পায় না। যেমন { $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }। আক্ষরিক মানটি "-11"সরাসরি ব্যবহার করাও ঝুঁকিপূর্ণ , আপনি যদি নিশ্চিত হন না যে ভাষা সংকলনের সময় কিছু কাজ করবে না। সম্ভবত পিএইচপি এর মতো একটি গতিশীল ভাষার জন্য ঠিক আছে, তবে আমি অন্যান্য ভাষায় সূত্র পরীক্ষা করে যদি ভবিষ্যতের রেফারেন্সের জন্য উল্লেখ করি। $x = "-11"পরীক্ষার লুপের আগে কোনও ভেরিয়েবল সেট করা নিরাপদ এবং তারপরে এটি ব্যবহার করুন। যাতে অভ্যন্তরীণ কোড হয় $i =+$x
টুলমেকারস্টেভ

4

একটি মানদণ্ড চালান, এবং এটি সত্যিকার পূর্ণসংখ্যার (দ্রুত উপলব্ধ সমস্ত পদ্ধতি ব্যবহার করে) পাওয়ার দ্রুততম উপায়টি রূপান্তরিত করে

$foo = (int)+"12.345";

শুধু ব্যবহার করছি

$foo = +"12.345";

একটি ভাসা ফেরত।


2
এই সহজ চেয়ে দ্রুত (int)"12.345"? আরও কত শতাংশ?
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.