2008-11-18 3 views
3

Google app engine сообщает мне оптимизировать этот код. Кто-нибудь знает, что я могу сделать?Оптимизация кода приложения Google

def index(request): 
    user = users.get_current_user() 
    return base.views.render('XXX.html', 
       dict(profiles=Profile.gql("").fetch(limit=100), user=user)) 

А позже в шаблоне я:

{% for profile in profiles %} 
    <a href="/profile/{{profile.user.email}}/"><img src="{{profile.gravatarUrl}}"></a> 
    <a href="/profile/{{profile.user.email}}/">{{ profile.user.nickname }}</a> 
    <br/>{{ profile.shortDisplay }} 

Где используемые методы:

def shortDisplay(self): 
    return "%s/day; %s/week; %s days" % (self.maxPerDay, self.maxPerWeek, self.days) 

def gravatarUrl(self): 
    email = self.user.email().lower() 
    default = "..." 
    gravatar_url = "http://www.gravatar.com/avatar.php?" 
    gravatar_url += urllib.urlencode({'gravatar_id':hashlib.md5(email).hexdigest(), 
     'default':default, 'size':"64"}) 
    return gravatar_url 

ответ

3

Я бы предположил, что выполняя md5 хэш по каждому пункту, каждый раз, когда довольно дорогостоящий. Лучше хранить хэши электронной почты gravatar где-то.

+0

10x! Я получал предупреждение, прежде чем я представил Md5. – 2008-11-18 09:18:17

+0

Код md5 является нативным, поэтому я бы не ожидал значительных накладных расходов одной суммы md5 по короткой строке. – 2008-11-19 10:30:52

6

Высокое использование ЦП будет связано с получением 100 объектов на запрос. У вас есть несколько вариантов здесь:

  • Использование Profile.all(). Fetch (100) будет когда-либо настолько быстрым и более легким для чтения.
  • Удалите любые посторонние свойства из модели профиля. Существуют значительные десериализующие сущности на основе свойств.
  • Показать меньше пользователей на странице.
  • Сохраните выходные данные этой страницы в memcache и визуализируйте из memcache всякий раз, когда сможете. Таким образом, вам не нужно часто создавать страницу, поэтому это не имеет большого значения, если это высокий процессор.
0

Это зависит от того, где вы получаете предупреждение о слишком большом количестве CPU.

Это на приборной панели, вероятно, много процессорного хранилища данных, нет необходимости в оптимизации.

Если запрос занимает более 10 секунд, вам необходимо его оптимизировать.

Если вы получаете регулярные предупреждения журнала о том, что определенный запрос равен x.xx над пределом ЦП, это означает, что ваш код приложения занимает слишком много времени. И нуждается в оптимизации.

Я обнаружил, что много шаблонов Django не занимает много приложений CPU (50-100 Mcycle). Если все поля для шаблона предварительно вычислены.

1

У меня возникла проблема с большим количеством процессора, используемого для кажущейся небольшой работы, которая, как оказалось, была запущена несколько раз. Например. В моем шаблоне Django я опубликовал post.comments.count, а затем зациклился на сайтах post.com. Это привело к двум казням: один получает счет, а другой получает объекты. К сожалению!

Я также скажу, что захватил копию Appstats Guido. Это не поможет с Python, но очень полезно увидеть время, затрачиваемое на вызовы API (и время между ними, что часто дает указание на то, где у вас медленный Python).

Вы можете получить библиотеку здесь: 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

Смежные вопросы