3

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

场景一:

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

控制器

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>

场景二:

进行 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 个视图。

4

2 回答 2

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

于 2013-02-05T17:47:29.580 回答
0

恕我直言,控制器将相关资产移交给正确的视图。例如,如果您没有得到任何结果——“无结果”条件的操作过程——应该发生在控制器中。(而不是检查 $results 是否存在于您的视图中)

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

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

于 2013-02-04T20:26:27.597 回答