At 04:05 29.05.2003, William N. Zanatta said: --------------------[snip]-------------------- > It is a known issue that function calls are expensive for the processor. > > The OOP let us better organize the code but, thinking in function (or >method) calls it may be more expensive than in the procedural form. > > My question is, has anyone made any tests regarding the performance of >OOP versus procedural language? Is it a good choice to code in OOP with >PHP ? --------------------[snip]--------------------
Recently we did some research for a decision on how to proceed with a project - basically the question was should we use objects for tata storage, or simple associative arrays and a static class handling array nodes. The testbed source is copied below. The test was run on RH Linux 7.2 running on a Dell Rackmount Server with 2x1GHz, 1GB memory, Apache 1.3.27, PHP 4.3.2. The numbers: 3.912186 secs (0.039122 msecs each): Created 100000 array entries 0.397721 secs (0.003977 msecs each): Write-Accessed 100000 array values 0.364761 secs (0.003648 msecs each): Read-Accessed 100000 array values 0.343353 secs (0.003434 msecs each): Deleted 100000 array values using store[idx] = null 0.302970 secs (0.003030 msecs each): Deleted 100000 array values using unset(store[idx]) ------------------------- 4.880921 secs (0.048809 msecs each): Created 100000 object entries 0.492642 secs (0.004926 msecs each): Write-Accessed 100000 object values using direct access 1.148577 secs (0.011486 msecs each): Write-Accessed 100000 object values using access method 0.465929 secs (0.004659 msecs each): Read-Accessed 100000 object values using direct access 0.977031 secs (0.009770 msecs each): Read-Accessed 100000 object values using access method 0.490641 secs (0.004906 msecs each): Deleted 100000 object values using store[idx] = null 0.298719 secs (0.002987 msecs each): Deleted 100000 object values using unset(store[idx]) Comparing the numbers (Array = 100%): Creating: 124.7% Write-Access (direct): 123.8% Write-Access (method): 314.9% Read-Access (direct): 127.7% Read-Access (method): 267.9% Deletion (set to null): 142.9% Deletion (using unset): 98.5% For a small number of objects the performance penalty may be minimal. However if you're dealing with a huge number of instances it may be worth considering different approaches. One interesting thing to note is that clearing an array entry using $array[$idx] = null; is between 20% - 40% slower than using unset($array[$idx]); function measure($start = null, $string = null, $passes = null) { $x = microtime(); if ($start) { list($s0, $s1) = explode(' ', $start); list($e0, $e1) = explode(' ', $x); $time = ($e0 + $e1) - ($s0 + $s1); if ($passes) $x = sprintf("%f secs (%f msecs each): %s\n", $time, ($time * 1000) / $passes, $string); else $x = sprintf("%f secs: %s\n", $time, $string); } return $x; } function &make_array() { $a = array( 'rid' => null, 'owid' => null, 'pid' => null, 'dcid' => null, 'dsid' => null, 'drid' => null, 'usg' => null, 'rtb' => null, 'idx' => null, 'env' => null, 'xid' => null, 'ci' => null, 'cr' => null, 'cd' => null, 'cts' => null, 'cs' => null, 'ctx' => null, 'cbl' => null, ); return $a; } class TEST { var $a; function TEST() { $this->a =& make_array(); } function &access($entry) { return $this->a[$entry]; } function set($entry, &$value) { $this->a[$entry] = $value; } } function runtest($cmd, $text) { global $LOOPS; global $astore; global $ostore; $code = <<< EOC \$x = measure(); for (\$i = 0; \$i < \$LOOPS; ++\$i) $cmd; echo measure(\$x, "$text"); EOC; eval($code); } function arcopy($x) { $a = array(); while (list($k, $v) = each ($x)) $a[$k] = $v; return $a; } $LOOPS = 100000; $astore = array(); $ostore = array(); runtest('$astore[] =& make_array()', 'Created $i array entries'); runtest('$astore[$i]["rid"] = $i', 'Write-Accessed $i array values'); runtest('$n = $astore[$i]["rid"]', 'Read-Accessed $i array values'); $astore2 = arcopy($astore); runtest('$astore[$i] = null', 'Deleted $i array values using store[idx] = null'); $astore = $astore2; runtest('unset($astore[$i])', 'Deleted $i array values using unset(store[idx])'); echo "-------------------------\n"; runtest('$ostore[] = new TEST()', 'Created $i object entries'); runtest('$ostore[$i]->a["rid"] = $i', 'Write-Accessed $i object values using direct access'); runtest('$ostore[$i]->set("rid", $i)', 'Write-Accessed $i object values using access method'); runtest('$n =& $ostore[$i]->a["rid"]', 'Read-Accessed $i object values using direct access'); runtest('$n =& $ostore[$i]->access("rid")', 'Read-Accessed $i object values using access method'); $ostore2 = arcopy($ostore); runtest('$ostore[$i] = null', 'Deleted $i object values using store[idx] = null'); $ostore = $ostore2; runtest('unset($ostore[$i])', 'Deleted $i object values using unset(store[idx])'); -- >O Ernest E. Vogelsinger (\) ICQ #13394035 ^ http://www.vogelsinger.at/ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php