@MIKEk8

Как в php отключить код при компиляции?

Есть большой цикл, на тестовом севере он должен выводить информацию, на проде просто выполняться (максимально быстро).
$debug=false;
$r=$f=0;
for ($i=1;$i<1000000000;$i++)
{
    $r+=$i;

//debug info
    if ($debug AND $i%1000000){
        echo $r . PHP_EOL;
    }
//debug info end

    $f*=$i+$i;

//debug info
    if ($debug AND $i%2000000){
        echo $f . PHP_EOL;
    }
//debug info end
}


Можно както блоки debug info выкинуть из продакшин версии? Ведь даже простая булева проверка на 1ккк итераций может сильно замедлить процесс
Т.е. както заменить условие на уровне выпонения, на условия на уровне компиляции.
  • Вопрос задан
  • 461 просмотр
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Если у вас включен и настроен Opcache, то мёртвый код удаляется автоматически: https://bugs.php.net/bug.php?id=71102
Ответ написан
Комментировать
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Обычно, в критичных по скорости кусках if выносят за цикл:
if ($debug) {
  //цикл с выводом информации
} else {
  //тот же самый цикл, но без вывода информации
}

Получается длиннее и не очень изящно, но в highload приходится многим жертвовать.
Ответ написан
Комментировать
@MIKEk8 Автор вопроса
Придумал другой вариант: В закрывающий комментарий блока //end debug info дабавить */ и на продакшене заменять все открывающие //start debug info на /*start debug info
/*start debug info
if ($i%1000000){
    echo $r . PHP_EOL;
}
//end debug info*/


Протестировал на 100кк.
Если
/*if ($i%1000000){
echo $r . PHP_EOL;
}*/ то время 2,6 сек

Если $debug=false;
if ($debug){
if ($i%1000000){
echo $r . PHP_EOL;
}} то время 3,2 сек

Если $debug=false;
if ($debug && $i%1000000){ //или AND
echo $r . PHP_EOL;
} то время 3,7 сек

Если define('debug ',false);
if (debug){ //или AND
echo $r . PHP_EOL;
} то время 3,5 сек
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Akdmeh
@Akdmeh
PHP, Yii2, Music
1) Оставить все как есть. Для этого сделайте простой тест на время, запустите несколько раз - думаю, даже 1 миллиард простых проверок никак особо не повлияет на производительность
2) Если же повлияет так, что это покажется принципиальным (в чем я сомневаюсь) - создайте две версии цикла - с debug и без. Может это не сильно хорошо с точки зрения чистоты кода, но ничего другого в голову не приходит
3) Проблема тут даже другая - скрипт очень прожорлив, поэтому лишняя проверка никакой роли играть не будет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы