3

スケーリングパフォーマンスの問題の可能性を解決しようとしています。これらの2つのシナリオには、より明確なパフォーマンス上の利点がありますか?

シナリオ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エントリ、またはそれ以上であるとすると、2つのシナリオの間に明らかなパフォーマンスの違いがありますか?アプリケーションをモジュール化しすぎていませんか?私はできる限り多くのコードをリサイクルしようとしています。その結果、より多くのメソッドが少なくとも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 のビルトイン プロファイラーを使用して見つけたものは次のとおりです。

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 に答える