문제

어떤 종류의 성능에 미치는 영향이 있을 사용할 때 고려 시 catch 문 php5?

내가 읽은 몇 가지 오래된 겉보기에 충돌이 주제에 대한 정보를 웹상에서 전입니다.많은 프레임워크가 현재 작업에서 만들어졌 php4 의 많은 부족의 정확 php5.그래서,그 많은 경험을 가지고 있지 않에서 자신을 사용하여도-catchs php.

도움이 되었습니까?

해결책

중 하나 고려해야 할 점은 비용을 시도록는 예외가 발생하지 않은 다른 질문에서 비용이 실제로 던지고 잡는 예외입니다.

예외가 있는 경우에만에 던져 실패는 경우에,당신은 거의 확실히지 않는 성능에 관심 때문에,당신은 실패하지 않습니다 아주 많은 시간을 실행하는 프로그램입니다.는 경우에 당신은 실패에는 루프(니다.k.a:당신의 머리를 두드리는 벽돌 벽),응용 프로그램이 더 문제가 되는 것 보다 느립니다.에 대해 걱정하지 않도록 비용의 예외를 발생하고 있지 않으면 강제로 어떻게든 그들을 사용하에 대한 정기 제어 흐름입니다.

누군가가 게시 대답에 대해 얘기 프로파일드에서는 예외가 발생합니다.I've never 테스트,그것은 나 자신을 하지만 저는 자신 있게 예측하는 것이 훨씬 더 큰 성능보다에서의 시험을 차단시키지 않고 아무것도.

다른 것은 고려하는 어디에 당신은 둥지를 통화 수준의 많은 깊이 있는 빠른 하나 catch 오른쪽 상단에 보다 그것은을 확인하는 값을 반환하고 전파하는 오류를 호출할 때마다입니다.

반대의 상황은 당신을 찾는 당신이 감싸는 모든 통화에서 자신의 시...catch 블록의 코드의 속도가 느려질 수 있습니다.과 추.

다른 팁

내가 지루해하고 프로파일은 다음과 같은(왼쪽 타이밍 코드):

function no_except($a, $b) { 
    $a += $b;
    return $a;
}
function except($a, $b) { 
    try {
        $a += $b;
    } catch (Exception $e) {}
    return $a;
}

를 사용하여 두 개의 서로 다른 소프트웨어

echo 'no except with no surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    no_except(5, 7);
}
echo 'no except with surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    try {
        no_except(5, 7);
    } catch (Exception $e) {}
}
echo 'except with no surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    except(5, 7);
}
echo 'except with surrounding try';
for ($i = 0; $i < NUM_TESTS; ++$i) {
    try {
        except(5, 7);
    } catch (Exception $e) {}
}

가 1000000 에서 실행됩 내 WinXP 상자 실행할 아파치와 PHP5.2.6:

no except with no surrounding try = 3.3296
no except with surrounding try = 3.4246
except with no surrounding try = 3.2548
except with surrounding try = 3.2913

이러한 결과가 일관되고에 남아 있는 비슷한 비율에 상관없이 주문한 테스트가 실행되었습니다.

결론:을 처리하는 코드 추가 드문 경우를 제외하고는 아무보다 느린 코드를 무시 예외가 있습니다.

Try-catch 블록하지 않는 성능 문제 실시 성능 병목 현상 창조에서 오는 예외체입니다.

테스트 코드:

function shuffle_assoc($array) { 
    $keys = array_keys($array);
    shuffle($keys);
    return array_merge(array_flip($keys), $array);
}

$c_e = new Exception('n');

function no_try($a, $b) { 
    $a = new stdclass;
    return $a;
}
function no_except($a, $b) { 
    try {
        $a = new Exception('k');
    } catch (Exception $e) {
        return $a + $b;
    }
    return $a;
}
function except($a, $b) { 
    try {
        throw new Exception('k');
    } catch (Exception $e) {
        return $a + $b;
    }
    return $a;
}
function constant_except($a, $b) {
    global $c_e;
    try {
        throw $c_e;
    } catch (Exception $e) {
        return $a + $b;
    }
    return $a;
}

