Kohana - куда Вы помещаете сценарии Ajax?

Я провел несколько тестов производительности, используя различные методы:

Вот результаты, которые я получил для 1000000 перемешиваний:

188A1AA0P001 usefString 0.518183742
188A1AA0P001 useMap     1.415851829
188A1AA0P001 useConcat  0.5654986979999999
188A1AA0P001 useFormat  0.800639699
188A1AA0P001 useJoin    0.5488918539999998

на основе этого, кажется, что строка формата с жестко закодированными подстроками быть самым быстрым.

Вот код, который я использовал для тестирования:

def usefString(s): return f"{s[5:8]}{s[0]}{s[4]}{s[1:4]}{s[8:]}"

posMap = [5,6,7,0,4,1,2,3,8,9,10,11]
def useMap(s): return "".join(map(lambda i:s[i], posMap))

def useConcat(s): return s[5:8]+s[0]+s[4]+s[1:4]+s[8:]

def useFormat(s): return '{}{}{}{}{}'.format(s[5:8],s[0],s[4],s[1:4],s[8:])

def useJoin(s): return "".join([s[5:8],s[0],s[4],s[1:4],s[8:]])

from timeit import timeit
count = 1000000
s = "AAA01188P001"

t = timeit(lambda:usefString(s),number=count)
print(usefString(s),"usefString",t)

t = timeit(lambda:useMap(s),number=count)
print(useMap(s),"useMap",t)

t = timeit(lambda:useConcat(s),number=count)
print(useConcat(s),"useConcat",t)

t = timeit(lambda:useFormat(s),number=count)
print(useFormat(s),"useFormat",t)

t = timeit(lambda:useJoin(s),number=count)
print(useJoin(s),"useJoin",t)

Производительность : (добавлено @jezrael)

N = 1000000
OrderProduct = pd.DataFrame({'OrderProductId':['AAA01188P001'] * N})

In [331]: %timeit [f'{s[5:8]}{s[0]}{s[4]}{s[1:4]}{s[8:]}' for s in OrderProduct['OrderProductId']]
527 ms ± 16.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [332]: %timeit [s[5:8]+s[0]+s[4]+s[1:4]+s[8:] for s in OrderProduct['OrderProductId']]
610 ms ± 18.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [333]: %timeit ['{}{}{}{}{}'.format(s[5:8],s[0],s[4],s[1:4],s[8:]) for s in OrderProduct['OrderProductId']]
954 ms ± 76.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [334]: %timeit ["".join([s[5:8],s[0],s[4],s[1:4],s[8:]]) for s in OrderProduct['OrderProductId']]
594 ms ± 10.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
8
задан hakre 29 October 2012 в 08:01
поделиться

8 ответов

Я не использую Kohana, но что я делаю в своей платформе, то, что сценарии Ajax являются контроллерами. Я пытаюсь рассматривать их как автономные контроллеры, но в конце они - просто контроллеры.

1
ответ дан 3 November 2019 в 14:03
поделиться

Я склонен помещать свои ajax действия в тот же контроллер как non-ajax действия для любой данной модели.

Когда я могу, я попытаться использовать те же действия и только изменить выходной тип. Большинство задач должно иметь non-ajax версию так или иначе, таким образом, это имеет тенденцию работать вполне хорошо. Очень удобный для сокращения логического дублирования.

9
ответ дан 3 November 2019 в 14:03
поделиться

Ajax пересекает все границы MVC. Таким образом, это не входит только в одну из модели, представления или контроллера.

  • Ваши сценарии Ajax будут сценариями выполнения вызова на Вашем сайте - таким образом, это включило бы раздел Вашего слоя контроллера, который Вы создали для цели.
  • Тот контроллер в свою очередь получил бы доступ к базе данных с помощью интерфейса, обеспеченного образцовым слоем, так же, как запрос не-Ajax будет.
  • Данные для ответа назад клиенту могут быть упакованы как JSON или XML или что-то. Технически это - задача Вашего слоя представления, хотя, если определением Вашего приложения слоя представления является не что иное как "система шаблонной обработки HTML", а не "обработка и форматирование чего-нибудь, что передают обратно клиенту, является ли это HTML или чем-то еще как XML" затем, Ваш XML или поколение JSON, возможно, должны войти в новый небольшой собственный раздел.

Что касается отправки сценариев (файлы JavaScript) сами, это, вероятно, будет обработанным непосредственно веб-сервером, а не из Вашей платформы MVC.

7
ответ дан 3 November 2019 в 14:03
поделиться

Вы делаете различные контроллеры для, ДОБИРАЮТСЯ и запросы POST? Я не делаю. По-моему, с запросами JS нельзя иметь дело по-другому также.

Я лично вижу запросы JS точно так же, как ДОБИРАЮТСЯ, POST или любой другой тип запроса. Таким образом, если у меня есть связанные с пользователем основанные на JS действия, я просто создаю их в пользовательском контроллере.

5
ответ дан 3 November 2019 в 14:03
поделиться

Если Вы имеете в виду Ajax (JavaScript) сами сценарии, они должны войти в Вашу public/js папку. Однако, если Вы имеете в виду действия, вызванные этими запросами Ajax, их нужно рассматривать как любые другие действия соответствующих контроллеров. Чтобы быть АБСОЛЮТНО УСПОКОИТЕЛЬНЫМИ, необходимо использовать другой формат (json, xml, и т.д.) как возвращаемые значения для тех действий.

2
ответ дан 3 November 2019 в 14:03
поделиться

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

Кроме того, то, когда я использую Опоры, я могу украсить действие @jsonify, и это будет автоматически заботиться о преобразовании Python, возражает против JSON.Очень удобно.

1
ответ дан 3 November 2019 в 14:03
поделиться

Мне нравится хранить все мои запросы ajax в одном контроллере, обычно отправляя их через общий ресурс модель (которую также использует не ajax-контроллер)

Основным отличием является представление, которое получается через ajax-контроллер (фрагменты html, данные json и т. д.) или не-ajax-контроллер (полные страницы)

1
ответ дан 3 November 2019 в 14:03
поделиться

Вы можете завернуть его как обычный REST-api, и использовать RESTful конвенции и URI. Пример:

Вместо index.php/ajax/editprofile это может быть PUT-запрос на index.php/api/profile/profilename

.
0
ответ дан 3 November 2019 в 14:03
поделиться
Другие вопросы по тегам:

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