2D diziler vs Sınıflar

9 Cevap php

Hangi PHP, 2B dizi ya da bir sınıfta kullanmak daha iyidir? Ben bu demek ne bir örnek ekledim.

// 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;

Birisi gelip sınıfları çok yavaş olduğunu göstermektedir olmadığını varsayarak, bu sınıf kazanır gibi görünüyor.

Ben sadece hepsini upvoted ettik ben kabul etmelidir cevap fikrim yok ettik.


Ve ben şimdi iki yakın özdeş sayfaları, (bu soru yayınlanmıştır önce yazılmış) 2D dizi kullanarak bir ve bir sınıfını kullanarak şimdi bir tane yazdım ve sınıf çok güzel kod üretir söylemeliyim. Ben çok havai oluşturulan olacak nasıl hiçbir fikrim yok ama kodun kendisinde iyileşme rakip olacak şüpheliyim.

Bana daha iyi bir programcı olmak için yardımcı olduğunuz için teşekkür ederiz.

9 Cevap

Yukarıda inşa ettik "sınıfı" Çoğu insan, diğer dillerde bir struct kullanmak ne olduğunu. Ben nesneleri başlatmasını burada muhtemelen daha pahalı, biraz sadece eğer. Şüpheli olsa ben, performans sonuçları PHP nelerdir emin değilim

Bu maliyeti nispeten düşük ise, benim görüşüme göre, nesneleri yönetmek için biraz daha kolay IS, söyleniyor.

I'm only saying the following based on the title and your question, but: Bear in mind that classes provide the advantage of methods and access control, as well. So if you wanted to ensure that people weren't changing weights to negative numbers, you could make the weight field private and provide some accessor methods, like getWeight() and setWeight(). Inside setWeight(), you could do some value checking, like so:

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

Bu 'iyi' demek tam olarak ne bağlıdır. Ben (en azından benim görüşüme göre) temiz kod için yapar bulmak çünkü ben (sınıflarını kullanarak) nesne yönelimli bir şekilde çıkmak istiyorum. Ancak, hız cezaları o seçeneğin ne olabileceğinden emin değilim.

Genel olarak, ben bu kuralı uygulayın:

Birden çok uygulama bölümleri veri yapısını kullanırsanız 1) bir sınıf olun.

Eğer uygulamanın bir parçası veri hızlı işleme için kullanıyorsanız 2) bir 2D array olun.

Ben Herhalde sınıfları ile gitmek istiyorum ama soru, bir sınıfın maliyeti ne olduğunu burada var olandan daha karmaşık bir şey için çoğunlukla düşünüyorum hız, değil mi?

Bu erken optimizasyon gibi görünüyor. Başvurunuz iki şekilde vurmak herhangi bir gerçek dünya performansını almaya gidiyor, ama bir sınıfını kullanarak Eğer alıcı ve ayarlayıcı yöntemleri kullanmak ve genellikle kod encapsulation ve kod yeniden kullanım için daha iyi olacak sağlar değildir.

Dizilerle kodunu okumak ve korumak için daha zor olarak maliyet üstlenmeden konum, sen birim olarak kolayca ve iyi bir sınıf yapısına sahip diğer geliştiriciler onu almak gerekiyorsa daha kolay anlamak için bulmalısınız kod test edemez.

Daha sonra bu işlemek için başka yöntemler eklemeniz gerektiğinde ve genişletmek için bir mimariye sahip olmayacaktır.

Eğer varsa sınıfı OO açısından gerçek bir sınıf değil - onun sadece örnek değişkenleri yer almak contructed edilmiştir.

O dedi - Sizin örnekte onun sadece bir stil şey - Propably çok sorunu hızda yoktur.

Intresting bit - gerçek bir "insan" sınıf olarak nesneyi contsrtucted eğer - ve kişi sınıfının isteyebilirsiniz diğer nitelikleri ve eylemleri hakkında thinkng - kod yazımı - - o zaman bir stil performans değil sadece çarpacaktır ama Ayrıca performansını hızlandırmak.

Kodunuz bu niteliklerin (isim / boy / ağırlık) üzerinde işlem fonksiyonların çok kullanır, o kullanarak sınıf iyi bir seçenek olabilir.

Eğer diziler için sadece yedek olarak sınıfları kullanırsanız Teifion, hiçbir yerde yakın OOP vardır. OOP özü nesneler bilgi ve sorumluluğa sahip olduğunu, aslında şeyler yapmak ve diğer sınıflarla işbirliği olduğunu. Sizin nesneler ancak onlar kalıcılık sağlayıcıları (veritabanından doğru / dan kendilerini almak / saklamak için nasıl nesneler) için iyi bir aday gibi görünüyor, sadece bilgi ve tembel tembel mevcut olandan başka bir şey yapamaz.

Da, performansı hakkında endişe etmeyin. PHP nesneleri hızlı ve hafiftir ve genel olarak performans çok abartılıyor. Bazı karanlık, sert debug ile program mikrosaniye kaydedin ve parça kod düzeltmek için daha doğru bir yaklaşım kullanarak bir programcı olarak zaman kazanmak için ucuz.

Sınıflar vs Zaman dizileri onları sadece örneklilik sınamak En testler. Aslında onlarla bir şeyler yapmak için başladığınızda.

