• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
OpCode/Lex دستور echo
#1
صحبت من اینجا راجب پرفورمنس نیست:

در این مقاله به نویسندگی julien pauli که از کامیتر های PHP و نویسندگان phpinternalsbook هم هست، در قسمت performance-tips بر طبق opcode تولید شده گفته که پرفورمنس:
کد پی‌اچ‌پی:
echo $var$var2 
بیشتر از پرفورمنس
کد پی‌اچ‌پی:
echo $var $var2 
هستش...

یعنی پرفورمنس نمایش و الحاق رشته توسط کاما , بیشتر از از الحاق رشته توسط نقطه . هستش چون در نوع اول عملیات concat انجام نمیگیره و صرفاً دوبار ECHO داخلی صورت میگیره

Idea درحالی که من یه بنچمارک ساده گرفتم(PHP 5.6) و برعکس این قضیه رو ثابت کرده:

echo $var . $var2

0.16900992393494
0.17300987243652
0.17901015281677
0.18001103401184
0.18101096153259

echo $var, $var2

0.33201909065247
0.33201903065247
0.34201913065147
0.34401109065247
0.35201909161243

Idea نکته دیگه اینجاست که token/lexical کد تولید شده هردو یکیه اما opcode تولید شون(توسط اکستنشن VLD) متفاوته!
کد lex/token هر دو:

کد پی‌اچ‌پی:
T_OPEN_TAG <?php
T_VARIABLE $foo
T_CONSTANT_ENCAPSED_STRING 
"foo"
T_WHITESPACE
T_VARIABLE $bar
T_CONSTANT_ENCAPSED_STRING 
"bar"
T_WHITESPACE
T_ECHO 
echo
T_WHITESPACE
T_VARIABLE $foo
T_VARIABLE $bar
T_WHITESPACE
T_CLOSE_TAG ?>

داستان چیه Huh
وبلاگ: Yousha.Blog.ir


کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بیشتر => نگهداری بهتر
  پاسخ
تشکر شده توسط :
#2
کد پی‌اچ‌پی:
php -v
PHP 5.5.9
-1ubuntu4.22 (cli) (builtAug  4 2017 19:40:28

کد پی‌اچ‌پی:
<?php

$var 
'foo';
$var2'bar';

$t1 microtime(true);
for(
$i=0;$i<1000;$i++)
{
    echo 
$var $var2;
}


$t2 microtime(true);
for(
$i=0;$i<1000;$i++)
{
    echo 
$var $var2;
}

$t3 microtime(true);


echo 
"\n\n\n";
echo 
$t2-$t1;
echo 
"\n";
echo 
$t3-$t2

0.01161789894104
0.00398015975952

Angel

حق با توئه !
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : Y.P.Y
#3
میتونی payload رو زیاد کنی؟ چون نویسنده مقاله به من گفته که ممکنه machine error باشه...
مثلاً ده ها هزار رشته با هزاران چرخش حلقه
لپ تاپ من کشش نداره
وبلاگ: Yousha.Blog.ir


کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بیشتر => نگهداری بهتر
  پاسخ
تشکر شده توسط :
#4
صد هزار دور
تست اول
3.5571799278259
2.8137819766998

تست دوم
3.8279910087585
2.9827361106873

نتیجه همونه با , کندتر هست .

با رشته های بلند روی صد هزار دور
کد:
$var = 'foowewefwef6w4efw65ef4w56ef46w5e4f6w5e4f56we4f6w54fw56e4f6w54f56wef45w6f465weef465w4fe65w4fwfeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeewefwefweeeeeeeeeeeeeeeeeeeeee';
$var2= 'barwefwfewfeweefwefwefewefwefweefwefewfwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwefwefwefweeeeeeeeewefwefwefwfewefwfewefwef';

$t1 = microtime(true);
for($i=0;$i<100000;$i++)
{
    echo $var , $var2;
}


$t2 = microtime(true);
for($i=0;$i<100000;$i++)
{
    echo $var . $var2;
}

$t3 = microtime(true);


$x =  "<hr>";
$x .=$t2-$t1;
$x .="<hr>";
$x .=$t3-$t2;

0.02459192276001
0.02442097663879

میخوای بنویس بده من تست کنم
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : Y.P.Y


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان