Re: Pointers For Newbies, Reminders For Oldies
| From: | Ashley Sheridan | Date: | Sat, 30 Jan 2010 13:18:40 +0000 |
| Subject: | Re: Pointers For Newbies, Reminders For Oldies | ||
| References: | 1 2 3 4 5 6 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-301690@lists.php.net to get a copy of this message | ||
On Sat, 2010-01-30 at 13:02 +1100, clancy_1@cybec.com.au wrote:
> On Thu, 28 Jan 2010 10:02:56 -0500, robert@interjinn.com (Robert Cummings) wrote:
>
>
> >I don't know what you guys are doing wrong but the following should be
> >the correct behaviour:
> >
> ><?php
> >
> >function get_memory( $init=false )
> >{
> > static $base = null;
> > if( $base === null || $init )
> > {
> > $base = memory_get_usage();
> > }
> >
> > return memory_get_usage() - $base;
> >}
> >
> >function simple_access( $data )
> >{
> > $foo = $data[100];
> > echo 'Memory: '.get_memory().' (simple access)'."\n";
> >}
> >
> >function foreach_value_access( $data )
> >{
> > foreach( $data as $value )
> > {
> > $foo = $value;
> > break;
> > }
> > echo 'Memory: '.get_memory().' (foreach value
> > access)'."\n";
> >}
> >
> >function foreach_key_access( $data )
> >{
> > foreach( $data as $key => $value )
> > {
> > $foo = $key;
> > $foo = $value;
> > break;
> > }
> > echo 'Memory: '.get_memory().' (foreach key/value
> > access)'."\n";
> >}
> >
> >function modify_single_access( $data )
> >{
> > $data[100] = str_repeat( '@', 10000 );
> > echo 'Memory: '.get_memory().' (modify single
> > access)'."\n";
> >}
> >
> >function modify_all_access( $data )
> >{
> > for( $i = 0; $i < 1000; $i++ )
> > {
> > $data[$i] = str_repeat( '@', 10000 );
> > }
> >
> > echo 'Memory: '.get_memory().' (modify all
> > access)'."\n";
> >}
> >
> >
> >get_memory( true );
> >
> >$data = array();
> >for( $i = 0; $i < 1000; $i++ )
> >{
> > $data[$i] = str_repeat( '#', 10000 );
> >}
> >
> >echo 'Memory: '.get_memory().' (data initialized)'."\n";
> >
> >simple_access( $data );
> >foreach_value_access( $data );
> >foreach_key_access( $data );
> >modify_single_access( $data );
> >modify_all_access( $data );
> >
> >?>
> >
> >I get the following output (PHP 5.2.11 from command-line):
> >
> > Memory: 10160768 (data initialized)
> > Memory: 10161008 (simple access)
> > Memory: 10161104 (foreach value access)
> > Memory: 10161240 (foreach key/value access)
> > Memory: 10267312 (modify single access)
> > Memory: 20321576 (modify all access)
> >
> >I don't double up on memory consumption until I force the write onto
> >every element... this is expected because internally every array element
> >is individually subject to the Copy-On-Write (COW) principle since each
> >element is internally stored as a zval just like the array itself.
>
> Thanks for this. I was just revising a bit of code to insert some extra entries into an
> array. Previously I had opened a new array, copied the data up to the insertion point into
> it, put in the new entry, then copied the tail, then renamed the new array. After reading
> this, I realise the correct procedure was to copy the existing data into a temporary
> array, insert the new entry in the existing array, and then copy the tail from the copy
> back into the working data.
>
> This way only the data in the tail actually has to be copied, rather than the whole array.
>
Erm, what about array_splice()? You can use that to insert items into an
array at any point you want.
Thanks,
Ash
http://www.ashleysheridan.co.uk