CodeIgniter性能加载视图多次vs视图中的循环

时间:2013-02-04 16:11:46

标签: php performance codeigniter templates variable-assignment

我正在尝试解决可能的扩展性能问题。这两种情况是否有更明确的性能优势:

场景1:

多次调用加载视图并每次传递少量数据

控制器

public function index()
{
    $this->load->view('header');
    $this->load->view('table_head');
    $results = $this->db->select('*')->from('table')->get()->result_array();
    foreach ($results as $key)
    {
        $this->load->view('table_row', $key);
    }
    $this->load->view('table_foot');
    $this->load->view('footer');
}

查看table_head

<table>
    <thead>
        <tr>
            <th>...</th>
            <th>...</th>
            ...
        </tr>
    </thead>
    <tbody>

查看table_row

        <tr>
            <td><?php echo $var_a; ?></td>
            <td><?php echo $var_b; ?></td>
            ...
        </tr>

查看Table_foot

    </tbody>
    <tfoot>
        <tr>
            <td>...</td>
            <td>...</td>
            ...
        </tr>
    </tfoot>
</table>

场景2:

进行1次调用以加载视图并传递大量数据

控制器

public function index()
{
    $this->load->view('header');
    $this->data['results'] = $this->db->select('*')->from('table')->get()->result_array();
    $this->load->view('table', $this->data);
    $this->load->view('footer');
}

查看表格

...
<table>
    <thead>Header Info...</thead>
    <tbody>
        <?php foreach ($results as $key): ?>
            <tr>echo row information as needed</tr>
        <?php endforeach; ?>
    </tbody>
<table>
...

我一直在使用方案1,因为它有助于保持我的应用程序模块化并通过在控制器中保持逻辑循环来保持MVC格式。但是说SQL调用的结果是1000个条目,甚至更多,这两个场景之间是否存在明显的性能差异?我是否试图使我的应用程序过于模块化?我确实尝试尽可能多地回收我的代码,结果我的方法会加载至少8个视图。

2 个答案:

答案 0 :(得分:5)

好吧,为了这些测试目的,我打破了一个小脚本来为我的桌子充气。以下是我的小测试的结果。为了使测试保持等效,我只更改我正在显示的视图。

场景1

控制器:

public function results()
{
    $this->load->view('headers/header', $this->default_lib->viewdata());
    $this->load->view('body_bits/bodyopen');
    $this->title['title'] = 'Testing Tesults';
    $this->title['link'] = 'tests';
    $this->title['link_text'] = 'Back to Tests';
    $this->load->view('body_bits/page_title', $this->title);
    $this->load->view('tests/results_open');

    $results = $this->db->select('*')->
        from('test_results')->
        where('software', 'nwralpha')->
        order_by('time', 'ASC')->
        //limit('10')->
        get()->result_array();
    foreach ($results as $key)
    {
        $this->data['name'] = ucwords($this->ion_auth->user($key['user_id'])->row()->username);
        $this->data['time_taken'] = $key['time'];
        $this->data['test_taken'] = $key['test_type'];
        $this->data['common'] = ($key['common_codes'] == 1) ? 'Common Code List' : 'Full Code List';
        $this->data['date'] = $key['date'];

        $this->load->view('tests/results', $this->data);
    }

    $this->load->view('tests/results_close');
    $this->load->view('body_bits/bodyclose');
    $this->load->view('footers/footer');
}

查看

<tr>
    <td><?php echo $name; ?></td>
    <td><?php echo $time_taken; ?></td>
    <td><?php echo $test_taken; ?></td>
    <td><?php echo $common; ?></td>
    <td><?php echo $date; ?></td>
</tr>

场景2

控制器:

public function results()
{
    $this->load->view('headers/header', $this->default_lib->viewdata());
    $this->load->view('body_bits/bodyopen');
    $this->title['title'] = 'Testing Tesults';
    $this->title['link'] = 'tests';
    $this->title['link_text'] = 'Back to Tests';
    $this->load->view('body_bits/page_title', $this->title);
    $this->load->view('tests/results_open');

    $results = $this->db->select('*')->
        from('test_results')->
        where('software', 'nwralpha')->
        order_by('time', 'ASC')->
        //limit('10')->
        get()->result_array();

    $this->data['results'] = $results;
    $this->load->view('tests/resultsloop', $this->data);

    $this->load->view('tests/results_close');
    $this->load->view('body_bits/bodyclose');
    $this->load->view('footers/footer');
}

查看

<?php foreach ($results as $key): ?>
<tr>
    <td><?php echo ucwords($this->ion_auth->user($key['user_id'])->row()->username); ?></td>
    <td><?php echo $key['time']; ?></td>
    <td><?php echo $key['test_type']; ?></td>
    <td><?php echo $key['common_codes']; ?></td>
    <td><?php echo $key['date']; ?></td>
</tr>
<?php endforeach; ?>

结果

我用1004个结果和11004个结果测试了这两个例子,这是我使用CodeIgniter内置的Profiler找到的内容

1004结果

场景1平均加载时间:1.94462秒 场景2平均加载时间:1.1723秒

11004结果

场景1平均加载时间:19.78867秒 场景2平均加载时间:11.81502秒

这意味着什么

对于其他只想知道答案而不读完这篇文章的人:
虽然逻辑和HTML的分离是MVC框架的重点,但是在可接受的情况下,您可以使用逻辑来确定如何显示信息。在这种情况下,我只使用一个循环来根据需要继续吐出统一信息。此测试表明,进行最少量的视图调用效率更高。

答案 1 :(得分:0)

控制器将相关资产移交给正确的视图。 例如,如果你没有得到任何结果 - “无结果”条件的行动过程 - 应该在控制器中发生。 (与检查视图中是否存在$ results相比)

逻辑 - 我们如何显示结果? - 发生在视图中。控制器传递$ results,然后View负责显示这些结果的方式。在场景#1中,您必须进入控制器,才能对页面设计进行更改。

当$结果太大时......然后使用分页。