Ben performansı çok daha iyi oldu çünkü sadece diziler kullanılan bir "saf" idi. (Onlar programcı kolay olsa) sınıfları kullanarak değil ekstra zorluk haklı kendimi haklı çıkarmak için aşağıdaki kodu yazdı

Sadece sonuçlara çok şaşırdım diyelim!

    <?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']);
}

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

?>

test reads: 1 test assignments: 1 test globals: 1 test functions: 1

Array time = 1.58905816078 Class time = 1.11980104446 Total Array time (so far) = 1.58903813362(100,000 iterations) Total Class time (so far) = 1.11979603767(100,000 iterations)

Array time = 1.02581000328 Class time = 1.22492313385 Total Array time (so far) = 2.61484408379(100,000 iterations) Total Class time (so far) = 2.34471416473(100,000 iterations)

Array time = 1.29942297935 Class time = 1.18844485283 Total Array time (so far) = 3.91425895691(100,000 iterations) Total Class time (so far) = 3.5331492424(100,000 iterations)

Array time = 1.28776097298 Class time = 1.02383089066 Total Array time (so far) = 5.2020149231(100,000 iterations) Total Class time (so far) = 4.55697512627(100,000 iterations)

Array time = 1.31235599518 Class time = 1.38880181313 Total Array time (so far) = 6.51436591148(100,000 iterations) Total Class time (so far) = 5.94577097893(100,000 iterations)

Array time = 1.3007349968 Class time = 1.07644081116 Total Array time (so far) = 7.81509685516(100,000 iterations) Total Class time (so far) = 7.02220678329(100,000 iterations)

Array time = 1.12752890587 Class time = 1.07106018066 Total Array time (so far) = 8.94262075424(100,000 iterations) Total Class time (so far) = 8.09326195717(100,000 iterations)

Array time = 1.08890199661 Class time = 1.09139609337 Total Array time (so far) = 10.0315177441(100,000 iterations) Total Class time (so far) = 9.18465089798(100,000 iterations)

Array time = 1.6172170639 Class time = 1.14714384079 Total Array time (so far) = 11.6487307549(100,000 iterations) Total Class time (so far) = 10.3317887783(100,000 iterations)

Array time = 1.53738498688 Class time = 1.28127002716 Total Array time (so far) = 13.1861097813(100,000 iterations) Total Class time (so far) = 11.6130547523(100,000 iterations)

TOTAL TIMES: Total Array time = 13.1861097813(1,000,000 iterations) Total Class time = 11.6130547523(1,000,000 iterations)

Yani, her iki şekilde fark oldukça ihmal edilebilir düzeydedir. Ben size çok küresel şeyler erişen başladığınızda, sınıflar aslında biraz daha hızlı hale bulabilirsiniz suprized edildi.

Ama, bana güven için kendini çalıştırmak yok. Ben şahsen artık hissediyorum tamamen suçluluk benim yüksek performanslı uygulamalarda sınıflarını kullanma hakkında ücretsiz. : D

@ Richard Varno

Ben tam kodu (sonra küçük hatalar düzeltildi) Ran, ve senden daha çok farklı sonuçlar var. Sınıflar 5.3.17 yüklemek benim PHP çok koştu.

Array time = 0.69054913520813 Class time = 1.1762700080872

Total Array time (so far) = 0.69054508209229(100,000 iterations) Total Class time (so far) = 1.1762590408325(100,000 iterations)

Array time = 0.99001502990723 Class time = 1.22034907341

Total Array time (so far) = 1.6805560588837(100,000 iterations) Total Class time (so far) = 2.3966031074524(100,000 iterations)

Array time = 0.99191808700562 Class time = 1.2245700359344

Total Array time (so far) = 2.6724660396576(100,000 iterations) Total Class time (so far) = 3.6211669445038(100,000 iterations)

Array time = 0.9890251159668 Class time = 1.2246470451355

Total Array time (so far) = 3.661484003067(100,000 iterations) Total Class time (so far) = 4.8458080291748(100,000 iterations)

Array time = 0.99573588371277 Class time = 1.1242771148682

Total Array time (so far) = 4.6572148799896(100,000 iterations) Total Class time (so far) = 5.9700801372528(100,000 iterations)

Array time = 0.88518786430359 Class time = 1.1427340507507

Total Array time (so far) = 5.5423986911774(100,000 iterations) Total Class time (so far) = 7.1128082275391(100,000 iterations)

Array time = 0.87605404853821 Class time = 0.95899105072021

Total Array time (so far) = 6.4184486865997(100,000 iterations) Total Class time (so far) = 8.0717933177948(100,000 iterations)

Array time = 0.73414516448975 Class time = 1.0223190784454

Total Array time (so far) = 7.1525888442993(100,000 iterations) Total Class time (so far) = 9.0941033363342(100,000 iterations)

Array time = 0.95230412483215 Class time = 1.059828042984

Total Array time (so far) = 8.1048839092255(100,000 iterations) Total Class time (so far) = 10.153927326202(100,000 iterations)

Array time = 0.75814390182495 Class time = 0.84455919265747

Total Array time (so far) = 8.8630249500275(100,000 iterations) Total Class time (so far) = 10.998482465744(100,000 iterations) TOTAL TIMES:

Total Array time = 8.8630249500275(1,000,000 iterations) Total Class time = 10.998482465744(1,000,000 iterations)