Month: June 2012

  • PHP array() is a little scary

    Push 100,000 elements onto a PHP array() where each element is a four element associative array (a hash in Perl speak). Here’s the data being pushed:

    array(
      'owner' => 100,
      'host' => 'www.example.com.co.uk',
      'path' => '/this/is/an/example/path.html',
      'hostkey' => '1111'
    )
    

    The memory grows by over 80 megabytes.

    Pushing takes less than a second or two but shifting off the first 1000 elements takes over 17 seconds on my machine.

    Now take that same data and create a basic FIFO class that has push() and shift() methods. Use pack() and unpack() to store the data in a long string. Total time to push 100,000 and shift the first 1000 elements is around 1 second. Total memory is 7 megabytes which is less than 10% of PHP’s internal array()’s consumption.

    PHP’s splFixedArray class which is advertised as mainly having a speed advantage doesn’t fair much better. With a fixed array created of 100,000 elements and loading and unloading the same associative array() it grows by 75 megs but is very fast at half a second. Just for fun I pushed 100,000 elements on an splFixedArray which are simply the values of the test associative array concatenated into a string and it’s still weighs in at 13 megabytes.

    Here’s the FIFO class:

    class wfArray {
            private $data = "";
            private $shiftPtr = 0;
            public function __construct($keys){
                    $this->keys = $keys;
            }
            public function push($val){ //associative array with keys that match those given to constructor
                    foreach($this->keys as $key){
                            $this->data .= pack('N', strlen($val[$key])) . $val[$key];
                    }
            }
            public function shift(){
                    $arr = array();
                    if(strlen($this->data) < 1){ return null; }
                    foreach($this->keys as $key){
                            $len = unpack('N', substr($this->data, $this->shiftPtr, 4));
                            $len = $len[1];
                            $arr[$key] = substr($this->data, $this->shiftPtr + 4, $len);
                            $this->shiftPtr += 4 + $len;
                    }
                    return $arr;
            }
    }
    

    Here’s the test script using the FIFO class with the array() tests commented out.

    require_once('wfArray.php');
    error_reporting(E_ALL);
    $p1 = memory_get_peak_usage();
    $stime = microtime(true);
    //$arr = array();
    $arr = new wfArray(array('owner', 'host', 'path', 'hostkey'));
    for($i = 0; $i < 100000; $i++){
            //array_push($arr, array(
            $arr->push(array(
                    'owner' => 100,
                    'host' => 'www.example.com.co.uk',
                    'path' => '/this/is/an/example/path.html',
                    'hostkey' => '1111'
                    ));
            if($i % 1000 == 0){ echo $i . "\n"; }
    }
    $i = 0;
    while($elem = $arr->shift()){
    //while($elem = array_shift($arr)){
            $i++;
            if($i > 1000){ break; }
            if(! ($elem['owner'] == 100 && $elem['host'] == 'www.example.com.co.uk' && $elem['path'] == '/this/is/an/example/path.html' && $elem['hostkey'] == '1111')){
                    die("Problem");
            }
    }
    echo "\nTotal time: " . sprintf('%.3f', microtime(true) - $stime) . "\n";
    $p2 = memory_get_peak_usage();
    echo "Grew: " . ($p2 - $p1) . "\n";
    
  • Hidden Data in The Spanish Economic Crisis

    Spain has been all over the press this weekend with a 100 Billion euro bailout agreed to by   Eurozone finance ministers. I spent the last three days in Spain and I find the coverage I’m reading somewhat disconnected with reality.

    I drove down to Madrid from where I live in Southern France and spent Thursday, Friday and Saturday morning there, then drove back home and spent Saturday evening in Pamplona where the San Fermin festival starts in a month with the running of the bulls.

    Madrid is a shining jewel in Europe. The city is immaculately clean and has a wonderful mix of new buildings like the Cuatro Torres that make for a spectacular modern skyline juxtaposed against gorgeous old buildings like the Royal Palace.

    Walking in the Parque del Oeste where the Egyptian temple of Debod was moved to save it from the Aswan Dam, the park is filled with locals who have come out at night for their evening walk. Kids playing, groups of older women or men walking together, lovers in a quiet secluded spot in the park. Everyone is happy and full of life.

    Driving around Spain there is an incredible amount of active road construction and the roads that aren’t being worked on are in great condition with many spectacular bridges.

    Pamplona was absolutely heaving with party-goers on Saturday night including a huge Spanish rock festival, packed bars and pubs and streets literally filled from wall to wall in the older part of town – and the newer part was full of locals out for their evening walk. I visited a heavy metal bar with an Iron Maiden cover band doing a terrible rendition of Maiden’s older stuff and the standing-room-only crowd loving every second of it.

    While in Madrid I got chatting to a local shopkeeper and went out on a limb and asked her about the informal or under-the-table economy in Spain. She explained that many people are employed off the books. I asked why, speculating that the tax in Spain is very high. She explained yes that’s one reason, but taxes are higher in Italy where she’s originally from. Another reason is to keep getting social benefits like a housing benefit. She also said it’s popular to pay someone only 70% of what they’re really paid into their bank account and the rest in cash to avoid tax.

    More evidence that there’s a thriving off-the-books economy is that when we stayed in Madrid, we rented self catering accommodation. The proprietor asked that we pay the roughly 200 euros bill in cash.

    All the economic indicators used to describe the “Spanish crisis” and provide rationales for bailing out spain or to predict how bad the “coming collapse” will be don’t take the informal economy into account. It also makes it difficult to understand the needs of the Spanish people, what the GDP really is, how dependent they really are on social programs and what Spain’s real ability is to service it’s debt.

    To some the informal economy in Spain may seem to be immoral because conventional wisdom holds that one should “pay your taxes” and put your money in a safe place like a bank. But the Spanish people seem to be discovering a way to live without banks and government visibility on how much they earn or what they do with their money. I suspect many of the government assistance programs are over subscribed and do little to serve their intended targets.

    It makes one wonder who the Eurozone is really bailing out.