문제
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 반복)