Где логика обработки формы принадлежит веб-приложения MVC?

Время выполнения зависит от количества выполненных инструкций. Инструкции предназначены для доступа к памяти (a [i]), суммирования (sum + = a [i]) и управления циклами (I ++, ветвь).

Если количество итераций уменьшается, управление циклами сокращается и время выполнения соответственно. То, что вы рассматриваете, является частным случаем классического метода оптимизации кода, называемого «развертывание цикла».

Вот модифицированная версия вашего кода.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define profile(x, fn, n) {\
    start = clock(); \
    sum = 0; \
    fn(x, n); \
    time = (clock() - start) / CLOCKS_PER_SEC; \
}

#define sum2ptr(x, n) {\
    for (int i = 0, j = n-1; i < j; i++, j--) { \
        sum += x[i]; \
        sum += x[j]; \
    } \
}


#define sum1ptr(x, n) {\
    for (int i = 0; i < n; i++) \
    sum += x[i]; \
}

#define sum3ptr(x, n) {\
    for (int i = 0; i < n; i+=4){               \
    sum += x[i]; \
    sum += x[i+1]; \
    sum += x[i+2]; \
    sum += x[i+3]; \
  } \
}

#define SIZE 100000000

int main(void)
{
    double start, time = 0;
    int sum = 0;
    int *a = (int*)malloc(SIZE * sizeof(int));

    for (int i = 0; i < SIZE; i++) 
        a[i] = ((i * 2) + 3) % SIZE;

    profile(a, sum1ptr, SIZE);
    printf("%lf (regular)\n", time);
    profile(a, sum2ptr, SIZE);
    printf("%lf (unrolled twice)\n", time);
    profile(a, sum3ptr, SIZE);
    printf("%lf (unrolled 4)\n", time);

    return 0;
}

Я добавил третий цикл, «развернутый» четыре раза (более классическим способом).

Скомпилированные с gcc -O вот результаты.

0.030777 (regular)
0.016292 (unrolled twice)
0.008050 (unrolled 4)

Как видите, раскатывание очень эффективно. Результаты даже лучше, чем у вас, из-за оптимизации (-O). Без флагов оптимизации мы получаем

0.222738 (regular)
0.174113 (unrolled twice)
0.164410 (unrolled 4)

Различия уменьшаются, и, вероятно, это то, что вы добавили, но вы не должны измерять производительность без оптимизации кода.

5
задан AdamTheHutt 5 December 2008 в 20:19
поделиться

4 ответа

Я сказал бы, что это должно, вероятно, рассматриваться как 2 отдельных действия...

  1. представление формы (V-> C)
  2. обработка представления (C-> M)

Говоря в дженериках, я склонен думать как каждое действие как сообщение между разделами. Полный ряд сообщений был бы чем-то вроде этого...

  • Форма дисплея (C-> V)
  • Отправленный пользователем (V-> C)
  • Контент процесса (C-> M)
  • Законченная обработка (M-> C)
  • Результаты дисплея (C-> V)
4
ответ дан 13 December 2019 в 19:38
поделиться

Согласитесь с chills42, но добавили бы кое-что как как можно глубже погрузиться в модель.
Когда пользователь отправляет (V-> C), он будет отправлен какому-то контроллеру, и я считаю, что лучше всего, если контроллер будет действовать как диспетчер, чтобы решить, что произойдет дальше, возможно, на основе некоторые простые данные. Пусть у модели есть метод (обычно не основанный на ORM или активных записях), обрабатывающий необработанные данные и сохраняющий их в базе данных, если это необходимо, а затем просто возвращает статус или выдаёт ошибку.

3
ответ дан 13 December 2019 в 19:38
поделиться

Обработка форм должна происходить в модели, потому что это уровень приложения, которое получает и обрабатывает данные от контроллеров посредством представлений. Контроллер перемещает его, но что касается фактического выполнения кода, это должно происходить в ваших моделях.

1
ответ дан 13 December 2019 в 19:38
поделиться

Хотя поначалу идея использования V -> C, C -> M, M -> C выглядит хорошо, любое изменение формы требует испортить контроллер + модель + просмотр. Этого следует избегать, чтобы логика приложения оставалась простой. Вот очень простое расширение платформы, которое действительно упрощает обработку веб-форм, делегируя логику обработки формы отдельному классу и сохраняя архитектуру MVC для обработки логики приложения.

Для каждой формы, которую необходимо обработать, создайте класс, производный от общего класса «веб-формы» или класса модели codeigniter. Добавьте в этот класс такие методы, как validate (), process (), display ().

В контроллере код выглядит так.

class User_controller
{

    function login()
    {
        $form = new LoginForm(); // this is the class you would create
        if ($form->validate())
        {
            $data = $this->user_model->getUserData( $form->userid );
            // form processing complete, use the main "user" model to fetch userdata for display,
            // or redirect user to another page, update your session, anything you like
        } else {
            $form->display();
        }
    }
}

Метод отображения в классе формы загружает собственное представление и заполняет данные обратной публикации по желанию. Использование вышеизложенного дает несколько преимуществ:

  • Вам не нужно менять свой главный контроллер, если требуется изменить отображение или обработку формы.

  • Вам также не нужно менять модель пользователя

  • Контроллер остается чистым и обрабатывает логику главной страницы

  • Модель пользователя остается чистой и взаимодействует только с базой данных

Сама структура может быть обновлена, чтобы веб-формы можно загрузить с помощью

$ this-> load-> form ("login"); ......

Однако это только предложение, которое полезно для команды codeigniter.

3
ответ дан 13 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: