By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,247 Members | 1,057 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,247 IT Pros & Developers. It's quick & easy.

Performance question - passing data between objects (PHP4-style OOP)

P: n/a
Hello

A class that composes the output of shop-related data gets some info
from the main shop class. Now I wonder whether it is faster to store the
info in the output class or get it from the main class whenever it is
needed:

class shop_main {
var $prices = null;
function &get_prices() {
if (is_null($this->prices)) {
$this->prices =& $this->db->getCol('SELECT id FROM shop_prices');
if (!is_array($this->prices)) $this->prices = array();
}
return $this->prices;
}
}

// case 1: store info in class
class shop_output {
var $prices = null;
var $main_shop_obj;
function do_something($product_id) {
if (is_null($this->prices)) {
// assume that main shop object is already set
$this->prices =& $this->main_shop_obj->get_prices();
}
foreach ($this->prices as $price_id) {
// do something...
}
}
}

// case 2: get info each time it is needed
class shop_output {
var $main_shop_obj;
function do_something($product_id) {
// assume that main shop object is already set
foreach ($this->main_shop_obj->get_prices() as $price_id) {
// do something...
}
}
}

BTW I also wonder whether it is appropriate to pass the prices by
reference here - I assume it is, but in an older thread on performance
Chung Leung stated that passing by reference can decrease performance in
some cases.

Thanks for a comment!
Markus
Nov 9 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Markus Ernst wrote:
Hello

A class that composes the output of shop-related data gets some info
from the main shop class. Now I wonder whether it is faster to store the
info in the output class or get it from the main class whenever it is
needed:

class shop_main {
var $prices = null;
function &get_prices() {
if (is_null($this->prices)) {
$this->prices =& $this->db->getCol('SELECT id FROM shop_prices');
if (!is_array($this->prices)) $this->prices = array();
}
return $this->prices;
}
}

// case 1: store info in class
class shop_output {
var $prices = null;
var $main_shop_obj;
function do_something($product_id) {
if (is_null($this->prices)) {
// assume that main shop object is already set
$this->prices =& $this->main_shop_obj->get_prices();
}
foreach ($this->prices as $price_id) {
// do something...
}
}
}

// case 2: get info each time it is needed
class shop_output {
var $main_shop_obj;
function do_something($product_id) {
// assume that main shop object is already set
foreach ($this->main_shop_obj->get_prices() as $price_id) {
// do something...
}
}
}

BTW I also wonder whether it is appropriate to pass the prices by
reference here - I assume it is, but in an older thread on performance
Chung Leung stated that passing by reference can decrease performance in
some cases.

Thanks for a comment!
Markus
Impossible to tell from your comments. There are way too many variables.

For instance - if your main shop class has 10 values and you need each
of them 50 times, and those values don't change, it's probably more
efficient to cache them in the output class.

OTOH, if you have 1M items in the main class which change frequently and
you only need 2 items from it, it's more efficient to get them from the
main class each time.

And Chung is correct. Many times passing by reference is faster, but
occasionally it's slower. However, that should not be a reason you
decide to pass by reference or not. Or if it is, it should be about
number 247 on your list.

The real question is - are you actually having performance problems, or
are you spinning your wheels on something which may or may not be a
problem? I suspect the latter.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Nov 9 '06 #2

P: n/a
Jerry Stuckle schrieb:
Markus Ernst wrote:
>Hello

A class that composes the output of shop-related data gets some info
from the main shop class. Now I wonder whether it is faster to store
the info in the output class or get it from the main class whenever it
is needed:

class shop_main {
var $prices = null;
function &get_prices() {
if (is_null($this->prices)) {
$this->prices =& $this->db->getCol('SELECT id FROM shop_prices');
if (!is_array($this->prices)) $this->prices = array();
}
return $this->prices;
}
}

// case 1: store info in class
class shop_output {
var $prices = null;
var $main_shop_obj;
function do_something($product_id) {
if (is_null($this->prices)) {
// assume that main shop object is already set
$this->prices =& $this->main_shop_obj->get_prices();
}
foreach ($this->prices as $price_id) {
// do something...
}
}
}

// case 2: get info each time it is needed
class shop_output {
var $main_shop_obj;
function do_something($product_id) {
// assume that main shop object is already set
foreach ($this->main_shop_obj->get_prices() as $price_id) {
// do something...
}
}
}

BTW I also wonder whether it is appropriate to pass the prices by
reference here - I assume it is, but in an older thread on performance
Chung Leung stated that passing by reference can decrease performance
in some cases.

Thanks for a comment!
Markus

Impossible to tell from your comments. There are way too many variables.

For instance - if your main shop class has 10 values and you need each
of them 50 times, and those values don't change, it's probably more
efficient to cache them in the output class.

OTOH, if you have 1M items in the main class which change frequently and
you only need 2 items from it, it's more efficient to get them from the
main class each time.
Thank you, this helps a lot as a guideline.
And Chung is correct. Many times passing by reference is faster, but
occasionally it's slower. However, that should not be a reason you
decide to pass by reference or not. Or if it is, it should be about
number 247 on your list.

The real question is - are you actually having performance problems, or
are you spinning your wheels on something which may or may not be a
problem? I suspect the latter.
Your suspection is correct. After I _had_ performance problems (30+
seconds execution time for displaying 20 or 30 items...) I started
caring for performance issues at all, and now I try to be aware of them
even before problems occur. With my poor technical background (I don't
have a basic IT education) this sometimes makes me spend too much effort
on questions of low priority. Thus, comments of the kind you posted are
very helpful for me, thanks!
Nov 9 '06 #3

P: n/a
Markus Ernst wrote:
Jerry Stuckle schrieb:
>Markus Ernst wrote:
>>Hello

A class that composes the output of shop-related data gets some info
from the main shop class. Now I wonder whether it is faster to store
the info in the output class or get it from the main class whenever
it is needed:

class shop_main {
var $prices = null;
function &get_prices() {
if (is_null($this->prices)) {
$this->prices =& $this->db->getCol('SELECT id FROM shop_prices');
if (!is_array($this->prices)) $this->prices = array();
}
return $this->prices;
}
}

// case 1: store info in class
class shop_output {
var $prices = null;
var $main_shop_obj;
function do_something($product_id) {
if (is_null($this->prices)) {
// assume that main shop object is already set
$this->prices =& $this->main_shop_obj->get_prices();
}
foreach ($this->prices as $price_id) {
// do something...
}
}
}

// case 2: get info each time it is needed
class shop_output {
var $main_shop_obj;
function do_something($product_id) {
// assume that main shop object is already set
foreach ($this->main_shop_obj->get_prices() as $price_id) {
// do something...
}
}
}

BTW I also wonder whether it is appropriate to pass the prices by
reference here - I assume it is, but in an older thread on
performance Chung Leung stated that passing by reference can decrease
performance in some cases.

Thanks for a comment!
Markus


Impossible to tell from your comments. There are way too many variables.

For instance - if your main shop class has 10 values and you need each
of them 50 times, and those values don't change, it's probably more
efficient to cache them in the output class.

OTOH, if you have 1M items in the main class which change frequently
and you only need 2 items from it, it's more efficient to get them
from the main class each time.


Thank you, this helps a lot as a guideline.
>And Chung is correct. Many times passing by reference is faster, but
occasionally it's slower. However, that should not be a reason you
decide to pass by reference or not. Or if it is, it should be about
number 247 on your list.

The real question is - are you actually having performance problems,
or are you spinning your wheels on something which may or may not be a
problem? I suspect the latter.


Your suspection is correct. After I _had_ performance problems (30+
seconds execution time for displaying 20 or 30 items...) I started
caring for performance issues at all, and now I try to be aware of them
even before problems occur. With my poor technical background (I don't
have a basic IT education) this sometimes makes me spend too much effort
on questions of low priority. Thus, comments of the kind you posted are
very helpful for me, thanks!
I understand. I've been programming since the late 60's, and have seen
my share of performance problems (think of what it was like to be on a
mainframe with 4,000 bytes - not 4K - of core memory, running at
something quite a bit less than 1Mhz clock rate).

And yes, you should always keep potential performance problems in mind
when programming. But I really don't worry about them until I get the
first cut at the program running and see if I have performance problems.

