<?php
    
if ('php' == $_GET['showsource'])
    {
        
show_source($_SERVER['SCRIPT_FILENAME']);
        exit;
    }
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<!-- ### Titel, Meta-Angaben und Einbindung der Stylesheets ### -->
   <title>Benchmark 1: variable replacement</title>
   <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
   <link rel="stylesheet" href="info.css" type="text/css" />
</head>

<body>

<h1>Benchmark 1: variable replacement</h1>

<p>About 1MB data is created, parsed and displayed ... this might take a while. In this test we have a 10kb <a href="fastTemplate/test_1_1.html">text file</a> which has 21 variable in it. Different amount of variables is set in template engine, we measure how fast it can parse this text. If you choose to look at the source code of this site, you will find this text very often, because a template class is slower if it actually has to display the text. I put it in "&lt;!--  --&gt;" so it is not displayed here.</p>

<p>View <a href="tpl_bench_1.php?showsource=php">source code</a> of this benchmark.</p>

<hr />

<?php
    
if ('php' == $_GET['showsource'])
    {
        
show_source($_SERVER['SCRIPT_FILENAME']);
        exit;
    }

    
flush();

    
// set_time_limit(3600);

    
require_once('benchmark.class.php');
    
$bench = new benchmark();

    require_once(
'php_heredoc/search_and_replace_with_php.php');
    require_once(
'fastTemplate/class.FastTemplate.php3');
    
define('SMARTY_DIR''smarty/smarty-2.6.9/');
    require_once(
SMARTY_DIR 'Smarty.class.php');
    require_once(
'vlib/vlibTemplate.php');
    require_once(
'tbs/tbs_class.php');
    require_once(
'ets/ets.php');
    require_once(
'patTemplate/patTemplate.php');

    
$run_1_1 10;
    
$run_1_2 10;
    
$run_1_3 5;

    
mt_srand((double)microtime()*1000000);

    
$templates = Array(
        
'php_heredoc' => 'PHP: HereDoc syntax',
        
'fast' => 'FastTemplate',
        
'smarty' => 'Smarty',
        
'vlib' => 'vlibTemplate',
        
'tbs' => 'TinyButStrong',
        
'ets' => 'Easy Template System',
        
'pattemplate' => 'patTemplate'
    
);

    foreach (
$templates as $id => $name)
    {
        
$bench->run($run_1_1$id.'_1_1');
        
$bench->add_result($bench->get(), $name);
    }

    
$bench->stats();
    
$bench->print_stats("TEST 1.1 :: 20 registered vars :: $run_1_1 iterations");
    
$bench->reset();

    
flush();

    foreach (
$templates as $id => $name)
    {
        
$bench->run($run_1_2$id.'_1_2');
        
$bench->add_result($bench->get(), $name);
    }

    
$bench->stats();
    
$bench->print_stats("TEST 1.2 :: 5 registered vars :: $run_1_2 iterations");
    
$bench->reset();

    
flush();

    foreach (
$templates as $id => $name)
    {
        
$bench->run($run_1_3$id.'_1_3');
        
$bench->add_result($bench->get(), $name);
    }

    
$bench->stats();
    
$bench->print_stats("TEST 1.3 :: 100 registered vars :: $run_1_3 iterations");
    
$bench->reset();

    
/**********************************************************
    **    RUN 1.1  **********************************************
    ***********************************************************/

    
function php_heredoc_1_1()
    {
        for (
$i 0$i 20$i++)
        {
            
$test_array["var$i"] = 'HERE' mt_rand();
        }

        
search_and_replace_with_php($test_array);
    }

    function 
smarty_1_1()
    {
        
$tpl = new Smarty;
        
$smarty->config_dir SMARTY_DIR;
        
$tpl->template_dir './smarty/templates';
        
$tpl->compile_dir './smarty/templates_c';
        
$tpl->compile_check TRUE;

        for (
$i 0$i 20$i++)
        {
            
$tpl->assign("var$i"'SMTY' mt_rand());
        }

        
$tpl->display('test_1_1.html');
    }

    function 
vlib_1_1()
    {
        
$tpl = new vlibTemplateCache('vlib/test_1_1.html');
    
        for (
$i 0$i 20$i++)
        {
            
$tpl->setvar("var$i"'VLIB' mt_rand());
        }
    
        
$tpl->pparse();
    }
    
    function 
