Лучший способ представить/оптимизировать веб-сайт на Google App Engine

В Path :: Tiny есть метод touch, а остальное - для разбиения желаемого диапазона дат. Обратите внимание, что приведенный ниже скрипт создает файлы (по умолчанию 10) с очень простыми именами, поэтому, пожалуйста, запускайте в совершенно новом каталоге, чтобы не перезаписывать что-либо не работает, поскольку spew возвращает истину / ложь, а не объект. (touch действительно возвращает объект, и поэтому он может иметь методы, связанные с ним, но здесь он должен идти после spew, поскольку spew изменяет время модификации.)

Выше создаются файлы [ 1123]

-rw-rw-r--. 1 xxx 8 Jul 31  2016 s1.txt
-rw-rw-r--. 1 xxx 8 Mar  1  2017 s2.txt
-rw-rw-r--. 1 xxx 8 Sep 30  2017 s3.txt
-rw-rw-r--. 1 xxx 8 May  1  2018 s4.txt
-rw-rw-r--. 1 xxx 8 Nov 30  2018 s5.txt

Возможно, вы захотите поиграть с размером шага и отметками времени первого / последнего времени.


Очевидно, что есть проблема с Time::Piece, которая, вероятно, указывает на проблему с этой системой & dagger; sup>, поскольку модуль находится в ядре с 5.9.5. Тогда я бы использовал Time::Local::timelocal

use Time::Local;    
my $seconds_epoch = timelocal $sec, $min, $hour, $mday, $mon, $year;

, где $mday идет от 1, а все остальные начинаются с 0. Обратите внимание, что, хотя традиционно указывается год с учетом +1900 (то есть 116 для 2016 года), нормальные годы также принимаются. Так

$beg = timelocal 0, 0, 0,  1,  0, 2016;
$end = timelocal 0, 0, 0, 31, 11, 2018;

или, для большей гибкости с датами

($beg, $end) = map { 
    ($yr, $m, $d) = unpack "A4A2A2"; 
    timelocal 0, 0, 0, $d, $m-1, $yr 
} (20160101, 20181231)

& dagger; sup> & thinsp; Проблема пропавшего Time::Piece описана в этого поста в блоге Дэйва Кросса . Также смотрите комментарии под вопросом и чат.

15
задан Denis T. 8 October 2019 в 11:38
поделиться

3 ответа

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

Gprof2Dot превращает вывод cProfile в симпатично выглядящий график с самой медленной цепочкой (?), выделенной, и немного информации о каждой функции (имя функции, процент времени тратят на эту функцию и количество вызовов).

График в качестве примера (1429x1896 пкс)

Я не сделал многого с Механизмом Приложения, но при профилировании сценариев невеб-приложения, я склонен представлять сценарий, который выполняет весь unittests, который не может быть очень с точностью до реальных ситуаций

Один (лучше?) метод должен был бы иметь сценарий, который делает поддельный запрос WSGI, затем представляет это.

WSGI является действительно простым протоколом, это - в основном функция, которая берет два аргумента, один с информацией о запросе и вторым с функцией обратного вызова (который используется для установки заголовков, среди прочего). Возможно, что-то как следующее (который является возможно рабочим псевдо кодом)...

class IndexHandler(webapp.RequestHandler):
    """Your site"""
    def get(self):
        self.response.out.write("hi")

if __name__ == '__main__':
    application = webapp.WSGIApplication([
        ('.*', IndexHandler),
    ], debug=True)

    # Start fake-request/profiling bit
    urls = [
        "/",
        "/blog/view/hello",
        "/admin/post/edit/hello",
        "/makeanerror404",
        "/makeanerror500"
    ]

    def fake_wsgi_callback(response, headers):
        """Prints heads to stdout"""
        print("\n".join(["%s: %s" % (n, v) for n, v in headers]))
        print("\n")

    for request_url in urls:
        html = application({
        'REQUEST_METHOD': 'GET',
        'PATH_INFO': request_url},
        fake_wsgi_callback
        )
        print html

На самом деле документация Механизма Приложения объясняет лучший способ представить Ваше приложение:

Из http://code.google.com/appengine/kb/commontasks.html#profiling:

Для профилирования производительности приложения сначала переименуйте приложение main() функция к real_main(). Затем добавьте новую основную функцию к своему приложению, названному profile_main() такой как тот ниже:

def profile_main():
    # This is the main function for profiling 
    # We've renamed our original main() above to real_main()
    import cProfile, pstats
    prof = cProfile.Profile()
    prof = prof.runctx("real_main()", globals(), locals())
    print "<pre>"
    stats = pstats.Stats(prof)
    stats.sort_stats("time")  # Or cumulative
    stats.print_stats(80)  # 80 = how many to print
    # The rest is optional.
    # stats.print_callees()
    # stats.print_callers()
    print "</pre>"

[...]

Для включения профилирования с приложением установить main = profile_main. Для запуска приложения как нормального просто установите main = real_main.

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

Сайт Python перечислил 3 профилировщиков для выбора из: http://docs.python.org/library/profile.html

1
ответ дан 1 December 2019 в 02:55
поделиться

Для профилирования вызовов API Guido van Rossum выпустил библиотеку Appstats, которая запишет и отобразит много хорошего о вашем приложении.

Библиотеку можно получить здесь: https://sites.google.com/site/appengineappstats/

Я написал статью об этом в своем блоге (с несколькими скриншотами): http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

Appstats http://blog.dantup.com/pi/appstats_4_thumb.png

3
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

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