문제

PHP, 2D 배열 또는 클래스 중 어느 것을 사용하는 것이 더 낫습니까?이것이 의미하는 바에 대한 예를 포함했습니다.

// Using a class
class someClass
{
    public  $name;
    public  $height;
    public  $weight;

    function __construct($name, $height, $weight)
    {
        $this -> name       = $name;
        $this -> height = $height;
        $this -> weight = $weight;
    }
}

$classArray[1] = new someClass('Bob', 10, 20);
$classArray[2] = new someClass('Fred', 15, 10);
$classArray[3] = new someClass('Ned', 25, 30);


// Using a 2D array
$normalArray[1]['name'] = 'Bob';
$normalArray[1]['height']   = 10;
$normalArray[1]['weight']   = 20;

$normalArray[2]['name'] = 'Fred';
$normalArray[2]['height']   = 15;
$normalArray[2]['weight']   = 10;

$normalArray[3]['name'] = 'Ned';
$normalArray[3]['height']   = 25;
$normalArray[3]['weight']   = 30;

누군가가 나와서 수업이 너무 느리다는 것을 보여주지 않는다고 가정하면 수업이 승리하는 것처럼 보입니다.

어떤 답변을 받아들여야 할지 모르겠습니다. 방금 답변을 모두 찬성했습니다.


그리고 나는 이제 거의 동일한 페이지 두 개를 작성했습니다. 하나는 2D 배열(이 질문이 게시되기 전에 작성됨)을 사용하고 다른 하나는 클래스를 사용하며 클래스가 훨씬 더 좋은 코드를 생성한다고 말해야 합니다.얼마나 많은 오버헤드가 생성될지는 모르겠지만 코드 자체의 개선에 필적할 수 있을지는 의문입니다.

제가 더 나은 프로그래머가 되도록 도와주셔서 감사합니다.

도움이 되었습니까?

해결책

위에서 구성한 "클래스"는 대부분의 사람들이 사용하는 클래스입니다. 구조체 다른 언어로.PHP의 성능에 어떤 영향이 있는지는 잘 모르겠지만 객체를 인스턴스화하는 것이 약간만 더 비용이 많이 들 것으로 생각됩니다.

즉, 비용이 상대적으로 낮으면 개체를 관리하는 것이 조금 더 쉽다고 생각합니다.

나는 제목과 귀하의 질문에 기초하여 다음과 같이 말하고 있습니다.클래스는 메서드 및 액세스 제어의 이점도 제공한다는 점을 명심하세요.따라서 사람들이 가중치를 음수로 변경하지 않도록 하려면 다음을 수행하면 됩니다. weight private 필드를 입력하고 다음과 같은 접근자 메서드를 제공하세요. getWeight() 그리고 setWeight().내부에 setWeight(), 다음과 같이 몇 가지 값 확인을 수행할 수 있습니다.

public function setWeight($weight)
{
    if($weight >= 0)
    {
        $this->weight = $weight;
    }
    else
    {
        // Handle this scenario however you like
    }
}

다른 팁

'더 나은'이라는 말이 정확히 무엇을 의미하는지에 따라 다릅니다.나는 (적어도 내 의견으로는) 더 깔끔한 코드를 만들기 때문에 객체 지향 방식(클래스 사용)을 택할 것입니다.그러나 해당 옵션에 대한 속도 페널티가 무엇인지 잘 모르겠습니다.

일반적으로 저는 다음 규칙을 따릅니다.

1) 애플리케이션의 여러 부분이 데이터 구조를 사용하는 경우 클래스로 만듭니다.

2) 애플리케이션의 한 부분에서 데이터를 빠르게 처리하기 위해 사용하는 경우 2D 배열로 만드세요.

제가 주로 생각하는 속도는 속도입니다. 여기에 있는 것보다 더 복잡한 경우 수업을 듣겠지만 문제는 수업 비용이 얼마입니까?

이는 성급한 최적화인 것 같습니다.응용 프로그램은 어느 쪽이든 실제 성능에 영향을 미치지는 않지만 클래스를 사용하면 getter 및 setter 메서드를 사용할 수 있으며 일반적으로 코드 캡슐화 및 코드 재사용에 더 좋습니다.

코드를 읽고 유지 관리하기 어려운 배열을 사용하면 코드를 쉽게 단위 테스트할 수 없으며 좋은 클래스 구조를 사용하면 다른 개발자가 이를 수행해야 할 경우 더 쉽게 이해할 수 있습니다.

나중에 이를 조작하기 위해 다른 메서드를 추가해야 할 경우 확장할 아키텍처가 없습니다.

당신이 가지고 있는 클래스는 OO 용어로 볼 때 실제 클래스가 아닙니다. 단지 인스턴스 변수의 공간을 차지하도록 구성되었을 뿐입니다.

즉, 속도에는 큰 문제가 없을 것입니다. 귀하의 예에서는 단지 스타일 문제일 뿐입니다.

흥미로운 부분은 객체를 실제 "사람" 클래스로 구성하고 사람 클래스에 대해 원할 수 있는 다른 속성과 작업에 대해 생각하는 경우 스타일 성능(코드 작성)뿐만 아니라 주목하게 될 것입니다. 또한 속도 성능.

코드에서 해당 속성(이름/키/체중)에 대해 작동하는 많은 함수를 사용하는 경우 클래스를 사용하는 것이 좋은 옵션이 될 수 있습니다.

Teifion, 클래스를 배열의 단순한 대체품으로 사용한다면 OOP 근처에는 없습니다.OOP의 본질은 객체가 지식과 책임을 갖고 실제로 일을 수행할 수 있으며 다른 클래스와 협력할 수 있다는 것입니다.귀하의 객체는 지식만 갖고 있고 유휴 상태로 존재하는 것 외에는 아무것도 할 수 없습니다. 그러나 지속성 공급자(데이터베이스에 자신을 저장/검색하는 방법을 아는 객체)에 대한 좋은 후보인 것 같습니다.

성능도 걱정하지 마세요.PHP의 개체는 빠르고 가벼우며 일반적으로 성능이 훨씬 과대평가됩니다.모호하고 디버그 및 수정하기 어려운 코드 조각을 사용하여 프로그램에서 마이크로초를 절약하는 것보다 올바른 접근 방식을 사용하여 프로그래머로서 시간을 절약하는 것이 더 저렴합니다.

시간 배열과 클래스를 비교하는 대부분의 테스트는 인스턴스화만 테스트합니다.실제로 그들과 함께 뭔가를 시작하면.

나는 성능이 훨씬 더 좋았기 때문에 배열만 사용하는 "순수주의자"였습니다.나는 클래스를 사용하지 않는 추가 번거로움을 정당화하기 위해 다음 코드를 작성했습니다(프로그래머에게는 더 쉬울지라도).

제가 그 결과에 매우 놀랐다고 가정해 봅시다!

    <?php
$rx = "";
$rt = "";
$rf = "";

$ta = 0; // total array time
$tc = 0; // total class time

// flip these to test different attributes
$test_globals = true;
$test_functions = true;
$test_assignments = true;
$test_reads = true;


// define class


class TestObject
{
  public $a;
  public $b;
  public $c;
  public $d;
  public $e;
  public $f;

  public function __construct($a,$b,$c,$d,$e,$f)
  {
    $this->a = $a;
    $this->b = $b;
    $this->c = $c;
    $this->d = $d;
    $this->e = $e;
    $this->f = $f;
  }

  public function setAtoB()
  {
      $this->a = $this->b;
  }
}

// begin test

echo "<br>test reads: " . $test_reads;
echo "<br>test assignments: " . $test_assignments;
echo "<br>test globals: " . $test_globals;
echo "<br>test functions: " . $test_functions;
echo "<br>";

