3

谷歌应用引擎告诉我优化这段代码。有人知道我能做什么吗?

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
4

4 回答 4

6

高 CPU 使用率是由于每个请求获取 100 个实体。您在这里有几个选择:

  • 使用 Profile.all().fetch(100) 会稍微快一点,而且更容易阅读。
  • 从 Profile 模型中删除任何无关的属性。反序列化实体的每个属性开销很大。
  • 每页显示更少的用户。
  • 将此页面的输出存储在 memcache 中,并尽可能从 memcache 中渲染。这样,您就不需要经常生成页面,所以如果它是高 CPU 也没关系。
于 2008-11-18T11:03:59.980 回答
3

我猜想每次对每个项目执行 md5 哈希是非常昂贵的。最好将 gravatar 电子邮件哈希存储在某处。

于 2008-11-18T09:03:47.493 回答
1

我遇到了一个问题,即大量 CPU 用于看似很少的工作,结果证明不是多次运行的查询。例如。在我的 Django 模板中,我执行了 post.comments.count,然后循环访问了 post.comments。这导致了两次执行——一次获得计数,一次获得实体。哎呀!

我还要说拿一份 Guido 的 Appstats。它对 Python 没有帮助,但是查看 API 调用所花费的时间(以及它们之间的时间——这通常表明你在哪里遇到了慢速 Python)非常有用。

您可以在此处获取该库:https ://sites.google.com/site/appengineappstats/

我在我的博客上写了一篇关于它的文章(附有一些截图):http ://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

应用统计 http://blog.dantup.com/pi/appstats_4_thumb.png

于 2010-01-03T18:50:42.397 回答
0

这取决于您在哪里收到过多 CPU 的警告。

是不是在dashboard里,大概是很多datastore CPU,不需要优化。

如果请求需要超过 10 秒,则需要优化。

如果您收到定期日志警告,指出某个请求的 x.xx 超过 CPU 限制,则意味着您的应用程序代码花费的时间太长。并且需要优化。

我发现很多 Django 模板的东西并不占用很多应用程序 CPU(50-100 Mcycle)。如果模板的所有字段都已预先计算。

于 2008-12-27T11:42:45.670 回答