$tests = array(
    'no try with no surrounding try'=>function() {
        no_try(5, 7);
    },
    'no try with surrounding try'=>function() {
        try {
            no_try(5, 7);
        } catch (Exception $e) {}
    },
    'no except with no surrounding try'=>function() {
        no_except(5, 7);
    },
    'no except with surrounding try'=>function() {
        try {
            no_except(5, 7);
        } catch (Exception $e) {}
    },
    'except with no surrounding try'=>function() {
        except(5, 7);
    },
    'except with surrounding try'=>function() {
        try {
            except(5, 7);
        } catch (Exception $e) {}
    },
    'constant except with no surrounding try'=>function() {
        constant_except(5, 7);
    },
    'constant except with surrounding try'=>function() {
        try {
            constant_except(5, 7);
        } catch (Exception $e) {}
    },
);
$tests = shuffle_assoc($tests);

foreach($tests as $k=>$f) {
    echo $k;
    $start = microtime(true);
    for ($i = 0; $i < 1000000; ++$i) {
        $f();
    }
    echo ' = '.number_format((microtime(true) - $start), 4)."<br>\n";
}

결과:

no try with no surrounding try = 0.5130
no try with surrounding try = 0.5665
no except with no surrounding try = 3.6469
no except with surrounding try = 3.6979
except with no surrounding try = 3.8729
except with surrounding try = 3.8978
constant except with no surrounding try = 0.5741
constant except with surrounding try = 0.6234

일반적으로 사용하는 예외에 대비하는 예기치 못한 오류가 발생하고 사용하여 오류가 확인 코드에서 실패에 대하여는 부분의 프로그램으로 정상적인 상태이다.설명:

  1. 레코드를 찾을 수 없습니다.데이터베이스에서 올바르지 않은 상태이어야 합 확인하는 쿼리 결과 메시지는 사용자니다.

  2. SQL 오류가려고 할 때를 가져올 기록 예기치 않은 실패로 기록되지 않을 수 있지만,당신은 프로그램 오류가이 좋은 장소에 대한 예외 오류 로그에 오류 로그의 이메일 관리자의 스택 추적이,그리고 표시 예의 오류 메시지가 사용자에게 그에게 조언하는 무언가 잘못되고 있습니다.

예외는 비싼하지만,지 않으면 당신은 전체 프로그램을 사용하여 흐름을 그들에게,어떤 성과 차이가하지 않아야 될 인간의 눈에 띈다.

아무것도 발견하지 않았습에서도/성능에서 Google 하지만 간단한 테스트와 루프는 오류를 던지고 대신하는 경우 문 생산 329ms 대 6ms 루프에서의 5000.

죄송하는 게시물을 아주 오래된 메시지,하지만 나는 의견을 읽고 나는 다소 동의하지 않는 차이는 최소한 간단한 조각의 코드,또는 수 neglectable 는 시도/을 잡을 사용되는 코드의 특정 부분에 대한되지 않는 항상 예측할 수 있지만,나는 또한 믿지 않는(테스트)는 간단하다:

if(isset($var) && is_array($var)){
    foreach($var as $k=>$v){
         $var[$k] = $v+1;
    }
}

보다 빠르

try{
    foreach($var as $k=>$v){
        $var[$k] = $v+1;
    }
}catch(Exception($e)){
}

또한 믿지 않는(테스트)를:

<?php
//beginning code
try{
    //some more code
    foreach($var as $k=>$v){
        $var[$k] = $v+1;
    }
    //more code
}catch(Exception($e)){
}
//output everything
?>

보다 더 비싼 가 IFs 코드

그게 아주 좋은 질문입니다!

내가 테스트는 그것을 많은 시간과 본 적이 어떤 성과 문제점;-)그것이 사실 10 년 전에는 C++에서 그러나 나는 생각한 오늘날 그들이 그것을 많이 향상 이후에도 유용하여 새로운 내일을 열어갑니다.

하지만 나는 아직 두려워 서라운드에 내 첫 번째 항목점을 가진다:

try {Controller::run();}catch(...)

이 테스트로의 많음이 함수 호출에 큰 다음과 같습니다....은 사람은 완전히 테스트는 그것을 이미?

일반적으로 말해,그들이 비싸지 않는 가치에 PHP.

이기 때문에 체크 표현 언어,당신은 잡아야도 예외가 발생합니다.

을 처리할 때는 레거시 코드를 버리지 않는,그리고 새 코드는 않습니다,그것은 단지에 이르게 혼란이 있습니다.

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top