As an example - I wrote a fairly small C++ program with a lot of
recursive calculations (the theoretical max was 81! (81 factorial - 81 x
80 x 79 ... x 3 x 2 x 1) operations. The goal was to have it finish the
ops in something less than a couple of minutes on a 900Mhz laptop.

I went ahead and wrote it, not paying much attention to performance.
Results when I was done was every run was < 1 second. Mission accomplished.

Another case I had to parse out a rather large (5MB) html file in PHP.
The goal was to convert some huge tables to csv files for importing to a
spreadsheet. The first run took over 15 minutes. So at that time I
went back and optimized the code. Final results were around 20 seconds.

The bottom line was - I didn't waste any time on the first one because
it was already fast enough. The second one took me around 10% more time
to tweak and get the speed down. But that was much easier because I
already had the program working, and my design allowed me to easily
modify the code to close up the bottlenecks.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Nov 10 '06 #4

P: n/a
Jerry Stuckle schrieb:
Markus Ernst wrote:
>Jerry Stuckle schrieb:
[...]
>>The real question is - are you actually having performance problems,
or are you spinning your wheels on something which may or may not be
a problem? I suspect the latter.


Your suspection is correct. After I _had_ performance problems (30+
seconds execution time for displaying 20 or 30 items...) I started
caring for performance issues at all, and now I try to be aware of
them even before problems occur. With my poor technical background (I
don't have a basic IT education) this sometimes makes me spend too
much effort on questions of low priority. Thus, comments of the kind
you posted are very helpful for me, thanks!

I understand. I've been programming since the late 60's, and have seen
my share of performance problems (think of what it was like to be on a
mainframe with 4,000 bytes - not 4K - of core memory, running at
something quite a bit less than 1Mhz clock rate).

And yes, you should always keep potential performance problems in mind
when programming. But I really don't worry about them until I get the
first cut at the program running and see if I have performance problems.

As an example - I wrote a fairly small C++ program with a lot of
recursive calculations (the theoretical max was 81! (81 factorial - 81 x
80 x 79 ... x 3 x 2 x 1) operations. The goal was to have it finish the
ops in something less than a couple of minutes on a 900Mhz laptop.

I went ahead and wrote it, not paying much attention to performance.
Results when I was done was every run was < 1 second. Mission
accomplished.

Another case I had to parse out a rather large (5MB) html file in PHP.
The goal was to convert some huge tables to csv files for importing to a
spreadsheet. The first run took over 15 minutes. So at that time I
went back and optimized the code. Final results were around 20 seconds.

The bottom line was - I didn't waste any time on the first one because
it was already fast enough. The second one took me around 10% more time
to tweak and get the speed down. But that was much easier because I
already had the program working, and my design allowed me to easily
modify the code to close up the bottlenecks.
I actually started learning Java now - not because I am sure I will
write Java in the future, but because I hope that knowing a less
permissive, strictly typed, purely object oriented, compiled language
will help me write better PHP :-)
Nov 10 '06 #5

P: n/a
Markus Ernst wrote:
Jerry Stuckle schrieb:
>Markus Ernst wrote:
>>Jerry Stuckle schrieb:

[...]
>>>The real question is - are you actually having performance problems,
or are you spinning your wheels on something which may or may not be
a problem? I suspect the latter.

Your suspection is correct. After I _had_ performance problems (30+
seconds execution time for displaying 20 or 30 items...) I started
caring for performance issues at all, and now I try to be aware of
them even before problems occur. With my poor technical background (I
don't have a basic IT education) this sometimes makes me spend too
much effort on questions of low priority. Thus, comments of the kind
you posted are very helpful for me, thanks!


I understand. I've been programming since the late 60's, and have
seen my share of performance problems (think of what it was like to be
on a mainframe with 4,000 bytes - not 4K - of core memory, running at
something quite a bit less than 1Mhz clock rate).

And yes, you should always keep potential performance problems in mind
when programming. But I really don't worry about them until I get the
first cut at the program running and see if I have performance problems.

As an example - I wrote a fairly small C++ program with a lot of
recursive calculations (the theoretical max was 81! (81 factorial - 81
x 80 x 79 ... x 3 x 2 x 1) operations. The goal was to have it finish
the ops in something less than a couple of minutes on a 900Mhz laptop.

I went ahead and wrote it, not paying much attention to performance.
Results when I was done was every run was < 1 second. Mission
accomplished.

Another case I had to parse out a rather large (5MB) html file in PHP.
The goal was to convert some huge tables to csv files for importing to
a spreadsheet. The first run took over 15 minutes. So at that time I
went back and optimized the code. Final results were around 20 seconds.

The bottom line was - I didn't waste any time on the first one because
it was already fast enough. The second one took me around 10% more
time to tweak and get the speed down. But that was much easier
because I already had the program working, and my design allowed me to
easily modify the code to close up the bottlenecks.


I actually started learning Java now - not because I am sure I will
write Java in the future, but because I hope that knowing a less
permissive, strictly typed, purely object oriented, compiled language
will help me write better PHP :-)
Yep, Java is a good language, also. And I agree with you - the
techniques it uses can help quite a bit.

I've found it's always good to learn new languages (I stop counting at
15, many of which I no longer remember - and may no longer exist).
Different techniques can also lead you to different (and sometimes
better) approaches to a problem.

And I highly suspect you'll enjoy Java.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Nov 10 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.