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

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

场景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个视图.

解决方法:

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

场景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框架的重点,但是在可接受的情况下,您可以使用逻辑来确定如何显示信息.在这种情况下,我只使用一个循环来根据需要继续吐出统一信息.此测试表明,进行最少量的视图调用更有效.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...