fast_1_1()
    {
        
$tpl = new FastTemplate('fastTemplate'); // template dir

        
$tpl->define(array('main'=>'test_1_1.html'));

        for (
$i 0$i 20$i++)
        {
            
$tpl->assign(array("var$i" => 'FAST' mt_rand()));
        }

        
$tpl->parse('main', array('main'));
        
$tpl->FastPrint();
    }

    function 
tbs_1_1()
    {
        global 
$tbs0$tbs1$tbs2$tbs3$tbs4$tbs5$tbs6$tbs7$tbs8$tbs9$tbs10$tbs11$tbs12$tbs13$tbs14$tbs15$tbs16$tbs17$tbs18$tbs19;

        
$tpl = new clsTinyButStrong;
        
$tpl->LoadTemplate('tbs/test_1_1.html');

        for (
$i 0$i 20$i++)
        {
            
$test_array "tbs$i";
            $
$test_array 'TINY' mt_rand(); // $tbs0, $tbs1, etc.
        
}

        
$tpl->Show(TBS_OUTPUT);
    }

    function 
ets_1_1()
    {
        for (
$i 0$i 20$i++)
        {
            
$tpl["var$i"] = 'EASY' mt_rand();
        }

        
printt((object) $tpl'ets/test_1_1.html');
    }

    function 
pattemplate_1_1()
    {
        
$tpl = new patTemplate();

        
$tpl->setBasedir('patTemplate');
        
$tpl->readTemplatesFromFile('test_1_1.html');

        for (
$i 0$i 20$i++)
        {
            
$tpl->addVar('main'"VAR$i"'patT' mt_rand());
        }

        
$tpl->displayParsedTemplate();
    }


    
/**********************************************************
    **    RUN 1.2  **********************************************
    ***********************************************************/

    
function php_heredoc_1_2()
    {
        for (
$i 0$i 5$i++)
        {
            
$test_array["var$i"] = 'HERE' mt_rand();
        }

        
search_and_replace_with_php($test_array);
    }

    function 
smarty_1_2()
    {
        
$tpl = new Smarty;
        
$smarty->config_dir SMARTY_DIR;
        
$tpl->template_dir './smarty/templates';
        
$tpl->compile_dir './smarty/templates_c';
        
$tpl->compile_check TRUE;

        for (
$i 0$i 5$i++)
        {
            
$tpl->assign("var$i"'SMTY' mt_rand());
        }

        
$tpl->display('test_1_1.html');
    }

    function 
vlib_1_2()
    {
        
$tpl = new vlibTemplateCache('vlib/test_1_1.html');

        for (
$i 0$i 5$i++)
        {
            
$tpl->setvar("var$i"'VLIB' mt_rand());
        }

        
$tpl->pparse();
    }

    function 
fast_1_2()
    {
        
$tpl = new FastTemplate('fastTemplate'); // template dir

        
$tpl->define(array('main'=>'test_1_1.html'));

        for (
$i 0$i 5$i++)
        {
            
$tpl->assign(array("var$i" => 'FAST' mt_rand()));
        }

        
$tpl->parse('main', array('main'));
        
$tpl->FastPrint();
    }

    function 
tbs_1_2()
    {
        global 
$tbs0$tbs1$tbs2$tbs3$tbs4;

        
$tpl = new clsTinyButStrong;
        
$tpl->LoadTemplate('tbs/test_1_1.html');

        for (
$i 0$i 5$i++)
        {
            
$test_array "tbs$i";
            $
$test_array 'TINY' mt_rand(); // $tbs0, $tbs1, etc.
        
}

        
$tpl->Show(TBS_OUTPUT);
    }

    function 
ets_1_2()
    {
        for (
$i 0$i 5$i++)
        {
            
$tpl["var$i"] = 'EASY' mt_rand();
        }

        
printt((object) $tpl'ets/test_1_1.html');
    }

    function 
pattemplate_1_2()
    {
        
$tpl = new patTemplate();

        
$tpl->setBasedir('patTemplate');
        
$tpl->readTemplatesFromFile('test_1_1.html');

        for (
$i 0$i 5$i++)
        {
            
$tpl->addVar('main'"VAR$i"'patT' mt_rand());
        }

        
$tpl->displayParsedTemplate();
    }

    
/**********************************************************
    **    RUN 1.3  **********************************************
    ***********************************************************/

    