for ($z=0;$z<10;$z++)
{
    $starta = microtime(true);

    for ($x=0;$x<100000;$x++)
    {
        $xr = getArray('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');

        if ($test_assignments)
        {
            $xr['e'] = "e";
            $xr['c'] = "sea biscut";
        }

        if ($test_reads)
        {
            $rt = $x['b'];
            $rx  = $x['f'];
        }

        if ($test_functions) { setArrAtoB($xr); }
        if ($test_globals) { $rf = glb_arr(); }
    }
    $ta = $ta + (microtime(true)-$starta);
    echo "<br/>Array time = " . (microtime(true)-$starta) . "\n\n";


    $startc = microtime(true);

    for ($x=0;$x<100000;$x++)
    {
        $xo = new TestObject('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');

        if ($test_assignments)
        {
            $xo->e = "e";
            $xo->c = "sea biscut";
        }

        if ($test_reads)
        {
            $rt = $xo->b;
            $rx = $xo->f;
        }

        if ($test_functions) { $xo->setAtoB(); }
        if ($test_globals) { $xf = glb_cls(); }
    }

    $tc = $tc + (microtime(true)-$startc);
    echo "<br>Class time = " . (microtime(true)-$startc) . "\n\n";

    echo "<br>";
    echo "<br>Total Array time (so far) = " . $ta . "(100,000 iterations) \n\n";
    echo "<br>Total Class time (so far) = " . $tc . "(100,000 iterations) \n\n";
    echo "<br>";

}
echo "TOTAL TIMES:";
echo "<br>";
echo "<br>Total Array time = " . $ta . "(1,000,000 iterations) \n\n";
echo "<br>Total Class time = " . $tc . "(1,000,000 iterations)\n\n";


// test functions

function getArray($a,$b,$c,$d,$e,$f)
{
    $arr = array();
    $arr['a'] = $a;
    $arr['b'] = $b;
    $arr['c'] = $c;
    $arr['d'] = $d;
    $arr['d'] = $e;
    $arr['d'] = $f;
    return($arr);
}

//-------------------------------------

function setArrAtoB($r)
{
    $r['a'] = $r['b'];
}

//-------------------------------------

function glb_cls()
{
    global $xo;

    $xo->d = "ddxxdd";
    return ($xo->f);
}

//-------------------------------------

function glb_arr()
{
    global $xr;

    $xr['d'] = "ddxxdd";
    return ($xr['f']);
}

//-------------------------------------

?>

테스트 읽기:1 테스트 할당 :1 글로벌 테스트 :1 테스트 기능 :1

배열 시간 = 1.58905816078 클래스 시간 = 1.11980104446 총 배열 시간 (지금까지) = 1.58903813362 (100,000 반복) 총 클래스 시간 (지금까지) = 1.11979603767 (100,000 회복)

배열 시간 = 1.02581000328 클래스 시간 = 1.22492313385 총 배열 시간 (지금까지) = 2.61484408379 (100,000 반복) 총 클래스 시간 (지금까지) = 2.34471416473 (100,000 회복)

배열 시간 = 1.29942297935 클래스 시간 = 1.18844485283 총 배열 시간 (지금까지) = 3.91425895691 (100,000 회복) 총 클래스 시간 (지금까지) = 3.5331492424 (100,000 반복)

배열 시간 = 1.28776097298 클래스 시간 = 1.02383089066 총 배열 시간 (지금 멀리) = 5.2020149231 (100,000 반복) 총 클래스 시간 (지금까지) = 4.55697512627 (100,000 회복)

배열 시간 = 1.31235599518 클래스 시간 = 1.38880181313 총 배열 시간 (지금까지) = 6.51436591148 (100,000 회복) 총 클래스 시간 (지금까지) = 5.94577097893 (100,000 반복)

배열 시간 = 1.3007349968 클래스 시간 = 1.076440811116 총 배열 시간 (지금 멀리) = 7.81509685516 (100,000 회복) 총 클래스 시간 (지금까지) = 7.02220678329 (100,000 회복)

배열 시간 = 1.12752890587 클래스 시간 = 1.07106018066 총 배열 시간 (지금까지) = 8.94262075424 (100,000 반복) 총 클래스 시간 (지금까지) = 8.09326195717 (100,000 회복)

배열 시간 = 1.08890199661 클래스 시간 = 1.09139609337 총 배열 시간 (지금까지) = 10.03151777441 (100,000 회복) 총 클래스 시간 (지금까지) = 9.18465089798 (100,000 반복)

