أسرع PHP نوع Jugling مع settype () مقابل وظائف * فال ()؟

StackOverflow https://stackoverflow.com/questions/1618874

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا في محاولة لمعرفة أسرع وسيلة (في PHP 5) للتأكد من أن قيمة هي في نوع أحتاج أن يكون. أنا خلقت سطرين من التعليمات البرمجية التي على حد سواء أن تفعل الشيء نفسه. المشكلة هي أنني لا يمكن معرفة الذي أسرع على أساس الخروج من المعايير.

و
(is_scalar($value) ? intval($value) : 0);
settype($value, 'integer');

أنا خلقت رمز الاختبار التالي ولكن لا أملك أي اكثر من بلدي PC الخاصة (Core2Quad + XP 32BIT و+ php5.2.5) وحساب درمهوست لاختباره مع - وكلاهما تظهر حول نفسه مرات لهذا التعليمات البرمجية.

$array = array(
    'false' => FALSE,
    'false2'=> 0,
    'false3'=> '0',
    'false4'=> 'FALSE',
    'true'  => TRUE,
    'true2' => 1,
    'true3' => '1',
    'true4' => 'TRUE',

    'char'  => chr(250),
    'char2' => chr(10),
    'utf'   => 0xF0,
    'utf1'  => 0xFE,

    'number' => '452.5435',
    'number2' => '-3948.33e2',
    'number3' => -343.54,
    'number4' => 99.999,
    'number5' => '3jk439fjk23945t324098523.349fj324r',

    'int'   => 2323,
    'int2'  => '2345',
    'int3'  => '0',
    'int4'  => array(),
    'int5'  => '39582347823908270983249078530793249802357846t890234879023490785',
    'int6'  => 3895732890543789324890123467548093248976123890548793289073246789458901234,

    'object3' => new SimpleXMLElement('<xml></xml>'),

    'array' => array(),
    'array2' => array('hello'),
    'array3' => array(3,54,21,0),
    'array4' => array(0.2)
);


$start = microtime(TRUE);

for($x=0;$x<10000;$x++) {
    foreach( $array as $value ) {
        (is_scalar($value) ? intval($value) : 0);
        //settype($value, 'integer');
    }
}

print (microtime(TRUE) - $start). ' seconds';

وعلى أي حال، وأنا أتساءل عما اذا كان قد يكون هناك المزيد هنا أن أنا في عداد المفقودين على النحو الذي من هذه الأساليب قد لا تعمل فقط بشكل أسرع - ولكن قد تسفر عن نتائج غريبة أيضا. شيء آخر هو أن يجب أن يثبت هذا النجاح الكامل مع [إينتس] - ثم أنواع أخرى مثل سلاسل وعوامات يجب أن تعمل أيضا

و: UPDATE:

وأنا مجرد اختبار هذه الأساليب ضد نوع تعويم وجدت أن settype () كان أبطأ (0.28 ثانية) مقابل floatval () (0.21 ثانية). لذا فإن الإجابة على هذا السؤال قد تكون صالحة فقط لنوع int.

//Float
(is_scalar($value) ? floatval($value) : 0);
settype($value, 'float');
هل كانت مفيدة؟

المحلول

وأعتقد أن كنت طالبا من أهمية نظرية خالصة، لأن الخلافات السرعة في هذه الحالة بالذات لا يمكن اعتبار مهم في الممارسة العملية.

ودعونا نلقي نظرة في شفرة مصدر فب

HTTP: //lxr.php. صافي / مصدر / فب-SRC / تحويلة / قياسي / type.c # 142

HTTP: //lxr.php. صافي / مصدر / فب-SRC / تحويلة / قياسي / type.c رقم 95

وكما ترون، كل من وظيفة استخدام نفس الروتين convert_to_long (وهذا بدوره يقلل لدعوة strtol المكتبة). ويشمل settype (أ الصغير) النفقات العامة للمقارنة الوسيطة الثانية مع سلسلة نوع، لذلك ينبغي أن يكون أبطأ قليلا.

وأسرع طريقة سيكون لاستخدام (الباحث) المدلى بها، لأنها لا تنطوي على شفرة تشغيل استدعاء دالة، ولكن تنفيذها مباشرة من قبل VM.

نصائح أخرى

ودعونا نلقي مؤشر بسيط:

<?php
$y = "45678912";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    $x = intval($x);
}
echo "\nintval: " . (microtime(true) - $time_start) . " sec.";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    $x = (int)$x;
}
echo "\n(int): " . (microtime(true) - $time_start) . " sec.";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    settype($x, 'int');
}
echo "\nsettype: " . (microtime(true) - $time_start) . " sec.\n";

ونتائجي على 64BIT أوبونتو:

intval: 0.47533583641052 sec.
(int): 0.19618892669678 sec.
settype: 0.51951289176941 sec.

في أعداد صحيحة طويلة والصورة مماثلة. لذلك (الباحث) هو الأفضل، ولكن ليس هناك سبب حقيقي لاستخدام intval () بدلا من settype ()

وإلا إذا كنت تخطط لاختبار القيم bazillion، لا ينبغي أن يكون هناك أي فرق عملي السرعة. أي ما هو موجود هو صغيرة جدا لدرجة أنها لا تؤثر في الحقيقة أي شيء.

والمباشر (النوع) الصب هو أسرع. هنا هو رمز أنا استخدم الآن.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top