function php_heredoc_1_3()
    {
        for (
$i 0$i 100$i++)
        {
            
$test_array["var$i"] = 'HERE' mt_rand();
        }

        
search_and_replace_with_php($test_array);
    }

    function 
smarty_1_3()
    {
        
$tpl = new Smarty;
        
$smarty->config_dir SMARTY_DIR;
        
$tpl->template_dir './smarty/templates';
        
$tpl->compile_dir './smarty/templates_c';
        
$tpl->compile_check TRUE;

        for (
$i 0$i 100$i++)
        {
            
$tpl->assign("var$i"'SMTY' mt_rand());
        }

        
$tpl->display('test_1_1.html');
    }

    function 
vlib_1_3()
    {
        
$tpl = new vlibTemplateCache('vlib/test_1_1.html');

        for (
$i 0$i 100$i++)
        {
            
$tpl->setvar("var$i"'VLIB' mt_rand());
        }

        
$tpl->pparse();
    }
    
    function 
fast_1_3()
    {
        
$tpl = new FastTemplate('fastTemplate'); // template dir

        
$tpl->define(array('main'=>'test_1_1.html'));

        for (
$i 0$i 100$i++)
        {
            
$tpl->assign(array("var$i" => 'FAST' mt_rand()));
        }

        
$tpl->parse('main', array('main'));
        
$tpl->FastPrint();
    }

    function 
tbs_1_3()
    {
        global 
$tbs0$tbs1$tbs2$tbs3$tbs4$tbs5$tbs6$tbs7$tbs8$tbs9$tbs10$tbs11$tbs12$tbs13$tbs14$tbs15$tbs16$tbs17$tbs18$tbs19;

        
$tpl = new clsTinyButStrong;
        
$tpl->LoadTemplate('tbs/test_1_1.html');

        for (
$i 0$i 100$i++)
        {
            
$test_array "tbs$i";
            $
$test_array 'TINY' mt_rand(); // $tbs0, $tbs1, etc.
        
}

        
$tpl->Show(TBS_OUTPUT);
    }

    function 
ets_1_3()
    {
        for (
$i 0$i 100$i++)
        {
            
$tpl["var$i"] = 'EASY' mt_rand();
        }

        
printt((object) $tpl'ets/test_1_1.html');
    }

    function 
pattemplate_1_3()
    {
        
$tpl = new patTemplate();

        
$tpl->setBasedir('patTemplate');
        
$tpl->readTemplatesFromFile('test_1_1.html');

        for (
$i 0$i 100$i++)
        {
            
$tpl->addVar('main'"VAR$i"'patT' mt_rand());
        }

        
$tpl->displayParsedTemplate();
    }
?>

<p>To show the speed of template engines, I integrated the PHP heredoc syntax.</p>

<p>Why is ETS so fast? ETS does not work with <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" target="_blank">OOP</a>. It uses functions not methods to exchange data between the PHP script and the template. I can only assume this different aproach to programming is a reason for the high performance.</p>

<p>Why are Smarty and <a href="/" target="_blank">vlibTemplate</a> so fast? Smarty and <a href="/" target="_blank">vlibTemplate</a> are using <b>compiled templates</b>. E.g. Smarty PHP files are using fast "for ... endfor;" and "echo" statements. Since this PHP file is only changed if the template is changed, this is extremly fast <b>and it does not matter if the (mysql)data is changed</b>. This makes Smarty the fastes template engine available on Windows. <a href="/" target="_blank">vlibTemplate</a> is faster than Smarty on most Linux servers I tested. But that may change, since Smarty is released more often than vLIB.</p>

<p>If you do not have the time to take a deeper look into Smarty, ETS or other <a href="http://en.wikipedia.org/wiki/Template_engine" target="_blank">template engines</a> or <a href="/" target="_blank">vlibTemplate</a> I suggest you use <a href="/" target="_blank">vlibTemplate</a>. In my humble opinion vLIB (<a href="/docs/multihtml/vlibtemplate/table_of_content.html" target="_blank">vlibTemplate</a>, <a href="/docs/multihtml/vlibdate/table_of_content.html" target="_blank">vlibDate</a>, <a href="/docs/multihtml/vlibmimemail/table_of_content.html" target="_blank">vlibMimeMail</a>) is one of the best packages (3 classes) I have ever worked with.</p>

</body>
</html>