배열 시간 = 1.6172170639 클래스 시간 = 1.14714384079 총 배열 시간 (지금까지) = 11.6487307549 (100,000 반복) 총 클래스 시간 (지금까지) = 10.3317887783 (100,000 회복)

배열 시간 = 1.53738498688 클래스 시간 = 1.28127002716 총 배열 시간 (지금까지) = 13.1861097813 (100,000 회복) 총 클래스 시간 (지금까지) = 11.6130547523 (100,000 회복)

총 시간:총 배열 시간 = 13.1861097813 (1,000,000 반복) 총 클래스 시간 = 11.6130547523 (1,000,000 반복)

따라서 어느 쪽이든 그 차이는 거의 무시할 수 있습니다.일단 전 세계적으로 접근하기 시작하면 수업이 실제로 조금 더 빨라진다는 사실에 매우 놀랐습니다.

하지만 나를 믿지 말고 스스로 실행하십시오.나는 이제 고성능 애플리케이션에서 클래스를 사용하는 것에 대해 개인적으로 완전히 죄책감을 느낍니다.:디

@리차드 바르노

나는 (작은 버그를 수정한 후) 귀하의 정확한 코드를 실행했고 귀하와는 훨씬 다른 결과를 얻었습니다.PHP 5.3.17 설치에서 수업이 많이 실행되었습니다.

배열 시간 = 0.69054913520813 클래스 시간 = 1.1762700080872

총 배열 시간 (지금 멀리) = 0.69054508209229 (100,000 반복) 총 클래스 시간 (지금 멀리) = 1.1762590408325 (100,000 반복)

배열 시간 = 0.99001502990723 클래스 시간 = 1.22034907341

총 배열 시간 (지금 멀리) = 1.6805560588837 (100,000 반복) 총 클래스 시간 (지금 멀리) = 2.3966031074524 (100,000 반복)

배열 시간 = 0.99191808700562 클래스 시간 = 1.2245700359344

총 배열 시간 (지금 멀리) = 2.6724660396576 (100,000 반복) 총 클래스 시간 (지금까지) = 3.6211669445038 (100,000 반복)

배열 시간 = 0.9890251159668 클래스 시간 = 1.2246470451355

총 배열 시간 (지금 멀리) = 3.661484003067 (100,000 반복) 총 클래스 시간 (지금 멀리) = 4.8458080291748 (100,000 반복)

배열 시간 = 0.99573588371277 클래스 시간 = 1.1242771148682

총 배열 시간 (지금 멀리) = 4.6572148799896 (100,000 반복) 총 클래스 시간 (지금까지) = 5.9700801372528 (100,000 반복)

배열 시간 = 0.88518786430359 클래스 시간 = 1.1427340507507

총 배열 시간 (지금 멀리) = 5.5423986911774 (100,000 반복) 총 클래스 시간 (지금까지) = 7.1128082275391 (100,000 반복)

배열 시간 = 0.87605404853821 클래스 시간 = 0.95899105072021

총 배열 시간 (지금 멀리) = 6.4184486865997 (100,000 반복) 총 클래스 시간 (지금까지) = 8.071793177948 (100,000 반복)

배열 시간 = 0.73414516448975 클래스 시간 = 1.0223190784454

총 배열 시간 (지금 멀리) = 7.15258888442993 (100,000 반복) 총 클래스 시간 (지금까지) = 9.0941033333342 (100,000 반복)

배열 시간 = 0.95230412483215 클래스 시간 = 1.059828042984

총 배열 시간 (지금 멀리) = 8.1048839092255 (100,000 반복) 총 클래스 시간 (지금까지) = 10.153927326202 (100,000 반복)

배열 시간 = 0.75814390182495 클래스 시간 = 0.8445919265747

총 배열 시간 (지금 멀리) = 8.8630249500275 (100,000 반복) 총 클래스 시간 (지금 멀리) = 10.998482465744 (100,000 반복) 총 시간 :

총 배열 시간 = 8.8630249500275 (1,000,000 반복) 총 클래스 시간 = 10.998482465744 (1,000,000 반복)

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